2011-07-26 9 views
1

大気0.7.2を使用して、私のブロードキャストの範囲を制限することに問題があります。大気要求スコープ付きブロードキャスト

私はopenメソッドを使用しているジャージーPOJOを持っており、ブロードキャスタを非ウェブサービスクラスに渡したいと思います。これは、WAR層とEJB層の分離を可能にするためです。

@Path("/") 
public class MyJerseyPojo { 
    @Context 
    private Broadcaster broadcaster; 

    @GET 
    @Suspend 
    public String open() { 
     Manager.register(/* Session ID */, new NonWebservice(this.broadcaster)); 
     return ""; 
    } 
} 

public class NonWebService implements Sender { 
    private Broadcaster broadcaster; 

    public NonWebService(Broadcaster b) { 
     this.broadcaster = b; 
    } 

    @Override 
    public void send(String thing) { 
     this.broadcaster.broadcast(thing); 
    } 
} 

アイデアは、その更新イベントがsendを呼び出しますであり、これは中断し、応答をクライアントに通知します。各クライアントは別々の放送事業者と関連している必要があります。

問題は、このソリューションはすべてのクライアントに同じブロードキャスタを使用することです。私はをopenメソッドに追加しようとしましたが、ブロードキャストメッセージは受信されません。

私もopen方法で次のように試してみました:

@GET 
@Suspend 
public String open() { 
    Broadcaster b = BroadcasterFactory.getDefault().get(JerseyBroadcaster.class, UUID.randomUUID()); 
    b.setScope(Broadcaster.SCOPE.REQUEST); 
    Manager.register(/* Session ID */, new NonWebservice(b)); 
} 

これは@Suspendまたは@Suspend(scope = Suspend.SCOPE.REQUEST)のいずれかを使用して、動作しませんでした。いずれの場合も、クライアントはブロードキャストメッセージを受信しませんでした。私は放送局が破壊されて使用できないというメッセージを受け取りましたが、私はこれをどのようにしたのか覚えていません!

私はsimilar questionを見ましたが、私はそれを私のPOJOにどのように翻訳するのか分かりません。AtmosphereHandlerを拡張していません。

おかげ

答えて

0

を行うことができます私の中断された方法から放送可能なものを返す必要があることを発見しました。放送局はセッションスコープとして再作成されましたが、後の放送で利用可能でした。停止されたメソッドが返されるまで何もブロードキャストしないようにしてください。失われる可能性があります。

1

それはAtmosphereFilterが完了し、私のopen()メソッドの後に新しい、リクエストスコープの放送局を作成していたとして、それは、キャッシュ放送局に安全ではないことを、掘削の多くの後、判明。したがって

NonWebserviceクラスで次のようになります。

public class NonWebService implements Sender { 
    private Class<? extends Broadcaster> clazz; 
    private Object broadcasterId; 

    public NonWebService(Class<? extends Broadcaster> clazz, Object broadcasterId) { 
     this.clazz = clazz; 
     this.broadcasterId = broadcasterId; 
    } 

    @Override 
    public void send(String thing) { 
     Broadcaster b = BroadcasterLookup.getDefault().get(this.clazz, this.broadcasterId); 
     b.broadcast(thing); 
    } 
} 

今、私は最後に、実際に...リクエストスコープの固定放送のスケジュールを設定する方法を考え出すと

関連する問題