【问题标题】:Atmosphere Request Scoped Broadcasts气氛请求范围广播
【发布时间】:2011-07-26 15:27:41
【问题描述】:

我在使用 Atmosphere 0.7.2 限制我的广播范围时遇到问题。

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

我看到了similar question,但我不确定如何将其翻译成我的 POJO,因为我没有扩展 AtmosphereHandler

谢谢

【问题讨论】:

    标签: atmosphere


    【解决方案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);
        }
    }
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-21
        • 2012-08-12
        • 1970-01-01
        • 1970-01-01
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        • 2012-11-17
        相关资源
        最近更新 更多