我正在初始化 Bayeux 客戶端:SslContextFactory sslContextFactory = new SslContextFactory(true);HttpClient httpClient = new HttpClient(sslContextFactory);httpClient.start();Map<String, Object> options = new HashMap<String, Object>();ClientTransport transport = new LongPollingTransport(options, httpClient);BayeuxClient client = new BayeuxClient("https://localhost:8483/cometd/", transport);client.handshake();boolean handshaken = client.waitFor(20000, BayeuxClient.State.CONNECTED);if (!handshaken) { LOGGER.info("Failed to handshake"); throw new RuntimeException("Failed to handshake");}我用它與服務(wù)器進行一些通信,它可以工作,它訂閱頻道、發(fā)送、接收,然后我讓它閑置一段時間。我得到以下異常:java.util.concurrent.TimeoutException: Idle timeout 20000 msat org.eclipse.jetty.client.http.HttpConnectionOverHTTP.onIdleExpired(HttpConnectionOverHTTP.java:145)at org.eclipse.jetty.io.ssl.SslConnection.onIdleExpired(SslConnection.java:286)at org.eclipse.jetty.io.AbstractEndPoint.onIdleExpired(AbstractEndPoint.java:401)at org.eclipse.jetty.io.IdleTimeout.checkIdleTimeout(IdleTimeout.java:166)at org.eclipse.jetty.io.IdleTimeout$1.run(IdleTimeout.java:50)at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)at java.util.concurrent.FutureTask.run(FutureTask.java:266)at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)
2 回答

猛跑小豬
TA貢獻1858條經(jīng)驗 獲得超8個贊
事實證明,我阻塞了 cometD 線程:
我構(gòu)建了一個命令行工具來檢查服務(wù)器,當我收到一條消息(帶有來自 cometD 的線程)時,我持有該線程以供用戶輸入。如果我持有該線程足夠長的時間,cometD 將與上述異常斷開連接。
解決方案:當你收到 CometD 的消息時,不要持有它,使用新線程。

子衿沉夜
TA貢獻1828條經(jīng)驗 獲得超3個贊
默認心跳由服務(wù)器端timeout
參數(shù)控制,默認為30秒。這意味著當系統(tǒng)空閑時,長輪詢每 30 秒發(fā)生一次。
您已idleTimeout
在 20 秒時配置了客戶端,這從您的異常堆棧跟蹤中可以明顯看出。
當系統(tǒng)空閑時,客戶端將在心跳(長輪詢)響應(yīng)之前超時連接,導(dǎo)致您看到的錯誤。
將客戶端配置為idleTimeout
大于心跳的值就足夠了timeout
,或者 - 等效地 - 將心跳設(shè)置timeout
為小于客戶端的值idleTimeout
。
添加回答
舉報
0/150
提交
取消