Я интерпретирую ваш вопрос так, что вы хотите, чтобы сбой работы в s2 приводил к откату текущей транзакции в s1.
Итак, вы хотите
s1 do some work
s2 do some work
if ( s2 OK )
perhaps do even more work in s1
commit s1
else
rollback s1
Асинхронная модель JMS классически не предназначена для этой цели.Основная причина в том, что
- Во время транзакции ресурсы (например, записи базы данных) заблокированы - s1 проделал некоторую работу, пока транзакция не разрешена, эти ресурсы должны быть заблокированы.
- Асинхронная обработка предназначена для отделения работы s2 от работы s1, работа s2 может происходить через много минут или даже дней после того, как запрос был помещен в очередь.S2 не может знать, ждет ли его еще s1.Весь замысел JMS состоит в том, чтобы отделить обработку в s1 и s2.
Существует два подхода к достижению координации между s1 и s2:
Один из них заключается в использовании истинно распределенных транзакций,используя протокол, отличный от JMS, например, EJB могут передавать транзакции из одного процесса в другой или использовать WS-AtomicTransaction и веб-сервисы.Это добавляет эксплуатационную сложность - вам необходимо управлять журналами транзакций и сценариями, в которых у вас есть долгосрочный сбой одного компонента.
Альтернативой является проектирование двух взаимодействующих систем для надежной обработки «компенсирующей» работы.Вы соглашаетесь с тем, что, например, s2 может завершиться сбоем и иметь вторичную обработку для обработки повторных запросов, работы с тайм-аутами и т. Д. В конце концов, вы можете столкнуться с некоторыми ситуациями, когда необходимо вмешательство людей, но с хорошим дизайном эти ситуации могут бытьминимален.В крупномасштабных системах зачастую нет альтернативы этому, например, система бронирования авиакомпании и система бронирования сети отелей вполне могут быть не рассчитаны на координацию распределенных транзакций, поэтому нет альтернативы тщательной обработке для управления бронированием авиабилетов и номеров.