带有MQ的TransactionScope - 读写消息

时间:2016-07-18 15:03:08

标签: vb.net ibm-mq transactionscope

我有一段vb.net代码,它从MQ队列中读取消息并将其写入另一个队列。

它在事务(using New TransactionScope())中执行此操作,因此如果写入失败,则将回滚读取。

问题是,一旦我关闭.net程序,事务似乎只会提交。

使用MQ Explorer,我看到消息移动,然后在队列状态中显示“Uncommitted Messages: Yes”(并且消息保留在新队列中),直到.net程序关闭 - 此时消息由另一个程序(IIB)从队列中读取。

所以,在我看来TransactionScope没有被处理;但我想不出原因。

以下是相关代码:

WPF在按下按钮时调用命令,调用以下方法(简化):

' 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

以下是我在MQ资源管理器中看到的内容:

**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

1 个答案:

答案 0 :(得分:1)

从MQSeries的角度来看,.NET TransactionScope是一个外部协调的事务。 MQ在某些情况下只会参与外部协调的交易。

e.g。您可能会发现在客户端环境中进行测试时需要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