【问题标题】:IBM Message Queue using PYMQI and Correlation ID使用 PYMQI 和 Correlation ID 的 IBM 消息队列
【发布时间】:2020-06-02 11:54:58
【问题描述】:

我最近继承了一个使用 PYMQI 将消息放入 IBM Websphere Queue 的测试框架。我通过这个链接修复了我需要的大部分代码

https://dsuch.github.io/pymqi/examples.html#how-to-correlate-request-and-response-messages-using-correlationid

唯一悬而未决的问题是相关 ID 的格式。我尝试了很多选项,但 MQ 正在将相关 ID 转换为字节数组(似乎是 IBM MQ 默认设置),然后再将其扔到 Q 上。我所有的下游系统都在寻找 HEX 值并且正在中断。

我被困在这几天了。有没有办法在消息属性中强制关联 ID?

请告诉我

问候 阿拉文

@JoshMc 非常感谢您的回复。这是专有代码,很难粘贴整个内容,但这是相关的部分。下游系统正在查看此 JMS 相关 ID 以增加并放回队列中。当我通过下面的代码发送它时,它命中队列被转换为字节数组,但是下游系统读取验证失败。我希望它作为 HEX 值进入队列,因为它应该是我传递的确切值,而不是字节数组。

queue = self._open_write_queue(queue_name)

put_mqmd = pymqi.md()
put_mqmd.Format = CMQC.MQFMT_STRING
CCSID = 1202

 put_opts = pymqi.pmo()
# Set the MsgType to request.
# put_mqmd["MsgType"] = CMQC.MQMT_REQUEST
put_mqmd["MsgId"] = '00002Y0001T1'
put_mqmd["CorrelId"] = '00002Y0001T1'

 put_opts = pymqi.PMO(Options=CMQC.MQPMO_NO_SYNCPOINT +
                                         CMQC.MQPMO_FAIL_IF_QUIESCING + CMQC.MQRO_PASS_CORREL_ID)
            queue.put(message, put_mqmd, put_opts)

当我将消息放入队列时,它已成功发布,但没有被下游系统处理:

在上面的屏幕截图中,队列中的第一条消息是使用应用程序 JMSToolBox 发布的,该应用程序具有下游系统所期望的相关 ID。第二条消息是使用机器人框架/pymqi 发布的 - 其相关 ID 显示为 ID:30303..... 另外请注意,第二条消息的 JMSDestination 显示为 null。(对于手动发布的第一条消息,作为 'JMSDestination: queue:///QueueName'

现在我有两个问题 - CorrelationId 没有像我预期的那样出现和 JMSDestination:null。我不确定如何使用 pymqi 库设置目标(或者这是在 Q-Manager 级别设置的)非常感谢任何帮助。

JMSToolBox 发送消息截图:

使用robotframework-pymqi发送的消息截图:

我现在在两条消息中发现的唯一区别是 JMSHeader 中的 JMSDestination:Null 用于使用 Pymqi 发送的消息。我还尝试更改队列的 PROPCTL 设置,但没有帮助。

我可以使用 pymqi 发送 java 属性吗?

【问题讨论】:

  • 一个correlationID是一个字节值。大多数应用程序将其显示为这些字节的 HEX 值。你能放出产生你所面临问题的最小样本吗?
  • 请检查相关代码片段的更新。再次感谢您帮助我
  • 你能用传递的真实值来展示它吗?
  • 请在您的 MQ Explorer 消息中添加屏幕截图。没有人有你的“客户”,没有人知道它是如何工作的,也没有人知道它是如何解析 ID 的。
  • ibm.com/support/knowledgecenter/SSEQTP_9.0.5/… MQRFH2 jms.Dst (JMSDestination) 此字段出现在包含 MQRFH2 头的 IBM MQ 格式 JMS 消息中。 jms.Dst 字段包含在应用程序为消息发出发送时设置的发送至 JMS 目标的序列化表示(IBM MQ URI)。 IBM MQ 不使用转发路由路径,但发送目的地可能位于可以使用转发路由路径的远程服务集成总线中。

标签: python integration-testing ibm-mq pymqi


【解决方案1】:

正如 cmets 所指出的,相关 id 需要是一个字节数组,填充为 24 个字节或 48 个十六进制。所以

Python 2 & 3 兼容方式

put_mqmd["CorrelId"] = 'Aravind'.ljust(24).encode('utf-8')

Python 3 唯一方法

put_mqmd["CorrelId"] = bytes('Aravind'.ljust(24), 'utf-8')

但最简单的方法是让底层客户端通过传入CMQC.MQPMO_NEW_CORREL_ID 为您生成它。我不能告诉你代码在哪里,因为你没有显示那个位,但是pymqi 文档中有示例。

【讨论】:

  • 我在迁移到 Python3 后尝试填充 correlId。你的伎俩对我有用。非常感谢。
猜你喜欢
  • 2013-10-24
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
  • 2012-08-07
  • 1970-01-01
  • 2013-10-20
  • 2012-08-27
相关资源
最近更新 更多