4

我正在尝试在 Apollo 1.6 上设置一个队列,该队列将使用 STOMP 从 PHP 写入,并由 Java 使用 ActiveMQ openwire 客户端使用。

我可以从 Java 读取和写入我的队列,我可以从 PHP 读取和写入它,我可以使用 Java 编写消息并使用 PHP 读取它们,但是我不能从 PHP 编写消息并使用 Java 读取它们,这就是我真的很想做。

当我使用 Apollo 的管理 UI 查看队列时,我可以在我创建的测试队列中看到我使用 PHP/STOMP 和 Java/ActiveMQ 发布的所有消息。php 消息的编解码器是 stomp,而 java 消息的编解码器是 openwire。我的 php 客户端读取这两种类型的消息,但我的 java 客户端不读取 stomp 消息。

这是一个提炼示例的要点:

  • Apollo.java 读写测试队列
  • send.php 写入测试队列
  • recv.php 从测试队列中读取
  • apollo.xml 是用于设置测试队列的 apollo 配置。

我打印了 php 收到的 StompFrames,第一个是 java/openwire 发布的,第二个是 php/stomp 发布的:

➜  stomp-php-1.0.0  php -f recv.php
Received from /queue/test:
StompFrame Object
(
    [command] => MESSAGE
    [headers] => Array
        (
            [destination] =>
            [content-length] => 256
            [content-type] => protocol/openwire
            [message-id] => demo-71
        )

    [body] =>�{/ID:uspdxml-drevel.local-57993-1378699215106-1:1dtestn{/ID:uspdxml-drevel.local-57993-1378699215106-1:1A�O
hello!
)
➜  stomp-php-1.0.0  php -f send.php
➜  stomp-php-1.0.0  php -f recv.php
Received from /queue/test:
StompFrame Object
(
    [command] => MESSAGE
    [headers] => Array
        (
            [message-id] => demo-81
            [destination] =>  /queue/test
        )

    [body] => world
)
4

1 回答 1

2

Apache Apollo 不是为根据选择的消费者协议自动转换消息而构建的。理解这一点的关键是,Apollo 被构建为下一代 ActiveMQ 的核心。如果 Apollo 项目与 ActiveMQ 合并,那么广泛的功能集,例如隐式转换和其他“不错的”功能只需要实现一次。

从我的角度来看,您有三种选择:

  1. 在 java 中使用Stomp
  2. 切换到 ActiveMQ(可能很轻松,但会降低性能)
  3. 做一些手动转换——比如使用 Apache Camel 来提供 stomp 队列并生成到 JMS/OpenWire 队列。
于 2014-08-04T21:33:31.043 回答