私のプロジェクトでは、すべてのサービスをステートレスセッションBeanとして設計しています。ワークフロー中に、新しいデータが作成され、これをクライアントに報告する必要があります。トランザクションが正常にコミットされたときにのみ、このメッセージを送信したいと思います。
xmppパケット(smackライブラリ)をディスパッチするServletContextListenerを登録しています。パケットを受信すると、ディスパッチするステートフルセッションBeanを見つけて、要求の処理を開始します。
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にまたがるワークフロー中に、この生成されたメッセージを収集するにはどうすればよいですか?ディスパッチBeanからこのリストを返し、後でメッセージを送信します。私の簡単な解決策は、メッセージを追加するリストをルーティングすることですが、よりエレガントな方法はありますか?
すべてのBeanからアクセスする必要があるXMPPリソース(名簿http://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smack/Roster.html )があります。どうすればそれを達成できますか?それを静的変数に格納し、それへのアクセスを同期するのはあまり良くありません。