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

我正在尝试在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
)

最佳答案 Apache Apollo不是为了自动转换消息而构建的,具体取决于所选的消费者协议.理解这一点的关键是Apollo是下一代ActiveMQ的核心.如果Apollo项目与ActiveMQ合并,那么广泛的功能集(例如隐式转换和其他“很棒的”功能)将被实现一次.

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

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

点赞