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

时间:2018-02-12 15:15:25

标签: groovy cometd

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

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]。我不知道我做错了什么?我只是按照文档步骤。提前谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

从您的代码中猜测,您希望{em}回调中的subscribed日志行不在侦听器中,因此您只需要更改代码以使用两个参数版本的subscribe()方法。

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