webForumDet fria alternativet

Servlet attachment

4 svar · 188 visningar · startad av Tryptomine

TryptomineMedlem sedan nov. 200238 inlägg
#1

Jag har en servlet som genererar PDF-filer och returnerar till användaren. Nu är det så att för vissa användare så fungerar det inte utan dom får endast ett blankt fönster i sin browser.
Någon som kan se nåt fel i koden nedan.

    public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException
    {
        HttpSession session = request.getSession(true);
        String strtotalNumberOfBookings = (String)request.getParameter("totalNumberOfBookings");
        int totalNumberOfBookings = Integer.parseInt( strtotalNumberOfBookings );
        PnlPdfDocumentContents[] vos = new PnlPdfDocumentContents[totalNumberOfBookings];
        for (int i = 0; i < totalNumberOfBookings; i++)
        {
            vos[i] =   getPnlPdfMultipleBookinVO( request, i+1  ) ;
        }

        String numberOfLabelsOnOnePage = request.getParameter( "numberOfLabelsOnOnePage").trim();
        if ( numberOfLabelsOnOnePage != null)
        {
            PnlPdfDocumentContents.numberOfLabelsOnOnePage = Integer.parseInt( numberOfLabelsOnOnePage );
        }

        try
        {
            String openPdfInBrowser = (String)request.getParameter("openPdfInBrowser");
            String printForThermo = (String)request.getParameter("printForThermo");
            String filename = (String)request.getParameter("filename");
            if(filename==null || filename.length()<1)
              filename="booking";
            ByteArrayOutputStream baos;
            if(printForThermo!=null && printForThermo.compareTo("YES")==0)
            {
               baos = generatePdfForServlet( vos ,true);
            }
            else
            {
               baos = generatePdfForServlet( vos ,false);
            }
            if ( openPdfInBrowser!= null && openPdfInBrowser.equalsIgnoreCase("1") )
            {
                response.setContentType("application/pdf");
            }
            else
            {
                response.setContentType("application/octet-stream");
                response.setHeader("Content-Disposition", "attachment;filename=\"" + filename + ".pdf" + "\"");
                response.setContentLength(baos.size());
            }

            ServletOutputStream out = response.getOutputStream();
            baos.writeTo(out);
            out.flush();
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }

Jag har sett i loggarna att vid raden baos.writeTo(out); kan det ibland genereras ett exception

java.net.SocketException: Connection reset by peer: socket write error
  	at java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
	at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
	at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:668)
	at org.apache.coyote.http11.filters.IdentityOutputFilter.doWrite(IdentityOutputFilter.java:160)
	at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:523)
	at org.apache.coyote.Response.doWrite(Response.java:518)
	at org.apache.coyote.tomcat4.OutputBuffer.realWriteBytes(OutputBuffer.java:384)
	at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:348)
	at org.apache.coyote.tomcat4.OutputBuffer.writeBytes(OutputBuffer.java:411)
	at org.apache.coyote.tomcat4.OutputBuffer.write(OutputBuffer.java:398)
	at org.apache.coyote.tomcat4.CoyoteOutputStream.write(CoyoteOutputStream.java:110)
	at java.io.ByteArrayOutputStream.writeTo(ByteArrayOutputStream.java:112)
	at net.tradevision.general.pdflabels.PnlPdfMultipleBookingService.doPost(PnlPdfMultipleBookingService.java:177)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:263)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
	at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2489)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
	at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
	at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:413)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:380)
	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:537)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:533)
	at java.lang.Thread.run(Thread.java:536)
LimeMedlem sedan sep. 2001961 inlägg
#2

Vilken version av TC? Får liknande fel när jag kör SSL och ibland vid stora streamar, framför allt när jag kör Netscape eller andra Gecko-baserade browsrar.

/Lime

TryptomineMedlem sedan nov. 200238 inlägg
#3

Jag kör Borland Enterprise Server 5.2 (Är det detta du menar med TC)
Alla användare kör internet explorer >=5.0.
Använder inte SSL, men det kan vara ganska stora streamar.

Kan det vara så att något timar ut.

LimeMedlem sedan sep. 2001961 inlägg
#4

Enligt felutskriften så är det något som går fel i JNI-anropet till outputStream. Kan vara i org.apache.coyote.http11.InternalOutputBuffer som är känt för att vara buggig och göra buffer-overflow.

Om man läser loggen så ser man att det är Tomcat som är servlet-engine. Förmodligen den som Borland skickar med. Försök att uppdatera Tomcat till senaste (http://jakarta.apache.org/tomcat/index.html). TC 4.1.18 avhjälpte många av mina konstiga servlet och fil-fel.

/Lime

TryptomineMedlem sedan nov. 200238 inlägg
#5

Ok. jag kör 4.1.15
Ska testa att uppgradera.

132 ms totalt · 3 externa anrop · v20260731065814-full.30151723
124 ms — hämta forumlista (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)