首页 文章

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

提问于
浏览
4

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

  • 我已经定义了一个服务,该服务在通道"/service/hello"上接收消息时起作用 . 此服务需要参数"name" . 基于此,它创建了一个名为: "/"+message.getDataAsMap().get("name") 的 Channels . 对于此通道,它附加一个回调方法,该方法将向所有订阅者发回消息 .

  • Javascript客户端(使用dojo)向通道"/service/hello"发布消息,并订阅名称已发送到"/service/hello"作为参数的通道 . 让我们举一个例子:

....
cometd.subscribe('/ 1234',功能(消息)
{
//对收到的消息做了smth;
});

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 回答

  • 3

    remote.deliver() 将"answer"发送到在服务通道上发布的 remote 会话(即客户端) .

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

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

相关问题