2017-01-24 9 views
1

Я новичок в Джерси & tomcat. У меня есть webservice, размещенный на tomcat7, который возвращает zip-файл после некоторой обработки.
Я получаю ниже исключения
org.glassfish.jersey.server.internal.process.MappableException: org.apache.catalina.connector.ClientAbortException: java.net.SocketException:

org.glassfish.jersey.server.internal.process.MappableException: org.apache.catalina.connector.ClientAbortException: java.net.SocketException: Connection timed out (Write failed) 
    at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:92) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) 
    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1130) 
    at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:711) 
    at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:444) 
    at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:434) 
    at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:329) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) 
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) 
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) 
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473) 
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341) 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:221) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.apache.catalina.connector.ClientAbortException: java.net.SocketException: Connection timed out (Write failed) 
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:407) 
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:371) 
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:432) 
    at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:420) 
    at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:91) 
    at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:84) 
    at org.glassfish.jersey.servlet.internal.ResponseWriter$NonCloseableOutputStreamWrapper.write(ResponseWriter.java:320) 
    at org.glassfish.jersey.message.internal.CommittingOutputStream.write(CommittingOutputStream.java:218) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$UnCloseableOutputStream.write(WriterInterceptorExecutor.java:294) 
    at org.glassfish.jersey.message.internal.ByteArrayProvider.writeTo(ByteArrayProvider.java:96) 
    at org.glassfish.jersey.message.internal.ByteArrayProvider.writeTo(ByteArrayProvider.java:60) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:265) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:250) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) 
    at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:106) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) 
    at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:86) 
    ... 39 more 
Caused by: java.net.SocketException: Connection timed out (Write failed) 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153) 
    at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:215) 
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:480) 
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366) 
    at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:240) 
    at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:119) 
    at org.apache.coyote.http11.AbstractOutputBuffer.doWrite(AbstractOutputBuffer.java:192) 
    at org.apache.coyote.Response.doWrite(Response.java:499) 
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:402) 
    ... 55 more 


Этот код прекрасно работает с меньшим файлом, созданным в более короткое время, но дает исключение в случае, если файл, имеющий размер 700-800kb, после некоторой обработки приблизительно 6-8minutes ,

PS: Запрос приходит в webservice, размещенный на tomcat &, затем отправляется на вызов RMI для разных ВМ через балансировщик нагрузки.

ответ

0

В соответствии с информацией об исключении & ваше описание, основанное на моем понимании, я думаю, что проблема была вызвана синхронным режимом обработки Джерси, который требует, как показано ниже.

Обработка запросов на сервере работает по умолчанию в режиме синхронной обработки, что означает, что клиентское соединение запроса обрабатывается в одном потоке контейнера ввода-вывода. После обработки потока запрос возвращается в контейнер ввода-вывода, контейнер может с уверенностью предположить, что обработка запроса завершена и что клиентское соединение можно безопасно освободить, включая все ресурсы, связанные с соединением. Эта модель обычно достаточна для обработки запросов, для которых выполнение метода ресурса обработки занимает относительно короткое время. Однако в тех случаях, когда известно, что выполнение метода ресурса занимает много времени для вычисления результата, следует использовать серверную асинхронную модель обработки. В этой модели связь между потоком обработки запроса и соединением клиента нарушена. Контейнер ввода-вывода, который обрабатывает входящий запрос, может больше не предполагать, что клиентское соединение может быть безопасно закрыто при возврате потока обработки запроса. Вместо этого необходимо открыть средство для явного приостановки, возобновления и закрытия клиентских подключений. Обратите внимание, что использование серверной модели асинхронной обработки не улучшит время обработки запроса, воспринимаемое клиентом. Тем не менее, он увеличит пропускную способность сервера, высвободив начальный поток обработки запроса обратно в контейнер ввода-вывода, в то время как запрос все еще может ждать в очереди для обработки или обработка может все еще работать в другом выделенном потоке. Выпущенный поток контейнера ввода-вывода может использоваться для приема и обработки новых входящих запросов.

Таким образом, в случае, без ваших кодов, мое предложение заключается в том, что, пожалуйста, обратитесь к джерси OFFICAL документу 11.1. Asynchronous Server API переписать код для обработки архивных файлов. Надеюсь, поможет.