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