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

时间:2011-10-05 08:35:54

标签: java javascript cometd bayeux

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

  1. 我已经定义了一个服务,该服务在通道“/ service / hello”上接收消息时起作用。此服务需要参数“name”。基于此,它创建了一个名为"/"+message.getDataAsMap().get("name")的频道。对于此频道,它附加了一个回叫方法,该方法将向所有订阅者发回消息。
  2. Javascript客户端(使用dojo)向通道发布消息 “/ service / hello”并订阅其名称已发送的频道 到“/ service / hello”作为参数。让我们举一个例子:
  3. ....
        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();            }
            }
        } 
    }
    

1 个答案:

答案 0 :(得分:3)

remote.deliver()将“回答”发送到在服务频道上发布的remote会话(即客户端)。

您应该将未经请求的消息发布到正常通道(服务器端尚不存在)。所以,你应该写一些类似

的东西
String channelName = "whatever - not beginning with /service";
getBayeux().createIfAbsent(channelName);
getBayeux().getChannel(channelName).publish(getServerSession(), output, null);