【问题标题】:Cometd how to make and subscribe channel dynamically?Cometd 如何动态制作和订阅频道?
【发布时间】:2013-04-22 08:06:49
【问题描述】:

我正在尝试创建一个非常简单的 cometD 应用程序。 主要是我想动态创建频道。 首先,我尝试了 localsession 频道,并在创建后通过客户端 javascript 订阅了它们。 它工作完美,但不适用于动态频道创建。 让我通过 javascript ROOM: 'firstroom' 传递 rom 变量 这将创建一个类似"/members/firstroom".的频道

但是在另一个用户(例如 ROOM)的另一个呼叫中:'anotherroom' 它创建了另一个房间,但破坏了旧房间。

简单来说,我希望所有动态创建的频道都存储在内存中。 我试过的客户会话:

ClientSessionChannel channel = _session.getLocalSession().getChannel('/members/'+room);
channel.publish(members);

然后我尝试像这样在服务器上创建和订阅:

ServerChannel channel = _bayeux.getChannel("/member"+room);
LocalSession localSession = _session.getLocalSession();

channel.subscribe(client);
ServerMessage.Mutable forward = _bayeux.newMessage();
forward.setData(_members);

channel.publish(localSession, forward);

但我在想服务器端订阅将如何改变客户端 html 代码。 怎么样

channel.publish(localSession, forward);

将替换

$.cometd.subscribe('/members', manage_members);

manage_members 在服务器端订阅中的位置。

直截了当如何动态创建和存储频道?

【问题讨论】:

    标签: java servlets comet cometd channels


    【解决方案1】:

    如果您从服务器端动态创建频道,您应该查看createIfAbsent method of the BayeuxServer class。这允许您指定通道路径并在不存在时创建(并初始化)ServerChannel。

    【讨论】:

      【解决方案2】:

      我不确定我是否完全理解这个问题,但是如果客户端知道频道的动态部分,您可以通过以下方式轻松地从 JavaScript 订阅:

      cometd.subscribe('/members/' + roomName, function(message) { ... });
      

      请参阅CometD JavaScript documentation about subscription

      如果动态部分是在服务器端计算的,那么您的客户端 - 为了接收消息,必须订阅 /members/* 并过滤掉不需要的房间的消息。 或者,服务器应该向客户端发送一条消息,告诉它要订阅的确切频道。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        相关资源
        最近更新 更多