【问题标题】:Why RFH2 header is put before the message instead of in the header?为什么 RFH2 标头放在消息之前而不是在标头中?
【发布时间】:2020-08-04 00:48:15
【问题描述】:

我需要创建一个带有 RFH2 标头的消息并将其注入 IBM MQ。请在下面找到消息是如何创建的。

def message = new MQMessage()
def rfh2 = new MQRFH2()
rfh2.setEncoding(CMQC.MQENC_NATIVE)
rfh2.setCodedCharSetId(CMQC.MQCCSI_INHERIT)
rfh2.setFormat("        ")
rfh2.setNameValueCCSID(1208)
rfh2.setFieldValue('mcd', 'Msd', 'jms_byte')
rfh2.setFieldValue('jms', 'Dst', 'queue:///myqueue')
rfh2.setFieldValue('jms', 'Pri', 0)
rfh2.setFieldValue('usr', 'Sender', 'mysender')
rfh2.write(message)

message.writeString('''${msgText}''')

但是,标题内容似乎不是放在标题中而是放在消息之前。请在下面找到一个示例:

带有使用 MQ Visual Edit 发送的消息的服务器日志

标题

 2020-04-21 11:07:59.913 DEBUG 48093 --- [DefaultMessageListenerContainer-2] 
 c.b.i.c.listeners.AbstractAgiListener    : Receive message on MQ with header : {someargs, 
 jms_destination=queue:///myqueue, someargs, Sender=mysender, someargs, jms_type=mcd://jms_byte,
 someargs}

留言

 <Document ...>...</Document>

带有上述代码发送消息的服务器日志

标题

 2020-04-21 11:07:59.913 DEBUG 48093 --- [DefaultMessageListenerContainer-2] 
 c.b.i.c.listeners.AbstractAgiListener    : Receive message on MQ with header : {someargs}

留言

 RFH ¨ÿÿÿþ        ¸ <mcd><Msd>jms_bytes</Msd></mcd> 8<jms><Dst>queue:///myqueue</Dst>
<Pri>0</Pri></jms>    <usr><Sender>mysender</Sender></usr><Document ...>...</Document>

你知道怎么解决吗?谢谢。

更新 1

即使使用下面的代码,信息仍然存在于消息之前

def message = new MQMessage()
def rfh2 = new MQRFH2()
rfh2.setEncoding(CMQC.MQENC_NATIVE)
rfh2.setCodedCharSetId(CMQC.MQCCSI_INHERIT)
rfh2.setFormat(CMQC.MQFMT_NONE)
rfh2.setNameValueCCSID(1208)
rfh2.setFieldValue('mcd', 'Msd', 'jms_byte')
rfh2.setFieldValue('usr', 'Sender', 'mysender')
rfh2.write(message)

【问题讨论】:

  • 这能回答你的问题吗? How to send message with RFH2 format?
  • 这个答案解释了如何使用 JMeter 谢谢。但不是如何解决我的标题问题。
  • 所以将rfh2.setFormat(" ") 更改为rfh2.setFormat("RHF2")?因为负责申请的人告诉我“你需要在格式字段中放8个空格”。
  • 实际上当你调用rfh2.write时这是自动的。您应该像这样设置格式,它应该与空白rfh2.setFormat(CMQC.MQFMT_NONE) 相同。同样只为usr属性调用rfh2.setFieldValue,其他三个在调用rfh2.write时设置。
  • @JoshMc 谢谢。我根据您的评论用新代码更新了我的问题。

标签: jms ibm-mq rfh2 mq-visual-edit


【解决方案1】:

rfh2.setFormat("RHF2")

这是无效的。

rfh2.setFormat(CMQC.MQFMT_NONE)

这表示消息有效负载没有类型。即它不是字符串,或者在这个 RFH2 结构之后找不到另一个内部。

像 MQ Visual Edit 一样?

是的,MQ Visual Edit 使用 MQRFH2 类,但您需要了解,编写正确的 MQMD.Format 值取决于程序员。

您是否将消息的 MQMD.Format 设置为 MQFMT_RF_HEADER_2:

msg.format = CMQC.MQFMT_RF_HEADER_2;

我已经在 StackOverflow 和我的博客上发布了许多功能齐全的 Java(非 JMS)程序,它们创建了 MQRFH2(又名 JMS)消息。

您可以用我的名字搜索 MQRFH2 以在此处找到它们。

这里描述了 MQ Visual Edit 如何处理显示命名属性与原始 MQRFH2 消息。 https://www.capitalware.com/rl_blog/?p=4786

这里展示了如何在非 JMS Java 应用程序中创建 JMS (MQRFH2) 消息:https://www.capitalware.com/rl_blog/?p=4823

最后,显示在非 JMS Java 应用程序中处理传入的 JMS (MQRFH2) 消息:https://www.capitalware.com/rl_blog/?p=4811

【讨论】:

  • 非常感谢,非常有趣的博客! msg.format = CMQC.MQFMT_RF_HEADER_2 解决了我的问题!我只有最后一个问题。在我的过程中,当注入的消息被处理后,一条消息会在另一个队列中发送。你能解释一下如何找到这条消息吗?实际上,我需要先提取此消息的内容才能继续该过程。提前谢谢你。
  • 我尝试过,但在尝试检索邮件时遇到问题。你能帮我吗? stackoverflow.com/questions/61365813/…非常感谢
猜你喜欢
  • 2020-08-03
  • 2018-03-20
  • 2020-08-07
  • 2016-01-29
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多