Как использовать транзакции с Stomp и ActiveMQ (и Perl)?

Я пытаюсь заменить некоторые очереди сообщений в ActiveMQ, и мне нужно поговорить с ними (много) с Perl. ActiveMQ предоставляет интерфейс Stomp, а Perl имеет Net:: Stomp, поэтому кажется, что все должно быть хорошо, но это не так.

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

Я не могу найти никаких четких ответов, предполагающих, что это невозможно, что возможно, или что существует соответствующий бит конфигурации. Кроме того, Stomp, похоже, не является отличным протоколом для проверки ответов на ошибки с сервера.

Мне повезло?

Ответ 1

BTW Лучшее место, чтобы спросить вопросы Perl/ActiveMQ/Stomp - это форум пользователей ActiveMQ, так как многие люди Perl-Stomp выходят туда.

Трюк с транзакциями STOMP состоит в том, чтобы убедиться, что каждое отправленное вами сообщение или каждое подтверждаемое вами подтверждение включают заголовок идентификатора транзакции. См. Раздел раздел обработки транзакций протокола STOMP.

Причиной этого является то, что с помощью STOMP вы могли бы одновременно совершать много транзакций, если ваш клиент многопоточен - вместе с некоторыми транзакциями без транзакции.

Ответ 2

Посмотрите Net:: Stomp:: Receipt. Это подкласс Net:: Stomp, который реализует "возвратные квитанции" из протокола Stomp и позволяет вам убедиться в правильном получении вашего сообщения и в противном случае прервать транзакцию.

Ответ 3

Вы должны перенести подтверждения внутри транзакции.

В псевдокоде (или псевдо STOMP) это будет:

  • BEGIN [TRANSACTION-ID] → отправить на сервер
  • СООБЩЕНИЕ [СООБЩЕНИЕ-ID] (получено) < - получено с сервера
  • ACK [MESSAGE-ID] [TRANSACTION-ID] → отправить на сервер
  • COMMIT [TRANSACTION-ID] → отправить на сервер

Я уже получил эту работу с драйвером PHP (исправление прерывания для использования идентификатора транзакции, когда я передаю объект фрейма для подтверждения).

К сожалению, после повторного добавления четырех сообщений клиент останавливается. По крайней мере, это происходит со мной.