我有以下代码来获取队列信息,当作为事务的一部分完成时,它会引发 2232
错误:
Dim specificQMConnProperties As Hashtable = CType(queueManagerConnectionProperties.Clone(), Hashtable)
specificQMConnProperties.Add(MQC.HOST_NAME_PROPERTY, qmgrHostNameOrIP)
specificQMConnProperties.Add(MQC.PORT_PROPERTY, qmgrPort)
specificQMConnProperties.Add(MQC.CHANNEL_PROPERTY, qmgrChannel)
Dim qmgr As MQQueueManager = Nothing
Try
qmgr = New MQQueueManager(qmgrName, specificQMConnProperties)
Catch ex As MQException
Select Case ex.ReasonCode
Case 2059, 2538
' qmgr or host not available
Return nothing
Case Else
' continue
End Select
End Try
If qmgr IsNot Nothing Then
Try
' use PCF to get queue information.
Dim agent As New PCFMessageAgent(qmgr)
Dim request As New PCFMessage(CMQCFC.MQCMD_INQUIRE_Q)
request.AddParameter(MQC.MQCA_Q_NAME, queueName)
Dim responses As PCFMessage() = Nothing
Try
' connected
responses = agent.Send(request)
Catch pcfex As PCFException
LogException(pcfex, {queue}, "Exception checking queue availability via PCF. Assuming false")
Return Nothing
End Try
If responses IsNot Nothing AndAlso responses.Any() Then
LogDebug("Checking queue availability for " & queue.ToString() & " returned a PCF result.")
return responses
Else
LogError("No result returned from PCF Message request on " & queue.ToString())
Return Nothing
End If
Catch ex As MQException
LogException(ex, {queue})
Return False
End Try
End If
错误发生在responses = agent.Send(request)
行,如下:
Completion Code: 2, Reason Code: 2232(2232=MQRC_UNIT_OF_WORK_NOT_STARTED) at IBM.WMQ.MQDestination.Put(MQMessage message, MQPutMessageOptions pmo) at IBM.WMQ.PCF.PCFAgent.Send(Int32 command, PCFParameter[] parameters) at IBM.WMQ.PCF.PCFMessageAgent.Send(PCFMessage request, Boolean check) at IBM.WMQ.PCF.PCFMessageAgent.Send(PCFMessage request) at MyMethod
我的其余事务连接选项(例如用于消息获取或放置)附加了 Or MQC.MQGMO_SYNCPOINT
- 但我看不到如何设置 PCF 消息的连接选项。有人可以帮忙吗?
需要明确的是,我并不关心它是否作为事务的一部分发送,但由于 Transactionscope 已打开,所以我收到此错误。
--编辑--
我已在顶部添加了队列管理器连接的代码。
最佳答案
您收到此错误的事实表明您正在重用用于其他放入和获取的队列管理器的连接,因此它超出了用于该连接的事务范围,或者即使建立的新连接也会影响您环境的事务范围。
PCFAgent 可以拥有自己的连接 PCFAgent 和 PCFMessageAgent 将维护自己与队列管理器的连接,从而避免现有连接上的事务范围。
我怀疑您代码中的 qmgr
是一个 MQQueueManager
实例,尽管我们在您的问题中看不到创建它的代码?如果您使用 PCFMessageAgent
与队列管理器建立新连接,它将拥有自己的连接,从而拥有自己的事务范围。
参见class PCFMessageAgent了解更多详细信息,但简而言之,您应该了解三个构造函数,我相信您正在使用第一个。
PCFMessageAgent(MQQueueManager qmanager)
使用现有队列管理器初始化新的 PCFMessageAgent 连接。
PCFMessageAgent(java.lang.String qmanager)
使用与队列管理器的绑定(bind)连接来初始化新的 PCFMessageAgent。
PCFMessageAgent(java.lang.String 主机、int 端口、java.lang.String channel )
通过与队列管理器的客户端连接来初始化新的 PCFMessageAgent。
忽略事务范围 或者,您可以使用一个选项将 PCFMessageAgent 的调用包装在新的事务范围中,以抑制环境的事务范围,如另一个 StackOverflow 问题中所述: Ignore TransactionScope for specific query
using (var scope = new TransactionScope(TransactionScopeOption.Suppress))
{
/* Your PCFMessageAgent code in here */
}
不幸的是,这是使用诸如PCFAgent
之类的包装器的问题,如果您自己编写了所有内容,您只能访问一些可以配置的内容。
关于.net - 如何在同步点下发送PCF消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33755882/