Как использовать транзакции с 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 (исправление прерывания для использования идентификатора транзакции, когда я передаю объект фрейма для подтверждения).
К сожалению, после повторного добавления четырех сообщений клиент останавливается. По крайней мере, это происходит со мной.