【问题标题】:cometd bayeux client can't get subscribed acknowledgement?cometd bayeux 客户端无法获得订阅确认?
【发布时间】:2018-02-14 14:09:07
【问题描述】:

实际上,我正在使用文档 https://docs.cometd.org/current/reference/ 中显示的 maven jetty run 在我的本地运行 cometd-demo 服务器,并尝试在 broadcast channel 中订阅和发布某些内容。使用如下所示的 Groovy 脚本,

ClientSessionChannel.MessageListener mylistener = new Mylistener();  

def myurl = "http://localhost:8080/cometd/"

MyHttpClient httpClient = new MyHttpClient();

httpClient.start()

Map<String, Object> options = new HashMap<String, Object>();

ClientTransport transport = new LongPollingTransport(options, httpClient);

BayeuxClient client = new BayeuxClient(myurl, transport)

println 'client started on URL : '+ client.getURL()


client.handshake ( new ClientSessionChannel.MessageListener() {

    public void onMessage(ClientSessionChannel channel, Message message) {
        if (message.isSuccessful()) {   
            println 'Handshake Message : ' + message 
        }
    }
})

boolean handshakecheck = client.waitFor(1000, BayeuxClient.State.CONNECTED);

println 'Handshake check : '+ handshakecheck

    client.batch( new Runnable() {

        public void run() {

            client.getChannel("/foo/hello").subscribe(

                    new ClientSessionChannel.MessageListener() {

                        public void onMessage(ClientSessionChannel channel,
                                              Message message) {
                                println "subscribed : "+ message
                        }
                    })
        }

    });

程序输出:

client started on URL : http://localhost:8080/cometd/
Handshake Message : [minimumVersion:1.0, clientId:fv0ozxw8cb5e11vtlwpacm7afp, supportedConnectionTypes:[websocket, long-polling, callback-polling], advice:[reconnect:retry, interval:0, maxInterval:10000, timeout:20000], channel:/meta/handshake, id:1, version:1.0, successful:true]
Handshake check : true

在这里我无法获得代码中的subscribed 消息。但在服务器日志中打印如下图,

2018-02-12 20:30:32,687 qtp2069584894-17 [ INFO][examples.CometDDemoServlet] Monitored Subscribe from fv0ozxw8cb5e11vtlwpacm7afp,last=0,expire=0 for /foo/hello

更新 1: 我也无法使用callback 方法订阅,我收到的消息为[channel:/meta/subscribe, id:4, subscription:/foo/hello, error:403:denied_by_not_granting:create_denied, successful:false]。我不知道我做错了什么?我只是按照文档步骤操作。提前致谢。

【问题讨论】:

  • 你在哪里发布消息?
  • @BojanPetkovic 在同一频道.. 但在那之前我无法在客户端 onMessage 中获取订阅的消息没关系.. 我说的对吗..?
  • Error : 403. 表示被禁止,可能该主题只能从您的听众无权访问的帐户发布消息。您可能无法在订阅部分收到消息,因为没有发送任何消息。从您的日志中:“last=0”
  • @BojanPetkovic 那么如何正确发布和订阅.. 有点混乱?

标签: groovy cometd


【解决方案1】:

只要在频道/foo/hello 上发布消息,就会调用您传递给subscribe(...) 方法的ClientSessionChannel.MessageListener

您的程序永远不会在该通道上发布消息,因此永远不会调用侦听器,因此永远不会在您的代码中打印 subscribed

您需要仔细检查您要使用的 subscribe() 方法的版本,因为有 2 个版本。

single parameter version 带有一个监听器,而two parameter version 带有一个监听器一个回调。

从您的代码中猜测,您希望 subscribed 日志行位于 callback 中而不是侦听器中,因此您只需更改代码以使用 @987654331 的两个参数版本@方法。

另外,请注意,如果 JVM 在您的 groovy 脚本结束时退出,那么该客户端将消失并且永远不会收到任何消息。

【讨论】:

  • 如你所说,我也尝试了subscribe 的回调方法。它显示error:403:denied_by_not_granting:create denied
  • 发生这种情况是因为 CometD 演示服务器限制了客户端可以发布到的频道,请参阅文档的 this section。将您示例中的频道从/foo/hello 更改为/chat/hello,您将成功。演示的授权人在this file中定义。
  • 抱歉我的回复迟了。学到了 。正如您在回答中所说,保持 Bayeux Client JVM 在订阅中接收已发布结果的正确方法是什么
猜你喜欢
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多