我第一次使用NServiceBus并且有一个小的,简单的应用程序,用户提交表单,然后表单字段被发送到队列,处理程序收集这些数据并使用
linq-to-sql将其写入数据库.
就DBA而言,组件服务中的任何更改都是完全禁止的,所以我现在正在寻找DTC的替代方案(在数据库服务器上未启用),但是使用AsA_Server以便消息不会得到清除.
我已经尝试在IConfigureThisEndpoint之后删除AsA_Server并自己指定配置,但这似乎不起作用(控制台出现,页面加载但没有任何反应,它甚至没有在断点处停止.)AsA_Client确实有效,但据我了解消息将在启动时被清除,我需要避免.
有什么建议?
谢谢,
OMK
编辑:现在已经通过在禁止事务范围中使用包装对数据库的调用来解决这个问题,这允许在没有环境事务的情况下完成数据库工作以登记:
using (TransactionScope sc = new TransactionScope(TransactionScopeOption.Suppress)) { // code here sc.Complete(); }
解决方法
使用AsA_Server时,您指定需要持久队列,并且需要配置事务队列.
使用事务发送/接收MSMQ要求您作为一个事务的一部分发送,传输,接收和处理.然而,实际上所有这些阶段都发生在他们自己的交易中.
例如,当发送方将消息发送到其本地MSMQ子系统时,发送事务就完成了(即使队列地址是远程的,发送方仍然发送到本地队列,该队列充当远程队列的一种代理).
当发送方机器上的MSMQ子系统成功地将消息发送到接收机上的MSMQ子系统时,发送事务就完成了.
即使这可能都发生在一台机器上,我猜你的Handle()方法正在写入另一台机器上的数据库.
这里的问题是,从事务角度来看,要使接收操作满意地完成,您对数据库的调用必须成功.只有这样,消息才会从输入队列中退出.这可以防止在处理失败期间消息丢失的任何可能性.
但是,为了在整个网络中强制执行,您需要让DTC协调分布式事务到数据库.
最重要的是,如果您想在分布式环境中使用持久队列,那么您将需要使用MSDTC.
希望这可以帮助.