0

我正在尝试创建一个非常简单的 cometD 应用程序。主要是我想动态创建频道。首先,我尝试了 localsession 频道,并在创建后通过客户端 javascript 订阅了它们。它工作完美,但不适用于动态频道创建。让我通过 javascript 传递 rom 变量,ROOM: 'firstroom' 这将创建一个像"/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 在服务器端订阅中的位置。

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

4

2 回答 2

1

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

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

请参阅有关订阅的 CometD JavaScript 文档

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

于 2013-04-29T10:05:15.307 回答
0

如果您从服务器端动态创建通道,您应该查看类的createIfAbsent方法BayeuxServer。这允许您指定通道路径并创建(并初始化)ServerChannel(如果不存在)。

于 2013-05-21T10:58:30.693 回答