2016-07-14 6 views
0

指定されたuserIdに関連付けられたServerSessionのリストを見つける方法はありますか?Cometd Set - 指定されたuserIdに関連付けられたServerSessionのリストを見つける方法はありますか?

public boolean associate(final String userId, final ServerSession session) 
    { 
     if (session == null) 
      throw new NullPointerException(); 

     LocalLocation location = new LocalLocation(userId, session); 
     boolean wasAssociated = isAssociated(userId); 
     boolean added = associate(userId, location); 

     if (added) 
     { 
      session.addListener(location); 
      if (_logger.isDebugEnabled()) 
       _logger.debug("Associated session {} to user {}", session, userId); 
      if (!wasAssociated) 
      { 
       if (_logger.isDebugEnabled()) 
        _logger.debug("Broadcasting association addition for user {}", userId); 
       // Let everyone in the cluster know that this session is here 
       _session.getChannel(SETI_ALL_CHANNEL).publish(new SetiPresence(true, userId)); 
      } 
     } 

     return added; 
    } 

ユーザがすでに関連付けられている場合、setiはSETI_ALL_CHANNELに公開して他の彗星に通知しません。

詳細Explanation-

私はブラウザにデータベース変更通知をプッシュするcometdオールトのクラスタを実装しています。

2つのノードはマスター/スレーブと見なされます。マスタノードは、データベースからの通知のみを受信します。

ユーザーはスレーブノード経由で接続されます。 ユーザーが最初にスレーブノードとハンドシェイクすると、setiはイベントユーザーのプレゼンスが追加されたことをパブリッシュします。

クラスタ内の両方のノードは、クラウド内のユーザーについて知っています。 ユーザーがブラウザをリフレッシュすると、新しい(2番目の)ハンドシェイクが開始されます。 userId(loginUserId)は同じままです。 Setiは設計上正しいクラスタにパブリッシュしません。

一定時間が経過すると、最初のハンドシェイクによるセッションは、非アクティブのために削除されます。存在が除去されたイベントは、setiによって発生します。これは、設計上も予想されます。

スレーブノードは、ユーザーが2番目のハンドシェイクで接続されていることを認識しますが、マスターノードはユーザーがクラウドに存在することを認識しません。

新しいイベントがデータベースから到着すると、マスターノードはクラウド内のユーザーを認識しないため、イベントはブラウザに転送されません。また、この時点でマスターノードとスレーブノードが接続されています。クラスタに接続しているユーザーは、2つのノード間で同期されません。

私はseti/disassociateを行い、同じユーザーのセッションを設定/関連付けることを考えていました。

私たちは、セッションのリストを取得することができますが、クライアントIDを通じて

seti.getOort().getBayeuxServer().getSessions(); 


// clientId - previous client session id need to be identified 
    ServerSession serverSession=seti.getOort().getBayeuxServer().getSession(clientId); 

をconnected-、サーバー・セッションを取得することができますし、解離は、ユーザーのために行うことができます。それが唯一解雇されているので

seti.disassociate(loginUserId, serverSession); 

boolean association=seti.associate(loginUserId, serverSession);//new handshake- serverSession 
+0

質問が何であるかは不明です。ユーザーがすでに関連付けられている場合、Setiは他のノードに通知するためにパブリッシュしません。これは設計によるものです。他のノードはすでにそれを知っているので、もう一度伝える必要はありません。 – sbordet

+0

私はそのデザインに同意します。あなたがuserIdを与えられた場合、それに関連付けられたローカルセッション(クライアントId)のリストをどのように把握しますか?クライアントIDを知りたい – user2263197

+0

なぜあなたは 'clientId'を知る必要がありますか?あなたはそれを説明しないし、あなたが*問題を説明すれば*あなたを助けてくれるでしょう。 'clientId'を取得する方法を知っていることを尋ねることはあなたの問題の一つの解決策ですが、それは間違ったものかもしれません。 *問題*を最初に説明してください。 – sbordet

答えて

0

あなたはスレーブノードに接続された2つのセッションを持っている場合は、そのうちの一つが消えるが、その後、セティはないは、プレゼンス削除イベントをブロードキャストしますときにuserIdためのすべての関連付けノードがなくなった。

これは、1つのノードにまだ関連があるのを避けるためですが、他のノードはユーザーがクラウドからなくなったと考えています。

これが起こっているという証拠がある場合は、バグですが、この特定の動作はCometDテストスイートでテストされています。

関連する問題