使用Atmosphere 0.7.2时,我无法限制广播的范围。
我有一个带有open
方法的Jersey POJO,我想将广播公司传递给非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()方法完成后创建了一个新的Request-scoped广播公司。
因此,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);
}
}
现在我可以搞清楚如何安排请求范围的固定广播......
答案 1 :(得分:0)
实际上,最后我发现我需要从我的暂停方法中返回一个可播放的广播。该广播公司被重新创建为会话范围,但可供以后的广播使用。只是确保在暂停方法返回之前不要广播任何内容,因为这可能会丢失。