当我使用PHP-Stomp向ActiveMQ发送消息时,消息将作为BytesMessage发送。但是我想发送一个TextMessage。
根据STOMP documentation,这可以通过不发送内容长度标题来实现:
...但协议确实支持内容长度 头。在Stomp和JMS之间提供更强大的交互 客户端,ActiveMQ键包含此标头 确定从Stomp发送到JMS时要创建的消息类型。 逻辑很简单:
包含内容长度标头=>结果消息
是=> BytesMessage
否=>的TextMessage
从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",
]);
答案 0 :(得分:4)
它已经很长时间了,但这对我有用:
try {
$stomp->send("your_queue", "your_message", array("amq-msg-type" => "text"));
} catch (StompException $e) {
die('send failed: ' . $e->getMessage());
}
答案 1 :(得分:1)
我找到了答案。
TL; DR:这是不可能的。
使用PECL-Stomp时,无法发送内容长度标头,因为它是在发送请求时自动创建的。如果你传递reuqest将包含两个内容长度标题。
供参考the sourcecode。
答案 2 :(得分:0)
使用activemq:
添加转换标头$stomp->send('/queue/pizzamonsters', json_encode($frame), [
'transformation' => 'TEXT'
]);
答案 3 :(得分:0)
<?php
$stomp = new Stomp('tcp://localhost:61613');
$stomp->send('/topic/test.central_message_topic', 'testmessage', ["content-type" =>"text/plain"]);