2015-01-04 3 views
1

У меня есть приложение, которое требует, чтобы наше приложение отправляло уведомление во внешнюю систему в случае возникновения определенного события. Уведомление о внешней системе происходит путем помещения сообщения в очередь JMS.Как хранить/хранить временные данные без использования шаблона проверки претензий?

Требования к транзакциям не такие строгие. Следовательно, вместо использования JTA для такой тривиальной usecase я решил использовать локальную транзакцию JMS, так как весна понимает, как синхронизировать локальную транзакцию JMS с любой управляемой транзакцией (например, транзакцией базы данных), чтобы поднять 1PC.

Проблема, с которой я столкнулся, заключается в том, что уведомление должно быть дополнено некоторыми данными перед отправкой уведомления. Эта дополнительная информация не имеет отношения к моему бизнес-домену, который отвечает за создание события. Таким образом, я не уверен, где временно хранить дополнительные данные, чтобы вернуть их перед отправкой уведомления. Вероятно, ниже иллюстрация может помочь в понимании проблемы.

HTTP Request ---> Rest API ---> Application Domain ---> Создание события ---> Notification

В соответствии с приведенной выше иллюстрации, я не хочу, чтобы передать, что дополнительные данные и загрязняют мой домен, который является частью полезной нагрузки запроса API Rest, отправить уведомление.

Одним из решений, о котором я думал, является использование канала очереди с потоком, чтобы вернуть его перед отправкой уведомления. Таким образом, Rest API запускает процесс, помещая дополнительные данные в очередь, и перед отправкой уведомления я вытащу его из очереди, чтобы обогатить сообщение для уведомления.

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

Если мой подход не имеет никакого смысла, пожалуйста, предложите любое решение без использования шаблона претензии/проверки.

ответ

0

Почему бы просто не сохранить информацию в заголовке (или заголовках)? Доменному слою не нужно знать, что он есть.

Или для вашего решения создайте новый QueueChannel для каждого запроса и сохраните ссылку на него в заголовке и от него на задней панели, но проще просто напрямую использовать заголовок.

+0

Одна вещь, которую я забыл упомянуть в вопросе, заключается в том, что вызов домена не происходит как часть потока интеграции с пружиной. Если мы хотим сохранить информацию в заголовке, мы должны сделать вызов для обслуживания как часть потока? – Noor

+0

Это зависит от того, как ваш доменный уровень архивирован. Если ваша служба домена является POJO, вызовите ее из '', и инфраструктура позаботится о разворачивании полезной нагрузки сообщения для службы и поддержании заголовков для последующего использования. –

+0

Как вы сказали, что вы забыли что-то упомянуть, мы действительно не можем помочь вам без дополнительной информации по этому вопросу. С другой стороны вы всегда можете хранить эту информацию где-то во внешнем хранилище или просто в «RequestAttributes» и использовать «RequestContextHolder» для логики «ThreadLocal». –

Смежные вопросы