1

我无法使用 Atmosphere 0.7.2 限制我的广播范围。

我有一个带有open方法的 Jersey POJO,我想将广播器传递给一个非 web 服务类。这是为了允许分离 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). 在每种情况下,客户端都没有收到任何广播消息。我确实曾经收到一条消息,广播器已被破坏,无法使用,但我不记得我是怎么做到的!

我看到了一个类似的问题,但我不确定如何将它翻译成我的 POJO,因为我没有扩展AtmosphereHandler.

谢谢

4

2 回答 2

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

现在我可以弄清楚如何安排请求范围的固定广播......

于 2011-07-27T10:58:20.620 回答
0

实际上,最后我发现我需要从挂起的方法中返回一个可广播的内容。广播器被重新创建为会话范围,但仍可用于以后的广播。只需确保在挂起的方法返回之前不广播任何内容,因为这可能会丢失。

于 2011-09-07T09:37:36.660 回答