ActiveMQ / PHP Stomp используют TextMessage вместо BytesMessage

когда я отправляю сообщение в ActiveMQ, используя PHP-Stomp сообщение отправляется как BytesMessage. Однако я хотел бы отправить TextMessage.

Согласно STOMP документация этого можно добиться, не отправляя заголовок длины содержимого:

… Протокол, однако, поддерживает длину содержимого
заголовок. Чтобы обеспечить более надежное взаимодействие между Stomp и JMS
клиенты, ключи ActiveMQ от включения этого заголовка в
определить, какой тип сообщения создавать при отправке из Stomp в JMS.
Логика проста:

Включение заголовка content-length => Результирующее сообщение

да => BytesMessage

нет => TextMessage

Этой же логике можно следовать и при переходе от JMS к Stomp.
Клиент Stomp может быть записан для отключения включения
заголовок содержимого длины, чтобы определить, какой тип структуры сообщения
предоставить пользователю.

В моем тестовом PHP-скрипте я не определил заголовок длины содержимого, и он, кажется, добавляется автоматически.
Я также попытался передать content-length как 0, false или null. Во всех этих случаях он выдает сообщение BytesMessage.

Итак, мой вопрос, Как создать текстовое сообщение вместо BytesMessage.

Мой код выглядит следующим образом:

<?php

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

3

Решение

это было давно, но это сработало для меня:

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

Другие решения

Я нашел ответ.

TL; DR: это невозможно.

С PECL-Stomp невозможно не отправлять заголовок длины содержимого, так как он создается автоматически при отправке запроса. Если вы передадите запрос, он будет содержать два заголовка контента.

Для справки исходный код.

2

Добавьте заголовок преобразования, используя это с activemq:

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

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