气氛请求范围广播

时间:2011-07-26 15:27:41

标签: atmosphere

使用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

由于

2 个答案:

答案 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)

实际上,最后我发现我需要从我的暂停方法中返回一个可播放的广播。该广播公司被重新创建为会话范围,但可供以后的广播使用。只是确保在暂停方法返回之前不要广播任何内容,因为这可能会丢失。