Apache Apollo:java openwire客户端不使用来自php stomp生产者的消息

时间:2013-09-09 03:01:43

标签: jms stomp apollo

我正在尝试在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的消息。

这是一个gist,其中有一个例子:

  • 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
)

1 个答案:

答案 0 :(得分:2)

Apache Apollo不是为了自动转换消息而构建的,具体取决于所选的消费者协议。理解这一点的关键是Apollo是下一代ActiveMQ的核心。如果Apollo项目与ActiveMQ合并,那么广泛的功能集,例如隐式转换和其他“不错的”功能,只需执行一次。

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

  1. 使用Stomp in java
  2. 切换到ActiveMQ(可能无痛,但性能下降)
  3. 进行一些手动转换 - 比如使用Apache Camel来提供stomp队列并生成JMS / OpenWire队列。