我有一个与MQ Queue transaction not rolling back in a 2 phase transaction 中描述的情况类似的问题。我有一个 .NET 客户端,它在一个事务中执行以下操作:
- 将一条记录写入第一个数据库。
- 将一条消息放入 IBM Websphere 8.0 MQ 系列队列。
- 使用 WS-AT 调用 Web 服务,如https://developers.redhat.com/quickstarts/eap/wsat-simple中所述。
- 将一条记录写入第二个数据库。
当 Web 服务回滚时,两个数据库回滚,但 IBM MQ Series 队列不回滚。当一个数据库出现故障时,IBM MQ Series 队列会回滚。
RestaurantTransactionPOC 方法在继承自 System.EnterpriseServices.ServicedComponent 的类中运行,也就是说,它在 COM+ 下运行。
下面是 RestaurantTransactionPOC 的代码:
Public Function RestaurantTransactionPOC(
uri As String, queueManager As String, queueName As String, textToWrite As String,
Optional failOnlRecvRep As Boolean = False,
Optional failGtsRecvRep As Boolean = False,
Optional failWSATService As Boolean = False,
Optional failMQSeries As Boolean = False) As String
Try
Dim result = ""
Dim msgId = GetMsgId()
Try
AddOnlRecvRep(msgId, failOnlRecvRep)
Catch ex As Exception
Debug.WriteLine(ex.ToString)
result &= ex.ToString & vbCrLf
End Try
Try
AddQueue(queueManager, queueName, msgId, failMQSeries)
Catch ex As Exception
Debug.WriteLine(ex.ToString)
result &= ex.ToString & vbCrLf
End Try
Try
ServicePointManager.SecurityProtocol = CType(SecurityProtocolType.Tls Or 768 Or 3072, SecurityProtocolType)
Dim client = CreateChannel(Of RestaurantServiceATChannel)(uri)
client.makeBooking()
Catch ex As Exception
Debug.WriteLine(ex.ToString)
result &= ex.ToString & vbCrLf
End Try
Try
AddGtsRecvRep(msgId, failGtsRecvRep)
Catch ex As Exception
Debug.WriteLine(ex.ToString)
result &= ex.ToString
End Try
ContextUtil.SetComplete()
Return result
Catch ex As Exception
ContextUtil.SetAbort()
Throw
End Try
End Function
Public Function CreateChannel(Of T)(uri As String) As T
binding = New CustomBinding(
New BindingElement() {
New TransactionFlowBindingElement(TransactionProtocol.WSAtomicTransaction11),
New TextMessageEncodingBindingElement() With {.MessageVersion = MessageVersion.Soap12},
New HttpsTransportBindingElement()})
binding.SendTimeout = New TimeSpan(0, 0, 30)
Dim endpoint As New EndpointAddress(uri)
Dim channelFactory = New ChannelFactory(Of T)(binding, endpoint)
Dim behavior = CType(channelFactory.Endpoint.Behaviors(1), ClientCredentials)
behavior.ClientCertificate.SetCertificate(
StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint,
"5f 82 82 e3 e9 20 fd ac 27 f5 cc 60 8a f5 8e 55 39 38 a0 30")
Return channelFactory.CreateChannel()
End Function
当 WS-AT makeBooking 服务回滚时,为什么 IBM MQ Series 队列不回滚?