Я использую tomcat 9.0.5 (jdk-9.0.4 + 11) для обслуживания моих запросов, в которых также включен протокол Http / 2 для постоянного соединения, и мой клиент также использует ту же версию java, мне нужно открыть постоянный подключение к серверу от клиента и повторное использование до бесконечности. Я могу успешно подключиться к моему серверу с клиента и отправить запрос (сообщение с requestBody), но после 3 запросов (ровно 3) сервер выдает в качестве исключения следующее:
org.apache.coyote.AbstractProtocol $ Ошибка ConnectionHandler.process
запрос на чтение, игнорируется java.lang.NullPointerException в
org.apache.coyote.http2.HpackDecoder.handleIndex (HpackDecoder.java:270)
в org.apache.coyote.http2.HpackDecoder.decode (HpackDecoder.java:111)
в
org.apache.coyote.http2.Http2Parser.readHeaderPayload (Http2Parser.java:418)
в
org.apache.coyote.http2.Http2Parser.readHeadersFrame (Http2Parser.java:252)
в org.apache.coyote.http2.Http2Parser.readFrame (Http2Parser.java:97)
в org.apache.coyote.http2.Http2Parser.readFrame (Http2Parser.java:69)
в
org.apache.coyote.http2.Http2UpgradeHandler.upgradeDispatch (Http2UpgradeHandler.java:313)
в
org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch (UpgradeProcessorInternal.java:54)
в
org.apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.java:53)
в
org.apache.coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol.java:754)
в
org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.java:1376)
в
org.apache.tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.java:49)
в
java.base / java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167)
в
java.base / java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:641)
в
org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61)
в java.base / java.lang.Thread.run (Thread.java:844)
Таким образом, соединение открыто только для трех запросов, после чего сервер закрывает соединение при этом исключении.
p.s: Я использую httpclient-5 (бета) для установления постоянного соединения с моим клиентом.
Если queryParam / requestBody имеет статическое содержимое, соединение сохраняется постоянным. но, если queryParam / requestBody имеет некоторое динамическое содержимое (например, временные метки), соединение закрывается с вышеуказанной ошибкой. Я не знаю связи между данными в теле сообщения и соединением tcp
Я не могу опубликовать свое тело запроса, так как это противоречит политике. Я опубликую после маскировки всех параметров моего запроса, мой запрос будет выглядеть примерно так:
String postBody = "<?xml version=\"1.0\" standalone=\"no\"?>\n" +
"<XX xxx=\"1000000005011\" xxx=\"true\" xxx=\"false\" xxx=\"0\" xxx=\"P|TA|D|J|M\" xxx=\"\" xxx=\"\" xxx=\"false\" xxx=\"false\" xxx=\"1\" xxx=\"true\" xxx=\"false\" xxx=\"xxx\" xxx=\"8265\" xxx=\"true\" avgDnsTime=\"null\" xxx=\"false\" xxx=\"EVAL_USER\" xxx=\"1000000000011\" xxx=\"2\" xxx=\"true\" xxx=\"http://localhost:8080/app/xxx\" xxx=\"true\" xxx=\"false\" xxx=\"av_xxx\" ut=\"1528453675150\" xxx=\"URL\" xxx=\"70\" time=\""+(System.currentTimeMillis()+"")+"\" xxx=\"1440\" xxx=\"48\" xxx=\"1\" xxx=\"1\" postUrl=\"xxx.com:8443\">\n" +
"<XXX xxx=\"\" xxx=\"\" xxx=\"false\" xxx=\"\" xxx=\"1000000005011\" xxx=\"60\" xxx=\"\" xxx=\"127.0.0.1\" xxx=\"\" xxx=\"false\" xxx=\"\" xxx=\"default\" xxx=\"\" xxx=\"\" xxx=\"\" xxx=\"false\" xxx=\"false\" xxx=\"false\" xxx=\"http://www.example.com\" xxx=\"\" xxx=\"\" xxx=\"false\" m=\"G\" xxx=\"0\" xxx=\"\" xxx=\"\" t=\"30\" xxx=\"English\"><XD></XD><XH xxx=\"\" xxx=\"_sep_\" xxx=\"\"/><XI xxx=\"\" xxx=\"\"/>\n" +
"</XXX>\n" +
"</XX>";
Если кто-нибудь имеет представление об этом исключении, пожалуйста, помогите
ТИА