【问题标题】:Apache Camel - IBM MQ integrationApache Camel - IBM MQ 集成
【发布时间】:2018-02-08 07:05:10
【问题描述】:

我有一个 Apache camel(版本 2.18)项目,它通过 IBM MQ 客户端将文件发送到我合作伙伴的 IBM MQ 服务器。但是,我的伙伴使用messageId 作为文件名,因此,我们必须将特定文件名设置为messageId

我的问题是我们如何更改messageId

在将文件发送到 IBM MQ 服务器之前,我尝试在 JMS 标头中添加 JMS_IBM_MQMD_MsgIdMsgId 或修改 JMSMessageId,但它不起作用。 你有什么解决办法吗?

这是spring文件中的代码。例如,在我们将 JMS 发送到我伙伴的服务器之前。我们将以下键/值设置为 JMS 标头:

exchange.getIn().setHeader("JMS_IBM_MQMD_MsgId",MsgExtFileName().getBytes())
exchange.getIn().setHeader("JMS_IBM_Format", MQC.MQFMT_STRING)

【问题讨论】:

  • 你的代码标签混淆了

标签: apache-camel jms ibm-mq


【解决方案1】:

我们面临同样的问题:我们必须通过某种规则生成 ID 并将其设置为 MQMD MsgID。此代码执行此操作:

exchange.getIn().setHeader("CamelJmsDestinationName", "queue:///QueueName?mdWriteEnabled=true");
exchange.getIn().setHeader("JMS_IBM_MQMD_MsgId", "123456789012345678901234".getBytes());

【讨论】:

    【解决方案2】:

    IBM MQ v8 知识中心在页面“Reading and writing the message descriptor from an IBM MQ classes for JMS application”中记录了如何使用 IBM MQ Classes for JMS 设置 MQMD 属性

    您必须将目标对象属性 WMQ_MQMD_WRITE_ENABLED 设置为 true,MQMD 属性设置才能生效。然后,您可以使用消息的属性设置方法(例如 setStringProperty)将值分配给 MQMD 字段。除 StrucId 和 Version 外,所有 MQMD 字段都被公开; BackoutCount 可以读取但不能写入。

    // Enable MQMD write
    dest.setBooleanProperty(WMQConstants.WMQ_MQMD_WRITE_ENABLED, true);
    

    IBM MQ v8 知识中心页面“JMS message object properties”记录了可以设置的属性。


    我是一名 IBM MQ 管理员,并不精通 Apache Camel,但我发现这篇 StackOverflow 帖子“How to set ApplicationIdData using MQQueueConnectionFactory?”以及“Simple Expression Language”上的 Apache Camel 文档很有帮助

    例如,将标题设置为布尔类型,您可以这样做:

    .setHeader("cool", simple("true", Boolean.class))
    

    基于以上信息,您只需要添加一行以允许您设置 JMS_IBM_MQMD_MsgId 属性:

    exchange.getIn().setHeader("mdWriteEnabled", simple("true", Boolean.class))
    exchange.getIn().setHeader("JMS_IBM_MQMD_MsgId",MsgExtFileName().getBytes())
    exchange.getIn().setHeader("JMS_IBM_Format", MQC.MQFMT_STRING)
    

    注意基于其他一些信息,我发现上面的 setHeader 可能不正确,您可能需要将其附加到队列目标 URI 的末尾:

    queue:///QueueName?mdWriteEnabled=true
    

    请注意,IBM MQ MQMD 中的 messageId 表示为 24 个字节。这在从平台传递到平台时不会转换,如果您使用普通的字母数字字符,即使从 UTF-8 转换为 ASCII 也不应该是问题,因为字节值是相同的,但需要注意这一点。

    有关 messageId 和字符集的更多信息,请参考以下两个 StackOverflow 答案:

    Get MQ messageId in string format
    CCSID on MQ Managers on different platforms

    【讨论】:

    • @Derek 让我知道这是否有效。我在上面使用队列 URI 添加了另一种可能的解决方案。
    猜你喜欢
    • 2018-06-27
    • 2016-05-05
    • 2018-02-10
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 2019-08-27
    • 2020-04-02
    • 1970-01-01
    相关资源
    最近更新 更多