我有一个使用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客户端负责发布。我使用CometD2文档中给出的Java客户机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(); }
}
}
}
remote.deliver()
向remote
会话(即客户端)发送发布在业务通道上的"应答"。
您应该将未经请求的消息发布到正常通道(在服务器端还不存在)。所以,你应该写像
这样的东西String channelName = "whatever - not beginning with /service";
getBayeux().createIfAbsent(channelName);
getBayeux().getChannel(channelName).publish(getServerSession(), output, null);