В моем проекте все сервисы созданы как сессионные компоненты без сохранения состояния. Во время рабочего процесса создаются новые данные, и об этом следует сообщать клиентам. Я хочу отправлять эти сообщения только тогда, когда транзакция успешно зафиксирована.
У меня зарегистрирован ServletContextListener, который отправляет мои пакеты xmpp (библиотека smack). Когда я получаю пакет, я нахожу свой компонент сеанса с сохранением состояния и запускаю обработку запроса.
public void processPacket(Packet packet) {
try{
if(packet instanceof RawRequest){
DispatchIQService service = Core.lookup(DispatchIQService.class);
service.process(connection, (RawRequest)packet);
// sending of the messages should happen here, because transaction completed successful.
}else{
log.debug("Packet ignored: " + packet.toXML());
}
}catch(Exception e){
log.error(e, e);
}
}
Как собрать эти сгенерированные сообщения во время рабочего процесса по нескольким компонентам? Я бы возвратил этот список из bean-компонента отправки и впоследствии отправил бы сообщения. Моим простым решением было бы перенаправить список, в который я добавляю свои сообщения, но есть ли более элегантный способ?
У меня есть ресурс XMPP (список http://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smack/Roster.html), к которому я должен получить доступ из всех компонентов. Как это сделать? Сохранить его в статическую переменную и синхронизировать доступ к нему не звучит очень хорошо.