使用可由Javascript订阅者使用的CometD Java客户端发布消息



我有一个使用CometD的Java web应用程序。工作流程很简单:

  1. 我定义了一个服务,它在通道"/service/hello"上接收消息时起作用。这个服务需要一个参数"name"。在此基础上,它创建一个名为:"/"+message.getDataAsMap().get("name")的通道。对于这个通道,它附加了一个回调方法,该方法将向所有订阅者发送消息。
  2. 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); 

相关内容

  • 没有找到相关文章

最新更新