【问题标题】:How do I remarshal a modified message with ActiveMQ (OpenWire)?如何使用 ActiveMQ (OpenWire) 重新编组修改后的消息?
【发布时间】:2018-07-06 23:02:31
【问题描述】:

首先解释一下我想要做什么。我正在编写一个 Java (1.7) 应用程序,它将尝试使用从生产者到目标消费者的 OpenWire 格式来“模糊”通过 ActiveMQ 发送的 XML 消息。目的是衡量目标如何响应发送给它的模糊消息。我在 Linux CentOS 6.6 上使用 ActiveMQ 版本 5.12.1。

有一个 XML 模式定义了将要发送的消息类型。我有单独的程序来生成这些消息的示例实例,并确定在发送的有线格式中找到信息的位置(在本例中为 OpenWire)。此信息将用于模糊测试过程,以了解要更改的数据的位置。

部分模糊测试过程涉及从网络中捕获网络格式消息,进行更改并将修改后的消息转发到目标。只要我只更改了内容而不更改长度,我就能够成功地修改数据并将其发送出去。如果修改导致长度发生变化,则与 ActiveMQ 服务器的连接关闭,程序失败。

研究表明,OpenWire 消息均以 4 字节整数开头,表示后面消息数据的长度。我更改了代码以调整该长度以反映对测试数据所做的更改。那没有用。经过进一步调查,我发现仅更改长度字段并不是正确的做法 - 但应该(或可以)做什么并不明显。

我有一个强烈的印象,最好的办法是使用 ActiveMQ API 重新编组修改后的消息数据并将其转发到目标。我不知道这是否对我有用。

我试图找到信息来帮助我确定所涉及的 OpenWire 消息的结构,以便我可以知道在修改消息时需要做什么。我开始查看 ActiveMQ javadocs 并找到了 openwire 包。也许我可以利用这些来实现我需要进行的更改,并让它们通过 ActiveMQ 成功转发并被目标接收。

是否有任何文档或示例代码提供有关如何正确使用此 API 来完成我需要的操作的说明或示例?根据我所描述的,这是可以使用 API 实现的吗?任何帮助,将不胜感激。谢谢。

【问题讨论】:

    标签: activemq marshalling


    【解决方案1】:

    看看http://camel.apache.org 无需直接解释有线格式。 甚至可以在amq服务器上运行。

    【讨论】:

    • 首先,我对骆驼一无所知。我将如何绕过“了解”有线格式?我需要能够执行以下操作:将消息字段 A 内容“ABC”替换为新内容“XYZ”,其中消息由 XML 模式定义。显然这是一个非常简单的场景。我要么需要弄清楚字段 A 的内容在有线格式中的位置,要么我需要一些可以帮助我进行替换的东西。 Camel 可以做(或协助)那种事情吗?
    • 骆驼有“路线”可以帮助你。您可以将消息从队列中取出、解组、更改、编组并发送到另一个队列。队列中的输入格式(字节、文本、对象)由您的发送者决定。
    【解决方案2】:

    听起来您想通过 ActiveMQ 发送 Xml 数据。

    1. 您无需担心 Openwire。客户端库会为您处理。这就是 ActiveMQ JMS 库用来与 ActiveMQ 通信的协议,而您的程序只需要担心如何与 JMS 通信。

    2. 决定使用什么 API 与 ActiveMQ 对话。如果是 Java,请使用 JMS API 并发送一个 TextMessage 对象,其中正文设置为 Xml 数据的字符串表示。如果是C#,看ActiveMQ的NMS库。如果是 PHP/Python/Perl 或其他脚本语言,则查找 STOMP 库并以 Xml 数据作为正文发送文本消息。

    【讨论】:

      猜你喜欢
      • 2019-08-18
      • 2017-08-22
      • 2016-10-27
      • 1970-01-01
      • 2017-07-13
      • 2011-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多