我有一个使用 CometD 的 Java Web 应用程序。工作流程很简单:
- 我定义了一个服务,该服务在接收通道“/service/hello”上的消息时起作用。该服务需要一个参数“name”。在此基础上,它创建了一个名为:
"/"+message.getDataAsMap().get("name")
。它向该通道附加一个回调方法,该方法将向所有订阅者发回消息。
- Javascript客户端(使用dojo)向通道发布消息
“/service/hello”并订阅名称已发送的频道
以“/service/hello”作为参数。让我们举个例子:
....
cometd.subscribe('/1234', function(message)
{
//do smth on message received;
});
cometd.publish('/service/hello', { name: '1234' });
....
这很好用。现在,我想要实现的是:仅将 Javascript 客户端作为订阅者,并让 Java 客户端进行发布。
我已经使用 Java 客户端 API 的 CometD2 文档中给出的示例进行了尝试,但它没有按预期工作。看起来服务已被调用,但 Javascript 消费者看不到消息。
有可能实现这一目标吗?有什么问题的想法吗?谢谢。
这是服务器端的代码:
public class HelloService extends AbstractService {
public HelloService(BayeuxServer bayeux)
{
super(bayeux, "hello");
addService("/service/hello", "processHello");
}
public void processHello(ServerSession remote, Message message)
{
Map<String, Object> input = message.getDataAsMap();
String name = (String)input.get("name");
String channelId = "/"+name;
addService(channelId, "processId");
processId(remote, message);
}
public void processId(ServerSession remote, Message message)
{
Map<String, Object> input = message.getDataAsMap();
String name = (String)input.get("name");
int i = 0;
Map<String, Object> output = new HashMap<String, Object>();
while(i<1){
i++;
output.put("greeting", "Hello, " + name);
remote.deliver(getServerSession(), "/"+name, output, null);
try {
Thread.sleep(1000); } catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace(); }
}
}
}