Как использовать транзакции с Stomp и ActiveMQ (и Perl)? - PullRequest
10 голосов
/ 17 сентября 2008

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

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

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

Мне не повезло?

Ответы [ 3 ]

3 голосов
/ 17 сентября 2008

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

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

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

1 голос
/ 03 марта 2009

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

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

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

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

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

1 голос
/ 18 сентября 2008

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

...