когда я отправляю сообщение в 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",
]);
это было давно, но это сработало для меня:
try {
$stomp->send("your_queue", "your_message", array("amq-msg-type" => "text"));
} catch (StompException $e) {
die('send failed: ' . $e->getMessage());
}
Я нашел ответ.
TL; DR: это невозможно.
С PECL-Stomp невозможно не отправлять заголовок длины содержимого, так как он создается автоматически при отправке запроса. Если вы передадите запрос, он будет содержать два заголовка контента.
Для справки исходный код.
Добавьте заголовок преобразования, используя это с activemq:
$stomp->send('/queue/pizzamonsters', json_encode($frame), [
'transformation' => 'TEXT'
]);
<?php
$stomp = new Stomp('tcp://localhost:61613');
$stomp->send('/topic/test.central_message_topic', 'testmessage', ["content-type" =>"text/plain"]);