我有一个使用CometD的Java Web应用程序。工作流程很简单:
"/"+message.getDataAsMap().get("name")
的频道。对于此频道,它附加了一个回叫方法,该方法将向所有订阅者发回消息。.... cometd.subscribe('/1234', function(message) { //do smth on message received; }); cometd.publish('/service/hello', { name: '1234' }); ....
这很好用。现在,我想要实现的目标如下:将Javascript客户端仅作为订阅者和Java客户端进行发布。 我已经尝试使用CometD2文档中为Java Client API提供的示例,但它没有按预期工作。看来该服务已被调用,但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(); }
}
}
}
答案 0 :(得分:3)
remote.deliver()
将“回答”发送到在服务频道上发布的remote
会话(即客户端)。
您应该将未经请求的消息发布到正常通道(服务器端尚不存在)。所以,你应该写一些类似
的东西String channelName = "whatever - not beginning with /service";
getBayeux().createIfAbsent(channelName);
getBayeux().getChannel(channelName).publish(getServerSession(), output, null);