Atmosphere ランタイム 0.6 スナップショットを使用しています。Tomcat 7 は、Http11 Nio コネクタを使用していることを正しく記録しており、BlockingIO が使用されるという警告はありません。
3 種類のチャネルにメッセージを送信しようとしています。
- グローバル ブロードキャスター - 中断されたすべてのリソースにブロードキャストします。(全て)
- 特定のリソース (パートナーなど) にブロードキャストする
- 現在のリソースにブロードキャスト (自己)
ログイン アクションが発生したときに、この種のブロードキャストを実現するには、セッションに何を保存する必要がありますか?
私のコードの詳細は次のとおりです。
- 私のハンドラーは AtmosphereHandler を実装します
コンストラクターで、globalBroadcaster を次のようにインスタンス化します。
globalBroadcaster = new DefaultBroadcaster();ログインすると、
resource.getAtmosphereConfig().getServletContext().setAttribute(name, selfBroadcaster);ここで、name はリクエスト パラメーターのユーザー名で、selfBroadcaster は DefaultBroadcaster の新しいインスタンスです。sendMessageToPartner のコードは次のとおりです。
private synchronized void sendMessageToPartner(Broadcaster selfBroadcaster,
AtmosphereResource<HttpServletRequest, HttpServletResponse> resource,String name, String message) {
// this gives the partner's name
String partner= (String) resource.getAtmosphereConfig().getServletContext().getAttribute(name + PARTNER_NAME_TOKEN);
// get partner's broadcaster
Broadcaster outsiderBroadcaster = (Broadcaster) resource
.getAtmosphereConfig().getServletContext()
.getAttribute(partner);
if (outsiderBroadcaster == null) {
sendMessage(selfBroadcaster, "Invalid user " + partner);
return;
}
// broadcast to partner
outsiderBroadcaster.broadcast(" **" + message);
必要な情報をすべて提供したことを願っています。必要に応じて、さらに情報を提供できます。
問題は、グローバル メッセージが送信されることです。パートナーへのメッセージが送信されると、ブロックされる場合があり、メッセージはクライアントでまったく受信されません。これは、3 ~ 4 件のメッセージの後に一貫して発生します。
スレッドの問題はありますか?私は何を間違っていますか?
誰かがこれで私を助けてくれることを願っています。