1

我需要在一个事务中接收、处理和发送消息。由于 MSMQ 不支持事务性远程接收,因此我使用 DTC。现在,我什至无法收到消息。这是我使用的代码:

string queueName = "trxwrite";
string serverName = "mqtest";

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
{
    MessageQueue mq = new MessageQueue(string.Format(@"FormatName:DIRECT=OS:{0}\{1}", serverName, queueName));
    mq.Formatter = new XmlMessageFormatter(new[] {typeof (string)});

    Message message = mq.Receive(MessageQueueTransactionType.Automatic);
    ts.Complete();
}
  • 队列是事务性的。
  • DTC 在服务器上启用mqtest 并配置为允许入站和出站。
  • 防火墙设置为允许所有 MSMQ 和 DTC 请求。

我收到以下错误消息:无法导入交易。任何人都可以帮忙吗?此外,我的客户端计算机如何知道它应该使用服务器上的 DTC 进行事务处理?无法从我到目前为止找到的样本中分辨出来......

4

1 回答 1

0

显然,必须安装和配置 DTC 以允许客户端和服务器上的网络访问。这样,这个片段就可以正常工作:

string queueName = "trxwrite";
string queue2Name = "trxread";
string serverName = "mqtest";
Parallel.For(0, 300, (int i) =>
                        {
                            using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
                            {
                                MessageQueue mq = new MessageQueue(string.Format(@"FormatName:DIRECT=OS:{0}\{1}", serverName, queueName));
                                mq.Formatter = new XmlMessageFormatter(new[] { typeof(DateTime) });

                                Message message = mq.Receive(MessageQueueTransactionType.Automatic);
                                DateTime createDt = (DateTime)message.Body;

                                MessageQueue mq2 = new MessageQueue(string.Format(@"FormatName:DIRECT=OS:{0}\{1}", serverName, queue2Name));
                                mq2.Formatter = new XmlMessageFormatter(new[] { typeof(DateTime) });

                                Message messageToSend = new Message(createDt);
                                mq2.Send(messageToSend, MessageQueueTransactionType.Automatic);

                                ts.Complete();
                            }
                        });
于 2015-04-24T10:33:46.293 回答