我用Java开发了一个CometD客户端服务,在我将CometD 2.5.0升级到CometD 3.0.6之前一直运行良好。 (jetty-client-7.6.0到9.2.1也是如此)。我看了升级的文档,我在网上浏览了一下,自己花时间。没运气。希望有人能告诉我哪里错了。
这是一个例外:
2015-11-04 17:18:24 INFO ResponseNotifier:197 - Exception while notifying listener org.cometd.client.transport.LongPollingTransport$2@35d92de8
java.lang.NullPointerException
at java.util.concurrent.ConcurrentHashMap.hash(ConcurrentHashMap.java:333)
at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:988)
at org.cometd.common.AbstractClientSession.getReleasableChannel(AbstractClientSession.java:277)
at org.cometd.common.AbstractClientSession.receive(AbstractClientSession.java:230)
at org.cometd.client.BayeuxClient.processMessage(BayeuxClient.java:787)
at org.cometd.client.BayeuxClient$PublishTransportListener.processMessage(BayeuxClient.java:1193)
at org.cometd.client.BayeuxClient$PublishTransportListener.onMessages(BayeuxClient.java:1185)
at org.cometd.client.transport.LongPollingTransport$2.onComplete(LongPollingTransport.java:254)
at org.eclipse.jetty.client.ResponseNotifier.notifyComplete(ResponseNotifier.java:193)
at org.eclipse.jetty.client.ResponseNotifier.notifyComplete(ResponseNotifier.java:185)
at org.eclipse.jetty.client.HttpReceiver.terminateResponse(HttpReceiver.java:446)
at org.eclipse.jetty.client.HttpReceiver.responseSuccess(HttpReceiver.java:393)
at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.messageComplete(HttpReceiverOverHTTP.java:265)
at org.eclipse.jetty.http.HttpParser.parseContent(HttpParser.java:1430)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:1272)
at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.parse(HttpReceiverOverHTTP.java:156)
at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.process(HttpReceiverOverHTTP.java:117)
at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.receive(HttpReceiverOverHTTP.java:69)
at org.eclipse.jetty.client.http.HttpChannelOverHTTP.receive(HttpChannelOverHTTP.java:89)
at org.eclipse.jetty.client.http.HttpConnectionOverHTTP.onFillable(HttpConnectionOverHTTP.java:108)
at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
at java.lang.Thread.run(Thread.java:745)
请查找我的Java客户端代码:
HttpClient httpClient = new HttpClient();
httpClient.start();
final String cometdUrl = RestAssured.baseURI + COMETD_PATH;
ClientTransport transport = new LongPollingTransport(null, httpClient);
bayeuxClient = new BayeuxClient(cometdUrl, transport);
bayeuxClient.putCookie(new HttpCookie("JSESSIONID", token));
bayeuxClient.getChannel(Channel.META_HANDSHAKE).addListener(new ClientSessionChannel.MessageListener() {
@Override
public void onMessage(ClientSessionChannel channel, Message message) {
if (message.isSuccessful()) {
logger.info("Handshake done!");
for (UVChannel channelValue : UV_CHANNELS) {
bayeuxClient.getChannel(channelValue.value()).subscribe(new ClientSessionChannel.MessageListener() {
@Override
public void onMessage(ClientSessionChannel channel, Message message) {
if (message.isSuccessful()) {
try {
BlockingQueue<Message> notificationsPerChannel = notifications.get(uvChannel(message.getChannel()));
notificationsPerChannel.put(message);
} catch (InterruptedException e) {
throw new IllegalStateException("It was not possible to store a message in the queue");
}
} else throw new IllegalStateException("no subscription to channel: " + message);
}
});
}
} else {
throw new IllegalStateException("Handshake failed! " + cometdUrl);
}
}
});
bayeuxClient.handshake();