2010-12-28 8 views
4

私は大気中ランタイム0.6スナップショットを使用しています。 Tomcat 7は、Http11 Nioコネクタを使用していることを正しくログしており、BlockingIOが使用されるという警告は表示されません。大気中ランタイムを使用して単一接続にブロードキャストできません

3種類のチャンネルにメッセージを送信しようとしています。

  1. グローバルブロードキャスタ - すべての中断されたリソースにブロードキャストします。 (すべての)
  2. 放送特定のリソース(たとえば、パートナー)に現在のリソースへ
  3. ブロードキャストするために、私はセッションに格納する必要が何をすべきか、すべての(自己)ログインアクションが発生

、この種の放送を達成する?次のように

私のコードのいくつかの詳細は以下のとおりです。私のハンドラは、コンストラクタでAtmosphereHandler

  • を実装

    1. 次のように、私はglobalBroadcasterをインスタンス化:ログインで

      globalBroadcaster = new DefaultBroadcaster();

    2. resource.getAtmosphereConfig().getServletContext().setAttribute(name, selfBroadcaster); ここで、nameは要求パラメータのユーザー名で、selfBroadcasterはDefaultBroadcasterの新しいインスタンスです。ここで

    3. は私がすべての必要な情報を与えられたと思っている

    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);

    、sendMessageToPartnerためのコードです。必要に応じてさらに情報を提供することができます。

    問題は、グローバルメッセージが送信されることです。パートナーへのメッセージが送信されると、ブロックされることもありますが、メッセージはクライアントでまったく受信されません。これは3-4のメッセージの後に一貫して起こります。

    スレッドの問題がありますか?私は間違って何をしていますか?

    私は誰かがこれで私を助けてくれることを願っています。

  • 答えて

    6

    私はこれをAtmosphereランタイムでどのように実現できるかを考えました。 最初に、私は0.7 SNAPSHOTにアップグレードしましたが、同じロジックが0.6でもうまくいくと思います。ログインアクションが呼び出されると、

    //Get this broadcaster from session and add it to BroadcasterFactory. 
    
    Broadcaster selfBroadcaster = (Broadcaster) session.getAttribute(sessionId); 
    
    BroadcasterFactory.getDefault().add(selfBroadcaster, name); 
    
    Now the global broadcaster. The logic here is, you create a broadcaster from the first resource and then add each resource as they log in. 
    
    Broadcaster globalBroadcaster; 
    
    globalBroadcaster = BroadcasterFactory.getDefault().lookup(DefaultBroadcaster.class, GLOBAL_TOKEN, false); 
           if (globalBroadcaster == null) { 
            globalBroadcaster = selfBroadcaster; 
    
            } else { 
             BroadcasterFactory.getDefault().remove(
               globalBroadcaster, GLOBAL_TOKEN); 
             AtmosphereResource r = (AtmosphereResource) session 
               .getAttribute("atmoResource"); 
             globalBroadcaster.addAtmosphereResource(r); 
    
            } 
            BroadcasterFactory.getDefault().add(globalBroadcaster, 
              GLOBAL_TOKEN); 
    

    最後に、あなたがシングルにブロードキャストすることができます

    // Use one Broadcaster per AtmosphereResource    
    try {  
    atmoResource.setBroadcaster(BroadcasterFactory.getDefault().get());  
    
    } catch (Throwable t) { 
           throw new IOException(t); 
          } 
    
          // Create a Broadcaster based on this session id. 
          selfBroadcaster = atmoResource.getBroadcaster(); 
          // add to the selfBroadcaster 
          selfBroadcaster.addAtmosphereResource(atmoResource); 
    
          atmoResource.suspend(); 
    

    、GETリクエストで

    :シングルユーザーのための放送局を作成するので、

    、次のようにすべての接続にグローバルに接続します。

    // Single Connection/Session 
    Broadcaster singleBroadcaster= BroadcasterFactory.getDefault().lookup(
              DefaultBroadcaster.class, name); 
    singleBroadcaster.broadcast("Only for you"); 
    
    // Global 
    Broadcaster globalBroadcaster = BroadcasterFactory.getDefault().lookup(DefaultBroadcaster.class,GLOBAL_TOKEN, false); 
    globalBroadcaster.broadcast("Global message to all"); 
    

    パートナーにメッセージを送信するには、パートナーのブロードキャスタを検索して、単一接続の場合と同じ操作を行います。

    これは、これを達成しようとする人に役立ちます。 これを行うにはより良い方法があります。 誰かがより良い解決策を提案するまでこのアプローチを使用しなければならないと思います。

    関連する問題