我写Windows服务,拉的消息,从内容和职位,他们的遗留系统(班).如果后失败或机停在后,我不想失去的信息。因此,我利用内容的交易。我中止对失败,以及我提交上取得成功。

当工作对当地的队列,这种代码效果很好。但在生产中我将要单独的机器(或机)运行服务的队列本身。当我试对一个遥远的队列,一个系统。消息。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服务的经纪人.它支持远程交易接收,而内容的3.0不。而且,作为一个额外的奖励,这已经使用SQL服务器的实例,我们的集群和回。

有帮助吗?

解决方案

我发表评论询问您正在使用的MSMQ版本,因为我认为这是导致问题的原因。事务接收未在早期版本的MSMQ中实现。如果是这种情况,则博客文章解释了您的选择。

其他提示

使用TransactionScope应工作提供MSDTC上运行这两个机。

MessageQueue queue = new MessageQueue("myqueue");
using (TransactionScope tx = new TransactionScope()) {
    Message message = queue.Receive(MessageQueueTransactionType.Automatic);
    tx.Complete();
}

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

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

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

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

Aviod使用远程MSMQ(另外升级到MSMQ 4.0以支持远程MSMQ事务)。 1)或者,您可以创建一个Web服务来推送消息 2)创建本地MSMQ以进行交易 3)创建具有捆绑(批处理)编号和消息编号的小实用程序...批处理失败后删除目标处的消息,将其作为事务范围

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top