我正在编写一个 Windows 服务,它从 MSMQ 中提取消息并将它们发布到遗留系统 (Baan)。如果发帖失败或发帖过程中机器宕机,我不想丢失消息。因此,我使用 MSMQ 事务。失败时我中止,成功时我承诺。
在处理本地队列时,此代码运行良好。但在生产中,我希望将运行服务的机器(或机器)与队列本身分开。当我针对远程队列进行测试时,抛出 System.Messaging.MessageQueueException:“事务使用无效。”
我已验证有问题的队列是事务性的。
这是从队列接收的代码:
// Begin a transaction.
_currentTransaction = new MessageQueueTransaction();
_currentTransaction.Begin();
Message message = queue.Receive(wait ? _queueTimeout : TimeSpan.Zero, _currentTransaction);
_logger.Info("Received a message on queue {0}: {1}.", queue.Path, message.Label);
WORK_ITEM item = (WORK_ITEM)message.Body;
return item;
回答
我已经切换到SQL Service Broker。它支持远程事务接收,而 MSMQ 3.0 不支持。而且,作为额外的奖励,它已经使用了我们集群和备份的 SQL Server 实例。