cometd bayeux 客户端无法获得订阅确认?

cometd bayeux client can't get subscribed acknowledgement?

实际上我 运行 在我的本地使用 maven jetty 运行 宁 cometd-demo 服务器 https://docs.cometd.org/current/reference/ 并尝试在 [=13] 中订阅和发布一些东西=].使用如下所示的 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]。我不知道我做错了什么?我只是按照文档步骤进行操作。提前致谢。

只要在通道 /foo/hello.

上发布消息,就会调用您传递给 subscribe(...) 方法的 ClientSessionChannel.MessageListener

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

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

single parameter version takes a listener, while the two parameter version需要一个监听器一个回调。

根据您的代码猜测,您希望 subscribed 日志行位于 回调 而不是监听器中,因此您只需要更改代码以使用subscribe() 方法的两个参数版本。

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