根据我的理解,NServiceBus在事务中执行IMessageHandler的Handle方法,如果异常传播出该方法,则NServiceBus将确保消息被放回消息队列(在错误队列之前上升X次)等.所以我们有一个原子操作可以这么说.
现在,如果我在NServiceBus Message Handle方法中,我会做这样的事情
using(var trans = session.BeginTransaction())
{
person.Age = 10;
session.Update<Person>(person);
trans.Commit()
}
using(var trans2 = session.BeginTransaction())
{
person.Age = 20;
session.Update<Person>(person);
// throw new ApplicationException("Oh no");
trans2.Commit()
}
Run Code Online (Sandbox Code Playgroud)
这对交易范围有什么影响?就其与Nservicebus交易的关系而言,trans1现在被视为嵌套交易,即使我们没有做任何事情来嫁给他们吗?(如果不是如何链接到NServiceBus的交易?
查看第二个块(trans2),如果我取消注释throw语句,那么NServiceBus事务是否也会回滚trans1?在基本场景中,假设我将上述内容转储到控制台应用程序中,则trans1是独立的,提交,刷新且不会回滚.我想澄清现在我们坐在像NServiceBus这样的其他交易中会发生什么?
以上只是示例代码,我不会直接使用session,更像是通过uow模式.
Udi 在这里提到"人们已经换掉了NServiceBus的MSMQ层并插入了RabbitMQ".
我希望能够在最终目标上做同样的事情,即能够使用AMQP在Mono/Linux上运行使用NServiceBus构建的应用程序.
在潜入之前,虽然我想从可能已经做过这方面的人那里得到一些反馈,以避免陷阱,红鲱鱼等.
或者,如果方法是一项艰巨的任务,最好直接使用RabbitMQ,但如果可能的话,我想坚持使用NServiceBus.
NServiceBus是ESB还是轻量级ESB?或者它更像是具有持久/可靠消息传递的WCF?它看起来更像是一个消息框架而不是ESB.
只是想要一些指针,因为我刚刚开始研究不同的ESB产品以及它们能够做什么或不做什么.
NServiceBus 2.0中的IHandleMessages<T>vs有什么IMessageHandler<T>意义?
一个接口派生自另一个接口,并且似乎没有在T上添加任何新方法或新约束.有可能一个是标记接口,但在评论中没有证据.
我正在研究像NServiceBus这样的.net的ESB事件,有人可以强调哪些现实世界的业务问题可以解决(忘记技术优势)?这用于集成不同的系统.
我在这里写这篇文章是希望有人可以帮助我.
我试图NServiceBus在ASP.NET MVC应用程序上实现.我已经完成了每一步,以确保一切正常.我有一个事件将Job ID传递给我的处理程序,然后执行Linq-to-Sql查询并查找作业,然后通过电子邮件发送警报.这个过程非常简单.
但是,我不能为我的生活让MSDTC工作.我继续收到以下错误:
以下是我配置总线的方法:
Bus = NServiceBus.Configure.WithWeb()
.Log4Net()
.DefaultBuilder()
.XmlSerializer()
.MsmqTransport()
.IsTransactional(false)
.PurgeOnStartup(false)
.UnicastBus()
.ImpersonateSender(false)
.CreateBus()
.Start();
Run Code Online (Sandbox Code Playgroud)
我没有使用事务,所以我知道甚至不应该调用MSDTC.
我的处理程序代码如下:
public void Handle(ApplyJobMessage message)
{
if (message != null)
{
using(var context = new MyContext())
{
JobPosting posting = (from c in context.JobPostings
where c.JobPostingId == message.JobId
select c).SingleOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
端点配置如下:
public class MessageEndpoint : IConfigureThisEndpoint, AsA_Server, IWantToRunAtStartup
Run Code Online (Sandbox Code Playgroud)
一切都很好.当我这样做时,消息正确到达:
Bus.Send(message);
Run Code Online (Sandbox Code Playgroud)
但是,MSDTC错误发生如下所示:
2011-01-20 00:55:09,744 [Worker.5] ERROR NServiceBus.Unicast.UnicastBus [(null)]
<(null)> - JobApplicationHandler Failed handling message.
System.Runtime.InteropServices.COMException (0x8004D02A): The MSDTC …Run Code Online (Sandbox Code Playgroud) 是否有任何NServiceBus等效于Java?我不是在寻找更复杂的东西,甚至Mule ESB似乎对我的需求来说太过分了.
我在App.config中看到了MessageEndpointMappings部分,它让我感到困惑.
有时它看起来像是一个客户端来订阅另一个队列(就像这个一样):
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="MyServiceBus.MessageHub.Contracts" Endpoint="MessageHub"/>
</MessageEndpointMappings>
</UnicastBusConfig>
Run Code Online (Sandbox Code Playgroud)
但有时它似乎用于配置到其他队列的传出消息:
<UnicastBusConfig>
<MessageEndpointMappings>
<add Messages="ServiceBus.MessageHub.InternalMessages" Endpoint="MessageHub"/>
</MessageEndpointMappings>
</UnicastBusConfig>
Run Code Online (Sandbox Code Playgroud)
但实际上,两者之间没有区别. 那么它如何知道何时设置订阅以及何时设置发送消息?
或者它是否真的一直在做,我只是不使用两者?
使用NServiceBus + RabbitMQ对纯RabbitMQ有什么好处?我想它提供了额外的基础设施.但还有什么?
我有一个在Windows 2003服务器上运行良好的现有应用程序.我一直在将它移动到Windows 2008r2,当应用程序试图访问队列时,它得到以下错误?我的应用程序池的Indentity用户可以完全控制我的消息队列.有没有人对如何解决这个问题有任何想法.我相信这是服务器配置问题.
[MessageQueueException (0x80004005): Access to Message Queuing system is denied.]
System.Messaging.MQCacheableInfo.get_ReadHandle() +221
System.Messaging.MessageEnumerator.get_Handle() +70
System.Messaging.MessageEnumerator.MoveNext(TimeSpan timeout) +93
System.Messaging.MessageQueue.GetAllMessages() +58
NServiceBus.Unicast.Subscriptions.Msmq.MsmqSubscriptionStorage.Init(IList`1 messageTypes) +124
NServiceBus.Unicast.UnicastBus.Start(Action`1[] startupActions) +674
Connector.Service.InitBus() +201
Connector.OutgoingService..cctor() +9
Run Code Online (Sandbox Code Playgroud) nservicebus ×10
.net ×3
esb ×2
msmq ×2
rabbitmq ×2
amqp ×1
c# ×1
java ×1
msdtc ×1
nhibernate ×1
transactions ×1