2

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) 在 IBM.WMQ.MQDestination.Put(MQMessage message, MQPutMessageOptions pmo) 在 IBM.WMQ.PCF.PCFAgent.Send(Int32 command, PCFParameter[] parameters) 在 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 是打开的,所以我收到了这个错误。

- 编辑 -

我在顶部添加了队列管理器连接的代码。

4

2 回答 2

3

您收到此错误的事实表明您正在重用与队列管理器的连接,该连接用于您的其他放置和获取,因此它超出了用于该连接的事务范围,或者甚至是新的建立的连接正在获取您环境的事务范围。

PCFAgent 可以拥有自己的连接 PCFAgent 和 PCFMessageAgent 将保持自己与队列管理器的连接,从而避免现有连接上的事务范围。

我怀疑qmgr您的代码中的 是一个MQQueueManager实例,尽管我们在您的问题中看不到创建它的代码?如果您改为使用PCFMessageAgent与队列管理器建立新连接,它将拥有自己的连接,从而拥有自己的事务范围。

有关更多详细信息,请参阅类 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,如果您自己编写,您只能访问一些您可以配置的东西。

于 2015-11-18T01:27:02.307 回答
1

这很奇怪。如果队列管理器的命令服务器在 UOW(工作单元)下,您认为队列管理器的命令服务器如何处理您的 PCF 命令?在您进行提交之前,您的 PCF 消息(放入命令服务器的队列)是不可见的。

我不知道为什么您需要在获取后查询队列,但唯一可行的方法是它在 UOW 之外。

于 2015-11-17T23:03:22.167 回答