1

1 つのトランザクションでメッセージを受信、処理、送信する必要があります。MSMQ は Transactional Remote Receive をサポートしていないため、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 に答える