我是第一次使用NServiceBus,并且有一个小型、简单的应用程序,其中用户提交一个表单,然后将表单字段发送到队列,处理程序收集这些数据并使用linq- to -sql将其写入数据库。
就数据库管理员而言,组件服务中的任何更改都是完全禁止的,因此我现在正在寻找DTC的替代方案(在DB服务器上没有启用),但是使用AsA_Server,这样消息就不会被清除。
我尝试在IConfigureThisEndpoint之后删除AsA_Server并自己指定配置,但似乎不起作用(控制台出现,页面加载,但什么也没有发生,甚至不会在断点处停止)。AsA_Client确实可以工作,但据我所知,消息将在启动时被清除,这是我需要避免的。
有什么建议吗?
谢谢,
OMK
EDIT:现在已经解决了这个问题,方法是在suppress transaction作用域中包装对数据库的调用,这允许在没有环境事务的情况下完成数据库工作:
using (TransactionScope sc = new TransactionScope(TransactionScopeOption.Suppress))
{
// code here
sc.Complete();
} 发布于 2011-07-20 06:30:38
当您使用AsA_Server时,您指定了您想要的持久队列,并且您需要配置事务队列。
使用事务性发送/接收,MSMQ要求您将发送、传输、接收和处理作为一个事务的一部分。然而,实际上所有这些阶段都发生在自己的事务中。
例如,当发送者将消息发送到其本地MSMQ子系统时,发送事务就完成了(即使队列地址是远程的,发送者仍然将消息发送到充当远程队列的某种代理的本地队列)。
当发送者机器上的MSMQ子系统成功地将消息传输到接收者机器上的MSMQ子系统时,传输事务完成。
尽管这一切可能都发生在一台机器上,但我猜测您的Handle()方法正在向另一台机器上的数据库写入数据。
这里的问题是,为了从事务的角度令人满意地完成接收操作,您对数据库的调用必须成功。只有这样,消息才会从您的输入队列中出列。这可以防止消息在处理失败期间丢失。
但是,为了在整个网络中强制执行,您需要使用DTC来协调到数据库的分布式事务。
底线是,如果您希望在分布式环境中使用持久队列,那么您将需要使用MSDTC。
希望这能有所帮助。
发布于 2012-03-01 14:02:31
还有另一种选择。在您的连接字符串中,您可以添加不在分布式事务中登记的选项,这将在DTC中忽略您的DB连接。
当然,如果这是在配置中设置的,那么应用程序的所有数据库事务都会被DTC忽略,而不仅仅是特定的事务。
示例:
<add key="DatabaseConnectionString" value="Data Source=SERVERNAME;Initial Catalog=DBNAME;Integrated Security=True;Enlist=False"/>发布于 2013-10-28 15:48:57
使用NServiceBus 4.0,您现在可以执行以下操作,这终于对我起作用了:
Configure.Transactions.Advanced(t =>
{
t.DisableDistributedTransactions();
t.DoNotWrapHandlersExecutionInATransactionScope();
});https://stackoverflow.com/questions/6748170
复制相似问题