"MessageQueueReceive"というクラスにこれを格納しています。トランザクションでMSMQ受信 - ロールバックでメッセージを再利用できない
public MessageQueueTransaction BlockingReceive(out Message message)
{
MessageQueueTransaction tran = null;
message = null;
tran = new MessageQueueTransaction();
tran.Begin();
try
{
message = Queue.Receive(new TimeSpan(0, 0, 5), tran);
}
catch (MessageQueueException ex)
{
// If the exception was a timeout, then just continue
// otherwise re-raise it.
if (ex.MessageQueueErrorCode != MessageQueueErrorCode.IOTimeout)
throw ex;
}
return tran;
}
その後、私の処理ループが、このあります: -
while (!Abort)
{
try
{
tran = this.Queue.BlockingReceive(out msg);
if (msg != null)
{
// Process message here
if (tran != null)
tran.Commit();
}
}
catch (Exception ex)
{
if (tran != null)
tran.Abort();
}
}
コントロールパネルツールは、私が使用しているメッセージキューがトランザクションであることを示しています。ジャーナルキューが有効になっていません。
このコードでは、キューを作成します - これが呼ばれたとき
private static MessageQueue CreateMessageQueue(string queueName, bool transactional = false)
{
MessageQueue messageQueue = MessageQueue.Create(queueName, transactional);
messageQueue.SetPermissions("Administrators", MessageQueueAccessRights.FullControl,
AccessControlEntryType.Allow);
return messageQueue;
}
トランザクションのパラメータが「真」に設定されています。私が見つける何
は、例外は、メッセージの処理中に発生した場合に、tran.Abortが呼び出されるということですが、その時点で私は、メッセージがキューに戻されることを期待したいです。しかし、これは起こっておらず、メッセージは失われています。
明らかなものがありませんか?誰かが私が間違っているのを見ることができますか?
受信しているキューはリスナーサービスのローカルにありますか? –
はい、送受信プロセスとキューはすべて同じボックスにあります。それらはプライベートキューです。また、同じコードをいくつかの異なるボックスで実行し、すべて同じ問題を参照してください。これは、マシンに関する奇妙なものではなく、このコードに関連していることを示唆しています。 – JohnCC
明白な質問でしょう。中断して例外を叩いていると確信していますか?捕捉された後で投げ捨てられるメッセージ処理コードに例外がスローされた可能性はありますか? –