2011-07-26 86 views
1

我在使用Atmosphere 0.7.2時遇到了限制我的廣播範圍的問題。大氣請求範圍廣播

我有一個Jersey POJO,有一個open方法,我想將廣播者傳遞給一個非webservice類。這是爲了讓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,這將與掛起的響應通知客戶端。每個客戶應與一個單獨的廣播公司相關聯。

問題是,此解決方案對所有客戶使用相同的廣播公司。我曾嘗試將@Suspend(scope = Suspend.SCOPE.REQUEST)添加到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); 
    } 
} 

現在我能搞清楚如何調度請求範圍的固定節目做...