8

我正在编写一个 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 实例。

4

5 回答 5

5

我留下了一条评论,询问您正在使用的 MSMQ 版本,因为我认为这是您的问题的原因。事务接收未在早期版本的 MSMQ 中实现。如果是这种情况,那么这篇文将解释您的选择。

于 2008-09-25T14:26:12.100 回答
3

如果 MSDTC 在两台机器上都运行,则使用 TransactionScope 应该可以工作。

MessageQueue queue = new MessageQueue("myqueue");
using (TransactionScope tx = new TransactionScope()) {
    Message message = queue.Receive(MessageQueueTransactionType.Automatic);
    tx.Complete();
}
于 2008-09-25T14:23:49.813 回答
0

我已经切换到SQL Service Broker。它支持远程事务接收,而 MSMQ 3.0 不支持。而且,作为额外的奖励,它已经使用了我们集群和备份的 SQL Server 实例。

于 2008-10-07T13:56:34.657 回答
0

为了使用事务范围,您必须在验证 MSDTC 已安装且远程客户端连接已激活之前。

安装 MSDTC 不是问题,但激活远程客户端连接必须导致服务器重新启动(在 windows server 2003 上就是这种情况)。

也许这篇文章可以帮助你: 如何激活 MSDTC 和远程客户端连接

于 2008-12-19T10:55:42.797 回答
0

避免使用远程 MSMQ(否则升级到 MSMQ 4.0 以支持远程 MSMQ 事务)。1) 或者,您可以创建一个 Web 服务来推送消息 2) 为交易目的创建本地 MSMQ 3) 创建具有捆绑(批次)编号和消息编号的小型实用程序...一旦批处理失败,请删除目标处的消息,否则请执行此操作作为交易范围

于 2010-11-16T09:41:45.660 回答