实际上我正在我的本地运行cometd-demo服务器,使用文档https://docs.cometd.org/current/reference/中显示的maven jetty run并试图在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]
。我不知道我做错了什么?我只是按照文档步骤。提前谢谢。
答案 0 :(得分:1)
只要在频道ClientSessionChannel.MessageListener
上发布消息,就会调用您传递给subscribe(...)
方法的/foo/hello
。
您的程序从不在该频道上发布消息,因此永远不会调用侦听器,因此在您的代码subscribed
中永远不会打印。
您想要仔细检查要使用的subscribe()
方法的版本,因为有2个版本。
single parameter version接听一个监听器,而two parameter version接听一个监听器和一个回调。
从您的代码中猜测,您希望{em}回调中的subscribed
日志行不在侦听器中,因此您只需要更改代码以使用两个参数版本的subscribe()
方法。
另外,请注意以下事实:如果JVM在您的groovy脚本结束时退出,那么该客户端将会消失并且永远不会收到任何消息。