我有以下代码来获取队列信息,这会在作为事务的一部分完成时抛出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)
行上,如下所示:
完成代码:2,原因代码: 2232(2232 = MQRC_UNIT_OF_WORK_NOT_STARTED)at IBM.WMQ.MQDestination.Put(MQMessage消息,MQPutMessageOptions pmo) 在IBM.WMQ.PCF.PCFAgent.Send(Int32命令,PCFParameter []参数) 在IBM.WMQ.PCF.PCFMessageAgent.Send(PCFMessage请求,布尔检查) 在MyMethod的IBM.WMQ.PCF.PCFMessageAgent.Send(PCFMessage请求)
其余的事务连接选项(例如,对于消息get或put)附加了Or MQC.MQGMO_SYNCPOINT
- 但我看不到如何设置PCF消息的连接选项。有人可以帮忙吗?
要明确的是,我并不关心 是否作为交易的一部分发送,但因为Transactionscope已打开,我收到此错误。
- 编辑 -
我在顶部添加了队列管理器连接的代码。
答案 0 :(得分:3)
您收到此错误的事实表明,您要重新使用与其他put和gets用于的队列管理器的连接,因此它会跳过用于该连接的事务范围,或者即使是新建的连接也会占用您环境的交易范围。
PCFAgent可以拥有自己的连接 PCFAgent和PCFMessageAgent将保持自己与队列管理器的连接,从而避免现有连接上的事务范围。
我怀疑代码中的qmgr
是MQQueueManager
个实例,但我们无法看到您创建它的问题中的代码?如果您改为使用PCFMessageAgent
建立与队列管理器的新连接,它将拥有自己的连接,从而拥有自己的事务范围。
有关详细信息,请参阅class PCFMessageAgent,但简而言之,您应该注意三个构造函数,我相信您正在使用第一个。
PCFMessageAgent(MQQueueManager qmanager)
使用现有队列管理器初始化新的PCFMessageAgent 连接。
PCFMessageAgent(java.lang.String qmanager)
使用与队列管理器的绑定连接初始化新的PCFMessageAgent。
PCFMessageAgent(java.lang.String host, int port, 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
这样的包装器的问题,如果你自己编写了这些包装,你只能访问一些你可以配置的东西。
答案 1 :(得分:1)
这很奇怪。您认为队列管理器的命令服务器如何处理您的PCF命令(如果它位于UOW(工作单元))?在您提交之前,您的PCF消息(放入命令服务器的队列)是不可见的。
我不知道为什么你需要在获取后查询队列,但唯一可行的方法是在UOW之外。