การตอบสนองที่ไม่คาดคิดเข้าสู่ระบบ 408 ในฝั่งไคลเอ็นต์ cometd

ฉันใช้ไคลเอ็นต์ java cometd มีการเชื่อมต่อเป็นเวลาหลายนาที แต่หลังจากนั้นครู่หนึ่งก็บันทึกข้อผิดพลาดดังต่อไปนี้ ฉันควรทำอย่างไรใน error 408? ฉันควรยกเลิกการเชื่อมต่อ ยุติ ยกเลิก หรือเพิกเฉย เรียก Java GC หรือไม่

java.net.ProtocolException: การตอบสนองที่ไม่คาดคิด ข้อผิดพลาด HTTP 408 ข้อผิดพลาด 408 คำขอหมดเวลา

เว็บเซิร์ฟเวอร์ (ที่ใช้งานเว็บไซต์) คิดว่ามีช่วงเวลาระหว่างนั้นนานเกินไป

  • การสร้างการเชื่อมต่อ IP (ซ็อกเก็ต) ระหว่างไคลเอนต์ (เช่น เว็บเบราว์เซอร์ของคุณหรือหุ่นยนต์ CheckUpDown ของเรา) และเซิร์ฟเวอร์และ
  • การรับข้อมูลใดๆ บนซ็อกเก็ตนั้น เซิร์ฟเวอร์จึงตัดการเชื่อมต่อ

การเชื่อมต่อซ็อกเก็ตขาดหายไปจริง ๆ - เว็บเซิร์ฟเวอร์มี timed out ในการเชื่อมต่อซ็อกเก็ตนั้นโดยเฉพาะ คำขอจากลูกค้าจะต้องทำซ้ำ - ในเวลาที่เหมาะสม

ขยาย BayeuxClient

    public class EventHostClient extends BayeuxClient {
        private final Logger logger = LoggerFactory.getLogger(EventHostClient.class);

        public EventHostClient(String url, ClientTransport transport, ClientTransport... transports) {
            super(url, transport, transports);
        }

        @Override
        public void onFailure(Throwable x, Message[] messages) {
            logger.info("Messages failed "+ x.getMessage());
            logger.debug("Messages failed. Reason : " + Arrays.toString(messages), x);
        }
}

นี่คือข้อความบันทึก

2017-06-22 17:59:37.221 [HttpClient-2123] DEBUG c.q.q.n.i.eventhost.EventHostClient - Messages failed. Reason : [{id=4681, connectionType=long-polling, channel=/meta/connect, clientId=btom76smmlh9g4dyq2fkcd61}]
java.net.ProtocolException: Unexpected response 408: TransportExchange@5332249c=POST//10.2.2.250:18080/cometd/connect#CONTENT(0ms)->COMPLETED(0ms)sent=1012ms
    at org.cometd.client.BayeuxClient$PublishTransportListener.onProtocolError(BayeuxClient.java:1161) [cometd-java-client-2.5.0.jar:na]
    at org.cometd.client.transport.LongPollingTransport$TransportExchange.onResponseComplete(LongPollingTransport.java:324) [cometd-java-client-2.5.0.jar:na]
    at org.eclipse.jetty.client.HttpExchange$Listener.onResponseComplete(HttpExchange.java:1158) [jetty-client-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.client.HttpExchange.setStatus(HttpExchange.java:305) [jetty-client-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.client.AbstractHttpConnection$Handler.messageComplete(AbstractHttpConnection.java:337) [jetty-client-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:637) [jetty-http-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) [jetty-http-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.client.AsyncHttpConnection.handle(AsyncHttpConnection.java:133) [jetty-client-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:627) [jetty-io-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:51) [jetty-io-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) [jetty-util-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) [jetty-util-7.6.7.v20120910.jar:7.6.7.v20120910]
    at java.lang.Thread.run(Thread.java:745) [na:1.7.0_67]
2017-06-22 17:59:37.221 [HttpClient-2123] DEBUG c.q.q.n.i.sms.ChannelSubscriber - Recieved connection FAILED | {"message":{"id":"4681","connectionType":"long-polling","channel":"/meta/connect","clientId":"btom76smmlh9g4dyq2fkcd61"},"id":"4681","org.cometd.client.publishCallback":null,"exception":"java.net.ProtocolException: Unexpected response 408: TransportExchange@5332249c=POST//10.2.2.250:18080/cometd/connect#CONTENT(0ms)->COMPLETED(0ms)sent=1012ms","successful":false,"channel":"/meta/connect"} to subscriber id : 1
2017-06-22 17:59:37.221 [pool-513-thread-1] DEBUG c.q.q.n.i.e.E.1264409962 - Connecting, transport org.cometd.client.transport.LongPollingTransport@43e7229c
2017-06-22 17:59:37.221 [pool-513-thread-1] DEBUG c.q.q.n.i.e.E.1264409962 - Sending messages [{id=4683, connectionType=long-polling, channel=/meta/connect, clientId=btom76smmlh9g4dyq2fkcd61}]
2017-06-22 17:59:39.221 [pool-513-thread-1] DEBUG c.q.q.n.i.e.E.1264409962 - Connecting, transport org.cometd.client.transport.LongPollingTransport@43e7229c
2017-06-22 17:59:39.225 [pool-513-thread-1] DEBUG c.q.q.n.i.e.E.1264409962 - Sending messages [{id=4684, connectionType=long-polling, channel=/meta/connect, clientId=btom76smmlh9g4dyq2fkcd61}]
2017-06-22 17:59:39.230 [HttpClient-2123] DEBUG c.q.q.n.i.e.E.1264409962 - State update: CONNECTED -> UNCONNECTED
2017-06-22 17:59:39.230 [HttpClient-2123] INFO  c.q.q.n.i.eventhost.EventHostClient - Messages failed Unexpected response 408: TransportExchange@101a870=POST//10.2.2.250:18080/cometd/connect#CONTENT(0ms)->COMPLETED(0ms)sent=2009ms
2017-06-22 17:59:39.230 [HttpClient-2123] DEBUG c.q.q.n.i.eventhost.EventHostClient - Messages failed. Reason : [{id=4683, connectionType=long-polling, channel=/meta/connect, clientId=btom76smmlh9g4dyq2fkcd61}]
java.net.ProtocolException: Unexpected response 408: TransportExchange@101a870=POST//10.2.2.250:18080/cometd/connect#CONTENT(0ms)->COMPLETED(0ms)sent=2009ms
    at org.cometd.client.BayeuxClient$PublishTransportListener.onProtocolError(BayeuxClient.java:1161) [cometd-java-client-2.5.0.jar:na]
    at org.cometd.client.transport.LongPollingTransport$TransportExchange.onResponseComplete(LongPollingTransport.java:324) [cometd-java-client-2.5.0.jar:na]
    at org.eclipse.jetty.client.HttpExchange$Listener.onResponseComplete(HttpExchange.java:1158) [jetty-client-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.client.HttpExchange.setStatus(HttpExchange.java:305) [jetty-client-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.client.AbstractHttpConnection$Handler.messageComplete(AbstractHttpConnection.java:337) [jetty-client-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:637) [jetty-http-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) [jetty-http-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.client.AsyncHttpConnection.handle(AsyncHttpConnection.java:133) [jetty-client-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:627) [jetty-io-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:51) [jetty-io-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) [jetty-util-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) [jetty-util-7.6.7.v20120910.jar:7.6.7.v20120910]
    at java.lang.Thread.run(Thread.java:745) [na:1.7.0_67]
2017-06-22 17:59:39.230 [HttpClient-2123] DEBUG c.q.q.n.i.sms.ChannelSubscriber - Recieved connection FAILED | {"message":{"id":"4683","connectionType":"long-polling","channel":"/meta/connect","clientId":"btom76smmlh9g4dyq2fkcd61"},"id":"4683","org.cometd.client.publishCallback":null,"exception":"java.net.ProtocolException: Unexpected response 408: TransportExchange@101a870=POST//10.2.2.250:18080/cometd/connect#CONTENT(0ms)->COMPLETED(0ms)sent=2009ms","successful":false,"channel":"/meta/connect"} to subscriber id : 1
2017-06-22 17:59:40.231 [pool-513-thread-1] DEBUG c.q.q.n.i.e.E.1264409962 - Connecting, transport org.cometd.client.transport.LongPollingTransport@43e7229c
2017-06-22 17:59:40.231 [pool-513-thread-1] DEBUG c.q.q.n.i.e.E.1264409962 - Sending messages [{id=4685, connectionType=long-polling, advice={timeout=0}, channel=/meta/connect, clientId=btom76smmlh9g4dyq2fkcd61}]
2017-06-22 17:59:40.236 [HttpClient-2120] DEBUG c.q.q.n.i.e.E.1264409962 - State update: UNCONNECTED -> UNCONNECTED
2017-06-22 17:59:40.236 [HttpClient-2124] DEBUG c.q.q.n.i.e.E.1264409962 - Processing meta connect {id=4685, successful=true, channel=/meta/connect, advice={interval=0, reconnect=retry, timeout=30000}}
2017-06-22 17:59:40.236 [HttpClient-2120] INFO  c.q.q.n.i.eventhost.EventHostClient - Messages failed Unexpected response 408: TransportExchange@13d95194=POST//10.2.2.250:18080/cometd/connect#CONTENT(0ms)->COMPLETED(0ms)sent=1010ms
2017-06-22 17:59:40.236 [HttpClient-2124] DEBUG c.q.q.n.i.e.E.1264409962 - State update: UNCONNECTED -> CONNECTED
2017-06-22 17:59:40.236 [HttpClient-2124] DEBUG c.q.q.n.i.sms.ChannelSubscriber - Recieved connection confirmed | {"id":"4685","successful":true,"channel":"/meta/connect","advice":{"interval":0,"reconnect":"retry","timeout":30000}} to subscriber id : 1
2017-06-22 17:59:40.236 [HttpClient-2120] DEBUG c.q.q.n.i.eventhost.EventHostClient - Messages failed. Reason : [{id=4684, connectionType=long-polling, channel=/meta/connect, clientId=btom76smmlh9g4dyq2fkcd61}]
java.net.ProtocolException: Unexpected response 408: TransportExchange@13d95194=POST//10.2.2.250:18080/cometd/connect#CONTENT(0ms)->COMPLETED(0ms)sent=1010ms
    at org.cometd.client.BayeuxClient$PublishTransportListener.onProtocolError(BayeuxClient.java:1161) [cometd-java-client-2.5.0.jar:na]
    at org.cometd.client.transport.LongPollingTransport$TransportExchange.onResponseComplete(LongPollingTransport.java:324) [cometd-java-client-2.5.0.jar:na]
    at org.eclipse.jetty.client.HttpExchange$Listener.onResponseComplete(HttpExchange.java:1158) [jetty-client-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.client.HttpExchange.setStatus(HttpExchange.java:305) [jetty-client-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.client.AbstractHttpConnection$Handler.messageComplete(AbstractHttpConnection.java:337) [jetty-client-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:637) [jetty-http-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) [jetty-http-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.client.AsyncHttpConnection.handle(AsyncHttpConnection.java:133) [jetty-client-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:627) [jetty-io-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:51) [jetty-io-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) [jetty-util-7.6.7.v20120910.jar:7.6.7.v20120910]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) [jetty-util-7.6.7.v20120910.jar:7.6.7.v20120910]
    at java.lang.Thread.run(Thread.java:745) [na:1.7.0_67]

person rinjan    schedule 22.06.2017    source แหล่งที่มา
comment
มีปัญหาตรงไหน?   -  person ByeBye    schedule 22.06.2017
comment
ฉันไม่แน่ใจเกี่ยวกับผลกระทบใด ๆ เนื่องจากพฤติกรรมนี้ ปัญหาที่แจ้งว่าเป็นข้อผิดพลาดของโปรโตคอล มีอะไร (เช่น: ตัดการเชื่อมต่อ, เชื่อมต่อ, ... ) ฉันสามารถแก้ไขได้เพื่อแก้ไขข้อผิดพลาด 408 stacktrace : onProtocolError (BayeuxClient.java:1161   -  person rinjan    schedule 22.06.2017


คำตอบ (2)


อย่างที่คุณเห็น มันเป็นการตอบกลับ 408 HTTP

ฉันควรยกเลิกการเชื่อมต่อ ยุติ ยกเลิก หรือเพิกเฉย เรียก Java GC หรือไม่

  • ยกเลิกการเชื่อมต่อ: เนื่องจากการเชื่อมต่อหมดเวลา (2009ms) คุณไม่จำเป็นต้องยกเลิกการเชื่อมต่อจริงๆ เนื่องจากไคลเอ็นต์ล้มเหลวในการเชื่อมต่อกับเซิร์ฟเวอร์ และจะลองอีกครั้งตามบันทึกของคุณ
  • ยุติ เพิกเฉย: ขึ้นอยู่กับตรรกะทางธุรกิจของคุณจริงๆ หากคุณต้องการย้อนกลับธุรกรรม ฯลฯ
  • โทรหา GC: มันไม่ได้ทำอะไรเลยจริงๆ

TL.DR.: การตัดสินใจควรกระทำตามตรรกะทางธุรกิจ เนื่องจากทุกเครือข่ายอาจล้มเหลวได้หลายวิธี

person Hash    schedule 28.06.2017
comment
ขอบคุณสำหรับการตอบกลับ. เรากำลังส่งข้อความจากเซิร์ฟเวอร์ cometd ไปยังไคลเอนต์ ไคลเอนต์ Cometd จะใช้ข้อความเหล่านั้นและส่งอีเมล‹br› เซิร์ฟเวอร์ส่งการตอบกลับ 408 นี่ไม่ใช่ความล้มเหลวของเครือข่ายใช่ไหม - person rinjan; 28.06.2017
comment
โทร GC - ลูกค้า Commetd เริ่มต้นเซิร์ฟเวอร์ HttpClients ฉันคิดว่าไคลเอนต์ http หลายตัวเชื่อมต่ออย่างถูกต้อง ดังนั้นจึงทำให้เกิดปัญหา 408 ฉันคิดว่าการเรียก GC อาจทำลายอินสแตนซ์ httpclient เหล่านั้น แต่ขึ้นอยู่กับวิธีที่ไคลเอนต์ cometd จัดการกับวัตถุ httpclient - person rinjan; 28.06.2017
comment
ใช่ https://httpstatuses.com/408 สิ่งนี้บ่งชี้ว่าเซิร์ฟเวอร์ไม่พร้อมใช้งานเป็นเวลาอย่างน้อยสักครู่ อาจเป็นข้อผิดพลาดของเครือข่ายและแอปพลิเคชันเซิร์ฟเวอร์ไม่ทำงานเช่นกัน ลูกค้าควรจัดการ GC roots ของตัวเอง คุณไม่จำเป็นต้องดูแลพวกเขาในกรณีนี้ เท่าที่ฉันรู้ - person Hash; 28.06.2017
comment
ขอบคุณ. httpstatuses.com/408 บอกว่าหากลูกค้ามีคำขอคงค้างระหว่างการขนส่ง ลูกค้าอาจทำซ้ำคำขอนั้นในการเชื่อมต่อใหม่ ฉันคิดว่าไคลเอนต์ cometd ทำได้โดยเริ่มต้นอินสแตนซ์ HttpClient ใหม่ (HttpClient-2120 ถึง 2125 ในไฟล์บันทึก) ถูกต้องไหม? - person rinjan; 28.06.2017
comment
ตามบันทึกของคุณมันเป็นเช่นนั้น :) - person Hash; 28.06.2017
comment
ตามความคิดเห็นของคุณ ดูเหมือนว่าไม่มีผลกระทบใดๆ เนื่องจากปัญหานี้ ดังนั้นเราจึงไม่จำเป็นต้องแก้ไข มีวิธีที่ฉันสามารถหยุดบันทึกข้อความเหล่านั้นได้หรือไม่? มันใช้พื้นที่มากในไฟล์บันทึก ฉันพยายามยุติการเชื่อมต่อเก่าเหล่านั้น (httpclients) โดยการเรียกการยกเลิกการเชื่อมต่อ ยุติวิธีการ แต่จะไม่หยุดการบันทึกข้อความภายใต้ httpclient id เดียวกัน - person rinjan; 28.06.2017
comment
นั่นคือข้อความแก้ไขข้อบกพร่อง หากคุณยกระดับบันทึกเป็น INFO จะไม่บันทึกข้อความประเภทเหล่านั้น - person Hash; 28.06.2017
comment
ขอบคุณมาร์ค ขออภัยที่ไม่ได้ให้รหัสก่อนหน้านี้ เราบันทึกข้อความภายใต้ข้อมูลและแก้ไขข้อบกพร่อง แม้แต่ในระดับข้อมูลก็ยังมีรายการบันทึกมากมาย - person rinjan; 28.06.2017
comment
คุณจะรังเกียจที่จะยอมรับคำตอบหรือไม่ถ้ามันเป็นคำตอบที่ดีสำหรับคุณ? :) - person Hash; 11.07.2017

ฉันตั้งคำถามใน GitHub ที่โฮสต์โครงการ ผู้เขียน (Mr. Simone Bordet) ของดาวหางกล่าวว่าฉันใช้ดาวหางเวอร์ชันเก่ามาก เขาขอให้ฉันอัปเกรดเป็น cometd 3.1.2 ขณะนี้เรากำลังอัปเกรดแอปของเราด้วย cometd

https://github.com/cometd/cometd/issues/730

person rinjan    schedule 05.07.2017