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 脚本结束时退出,那么该客户端将消失并且永远不会收到任何消息。
实际上我 运行 在我的本地使用 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 脚本结束时退出,那么该客户端将消失并且永远不会收到任何消息。