ActiveMQ / PHP Stomp 使用 TextMessage 而不是 BytesMessage

Posted

技术标签:

【中文标题】ActiveMQ / PHP Stomp 使用 TextMessage 而不是 BytesMessage【英文标题】:ActiveMQ / PHP Stomp use TextMessage instead of BytesMessage 【发布时间】:2015-10-12 02:05:07 【问题描述】:

当我使用php-Stomp 向 ActiveMQ 发送消息时,消息将作为 BytesMessage 发送。不过我想发送一条短信。

根据STOMP documentation,这可以通过不发送内容长度标头来实现:

...然而,该协议确实支持内容长度 标题。在 Stomp 和 JMS 之间提供更强大的交互 客户端,ActiveMQ 关闭包含此标头的键 确定从 Stomp 发送到 JMS 时要创建的消息类型。 逻辑很简单:

包含内容长度标头 => 结果消息

是 => 字节消息

没有 => 短信

从 JMS 到 Stomp 时也可以遵循相同的逻辑。 可以编写一个 Stomp 客户端来关闭包含 content-length 标头来确定要使用哪种类型的消息结构 提供给用户。

在我的测试 PHP 脚本中,我没有定义 content-length 标头,它似乎是自动添加的。 我还尝试将内容长度传递为 0、false 或 null。在所有这些情况下,它都会生成一个 BytesMessage。

所以我的问题是,如何生成 Textmessage 而不是 BytesMessage

我的代码如下所示:

<?php

$stomp = new Stomp('tcp://localhost:61613');
$stomp->send('/topic/test.central_message_topic', 'testmessage', [
    "persistent" => "true",
]);

【问题讨论】:

【参考方案1】:
<?php
$stomp = new Stomp('tcp://localhost:61613');
$stomp->send('/topic/test.central_message_topic', 'testmessage', ["content-type" =>"text/plain"]);

【讨论】:

【参考方案2】:

已经很久了,但这对我有用:

try   
$stomp->send("your_queue", "your_message", array("amq-msg-type" => "text"));
 catch (StompException $e)   
die('send failed: ' . $e->getMessage());

【讨论】:

【参考方案3】:

添加转换头,与activemq一起使用:

$stomp->send('/queue/pizzamonsters', json_encode($frame), [
    'transformation' => 'TEXT'
]);

【讨论】:

【参考方案4】:

我找到了答案。

TL;DR:这是不可能的。

使用 PECL-Stomp 不可能不发送 content-length 标头,因为它是在发送请求时自动创建的。如果你通过了 reuqest 将包含两个 content-length 标头。

供参考the sourcecode。

【讨论】:

以上是关于ActiveMQ / PHP Stomp 使用 TextMessage 而不是 BytesMessage的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMq获取topic数据

ActiveMQ、STOMP、Java 示例

如何将事务与 Stomp 和 ActiveMQ(和 Perl)一起使用?

无法使用 STOMP 向 activemq 发送消息

使用 ruby​​ 和 stomp 将消息写入 ActiveMQ

使用 Python+Stomp.py 和 ActiveMQ 发送/接收图像