У меня есть несколько вопросов относительно вашей проблемы:
- Если метод sendEvent (Object o) является настолько дорогим (в зависимости от того, что вы говорите) с точки зрения производительности, почему вы считаете его вызовомдважды (очевидно, для обработки одного и того же объекта)?
Очевидно, что результаты этих двух вызовов будут одинаковыми, с той разницей, что они будут отправлены в 2 разные очереди.Я полагаю, что вы могли бы отправить его в обе очереди всего за один вызов, чтобы не выполнять один и тот же код дважды.
- Когда я думаю о транзакциях, первое, что приходит мне в голову, - это синхронные операции.,Вы хотите выполнять эти операции асинхронно или синхронно?Например, вы хотите подождать, пока счет-фактура будет вставлена в БД для отправки сразу после сообщения в очередь1 и очередь2?
Возможно, вам следует сделать это асинхронно.Если вы этого не сделаете или не можете, возможно, вы могли бы выбрать «оптимистическую» стратегию, при которой вы сначала отправляете сообщение в Queue1 и Queue2, а затем, пока вы обрабатываете эти сообщения на стороне брокера, вы выполняете вставку счета-фактуры.в БД.Если база данных имеет высокую доступность, в большинстве случаев вставка будет успешной, поэтому вам не придется ждать, пока она будет сохранена, чтобы отправить сообщения в очереди 1 и 2. В случае, если вставка не удалась (что было бы очень маловероятно)Вы можете отправить второе сообщение, чтобы отменить эти изменения на стороне брокера.В случае, если из-за вашей бизнес-логики этот процесс отмены не является тривиальным, эта альтернатива может вам не подойти.
Вы упоминаете, что ActiveMQ не работает, как выполнить откат.Ну, в этом случае, возможно, вам понадобится некоторый мониторинг очередей, чтобы выяснить, достигло ли сообщение пункт назначения или нет.Я бы посоветовал вам взглянуть на Консультативные сообщения , они могут помочь вам контролировать это и действовать в результате.
Но, возможно, то, что вам нужно, также можно переосмыслить и решитьс постоянными подписчиками , таким образом, как только подписчики снова станут доступны, они получат то сообщение, которое было поставлено в очередь.Но это работает немного хуже, так как нужно сохранять сообщения в файлах, чтобы потом восстанавливать их, если брокер выходит из строя.
Надеюсь, что эти предложения помогут вам, но, по моему мнению, вы должны описать больше, как это должно бытьрезультат, который вы хотите (поток), так как он не кажется очень ясным (по крайней мере, мне)