Закрытие сокета по таймауту

302
20 октября 2017, 12:13

как с этим бороться ?

в web-приложении на tomcat8 вызывается сервлет (по https) - сгенерировать PDF и вернуть файл в коде это выглядит примерно так

protected void processRequest(HttpServletRequest request, HttpServletResponse response) {
    try {
        String realPath = getServletContext().getRealPath("/");
        LOG.info("Request PDF");
        Config config = new Config(request, realPath);
        PdfFile pdfFile = new PdfFile(config);
        String fileName = new URI(null, null, pdfFile.getFileName(), null).toASCIIString();
        String content = String.format("attachment;filename*=%s''%s", Factory.DEFAULT_CHARSET, fileName);
        response.setHeader("Content-Disposition", content);
        response.setContentType("application/pdf");
        response.getOutputStream().write(pdfFile.getBytes());
        LOG.info("{} done", pdfFile);
    } catch (Exception e) {
        LOG.error("Request: {}", request.getQueryString(), e);
        returnError(response);
    }
}

на стороне сервера настройки https (как мне кажется сделаны по умолчанию)

<?xml version="1.0" encoding="UTF-8"?> 
 
<Server port="8005" shutdown="SHUTDOWN"> 
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> 
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> 
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> 
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> 
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> 
   
  <GlobalNamingResources> 
    <Resource name="UserDatabase" auth="Container" 
              type="org.apache.catalina.UserDatabase" 
              description="User database that can be updated and saved" 
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
              pathname="conf/tomcat-users.xml" /> 
  </GlobalNamingResources> 
   
  <Service name="Catalina"> 
	<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true" 
               maxThreads="150" scheme="https" secure="true"			    
               clientAuth="false" sslProtocol="TLS" keystoreFile="C:/keystore" keystorePass="password" keystoreType="JKS" /> 
	 
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 
     
    <Engine name="Catalina" defaultHost="localhost"> 
      <Realm className="org.apache.catalina.realm.LockOutRealm"> 
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 
               resourceName="UserDatabase"/> 
      </Realm> 
 
      <Host name="localhost"  appBase="webapps" 
            unpackWARs="true" autoDeploy="true"> 
      </Host> 
    </Engine> 
  </Service> 
</Server>

в web.xml описаны только сервлеты с маппингами

периодически получаем ошибку, она хаотична - может долгое время все работать, а затем она появляется, от данных, на которых генерится и получается файл, ошибка не зависит - то есть, то нет.. на стороне пользователя это выглядит как "файл качается" и, где-то в процессе подвисает..

java.net.SocketTimeoutException 
org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:356) 
org.apache.catalina.connector.OutputBuffer.appendByteArray(OutputBuffer.java:785) 
org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:714) 
org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:391) 
org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:369) 
org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96) 
org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89) 
com.gosniias.server.pdf.engine.PdfWorker.makePdf(PdfWorker.java:37) 
com.gosniias.server.pdf.engine.Factory.makePdf(Factory.java:33) 
com.gosniias.server.pdf.MakePdf.processRequest(MakePdf.java:66) 
com.gosniias.server.pdf.MakePdf.doGet(MakePdf.java:36) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:635) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) 
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) 
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) 
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) 
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
java.lang.Thread.run(Unknown Source)]

READ ALSO
Как распарсить файл формата .trk на байты в Java?

Как распарсить файл формата .trk на байты в Java?

Есть моделька ноты с соответствующими ей полямиИз этих нот сделана музыкальная дорожка, судя по всему у нее формат файла MIDI

306
Как получить подмассив массива на Java?

Как получить подмассив массива на Java?

К примеру, есть массив из 55 элементов:

375