2016-07-18 7 views
0

MQキューからメッセージを読み取り、別のキューに書き込むvb.netコードがあります。MQを持つTransactionScope - 読み取りと書き込みメッセージ

これはトランザクション(using New TransactionScope())でこれを行います。したがって、書き込みが失敗した場合、読み取りはロールバックされます。

問題は、.Netプログラムを閉じるとトランザクションがコミットするように見えることです。

MQエクスプローラを使用すると、メッセージの移動が確認され、.netプログラムが終了するまで(メッセージは新しいキューに残っています)、キューステータスに "Uncommitted Messages: Yes"と表示されます。別のプログラム(IIB)によってキューから削除されます。

したがって、TransactionScopeは処分されていないようです。なぜ私は考えられないのですか?私はMQエクスプローラーで何を参照してください。ここ

' MQMessageDetails is just a data-storage class for message data 
Friend Function MoveMessages(messages as IEnumerable(of MQMessageDetails)) 
    For Each msg in messages 
     Try 
     Using ts As New TransactionScope() 
      success = WriteMessage(msg, "Q.OUT") 
      success = success and ReadMessage(msg) 
      If success Then 
       ts.Complete() 
      End If 
     End Using 
     Catch .... 
     End Try 
    Next 
End Function 

とです::

WPFは、ボタンが押されたコマンドを呼び出すには、次の方法(簡易)を呼び出します。

ここに関連するコードです

**Before program start** 
Q.IN - depth 2, no uncommitted messages 
Q.OUT - depth 0, no uncommitted messages 

**Move button clicked** 
Q.IN - depth 1, 1 uncommitted message 
Q.OUT - depth 1, 1 uncommitted message 

**Program closed** 
Q.IN - depth 1, no uncommitted messages 
Q.OUT - depth 0, no uncommitted messages <- the message was read by another program 
+0

成功したら...句でmq commitを発行しようとしましたか? – IanB

+0

いいえ、トランザクションスコープを使用しているので、私はそれをしなければならないと思いませんでした(自動で処理する必要がありますか?) – simonalexander2005

+0

どのMQクライアントのバージョンを使用していますか? – Shashi

答えて

1

MQSeriesの観点からは、.NET TransactionScopeは外部的に調整されたトランザクションです。 MQは特定の状況下でのみ外部調整型取引に参加します。

クライアント環境でテストするときはMQ Commitが必要ですが、本番サーバーではテストしない場合があります。詳細については

はこれを見て:

https://www.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.pro.doc/q003570_.htm

http://www.mqseries.net/phpBB2/viewtopic.php?t=49148

とIBM赤図書(ただし日付)は常に良いの読み取りです:

http://www.redbooks.ibm.com/redbooks/pdfs/sg247012.pdf

+0

Programfiles/WebsphereMQ/tools/dotnet/samples/cs/base/SimpleXAPut/SimpleXAPut.csは、.NETのTransactionScopeオブジェクトを使用するIBM提供のサンプルであるため、使用する必要があります。 – simonalexander2005

+0

はい、それです可能だ。 – IanB

+0

答えの2番目のリンクは、「serversideを実行している場合、またはETC(Extended Transactional Client)を使用している場合のみ」と表示されます。私は見ることができるから、ETCは7.5に含まれるべきで、それでうまくいくはずですか? – simonalexander2005

関連する問題