如何在同步点下发送 PCF 消息?
How to send a PCF Message under syncpoint?
我有以下代码来获取队列信息,作为事务的一部分完成时会抛出 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 是打开的,所以我得到了这个错误。
--编辑--
我在顶部添加了队列管理器连接的代码。
这很奇怪。如果队列管理器的命令服务器在 UOW(工作单元)下,您认为它如何处理您的 PCF 命令?在您提交之前,您的 PCF 消息(放入命令服务器的队列)是不可见的。
我不知道为什么您需要在获取后查询队列,但唯一可行的方法是它在 UOW 之外。
您收到此错误的事实表明,您正在重复使用与您用于其他放置和获取的队列管理器的连接,因此它会越过用于该连接的事务范围,或者即使是建立的新连接也会占用您环境的事务范围。
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 的调用包装在一个新的事务范围内,以抑制环境的事务范围,如另一个 Whosebug 问题中所述:Ignore TransactionScope for specific query
using (var scope = new TransactionScope(TransactionScopeOption.Suppress))
{
/* Your PCFMessageAgent code in here */
}
不幸的是,这是使用 PCFAgent
等包装器的问题,如果您全部自己编写,您只能访问一些可以配置的东西。
我有以下代码来获取队列信息,作为事务的一部分完成时会抛出 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 是打开的,所以我得到了这个错误。
--编辑--
我在顶部添加了队列管理器连接的代码。
这很奇怪。如果队列管理器的命令服务器在 UOW(工作单元)下,您认为它如何处理您的 PCF 命令?在您提交之前,您的 PCF 消息(放入命令服务器的队列)是不可见的。
我不知道为什么您需要在获取后查询队列,但唯一可行的方法是它在 UOW 之外。
您收到此错误的事实表明,您正在重复使用与您用于其他放置和获取的队列管理器的连接,因此它会越过用于该连接的事务范围,或者即使是建立的新连接也会占用您环境的事务范围。
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 的调用包装在一个新的事务范围内,以抑制环境的事务范围,如另一个 Whosebug 问题中所述:Ignore TransactionScope for specific query
using (var scope = new TransactionScope(TransactionScopeOption.Suppress))
{
/* Your PCFMessageAgent code in here */
}
不幸的是,这是使用 PCFAgent
等包装器的问题,如果您全部自己编写,您只能访问一些可以配置的东西。