Tore Eriksson wrote: > Hello everybody, > > As I found a solution to my problem, I thought I would share it in case > someone else comes up against the same issue. The reason for the client > not acting on the redirect is that sendRedirect does not send any > Content-length header, and the client will then wait for an eventual > Content body until the servlet finishes. This could be avoided if the > sendRedirect would include "Content-length: 0" in its HTTP headers. I > solved my problem by manually constructing the redirect on the > HttpServletResponse object ('out' below).
Why don't you just insert "return;" after the first redirect was called? p > Old code: > > final int PARTIAL_HITS = 25; > > for (int i = 0; i < hits.length(); i++) { > > /** Insert into table omitted */ > > if (i == PARTIAL_HITS) { > // Intermittant redirect, not acted on until doPost returns > out.sendRedirect(resultUrl); return; // why not terminate the method call here? > } > } > > if (!out.isCommitted()) { > // Final redirect > out.sendRedirect(resultUrl); > } > > New code: > > final int PARTIAL_HITS = 25; > > for (int i = 0; i < hits.length(); i++) { > > /** Insert into table omitted */ > > if (i == PARTIAL_HITS) { > // Intermittant redirect, acted on immediately > out.setHeader("Location", resultUrl); > out.setStatus(303); > out.setContentLength(0); > out.flushBuffer(); > } > } > > if (!out.isCommitted()) { > // Final redirect (if case less than PARTIAL_HITS found) > out.sendRedirect(resultUrl); > } > >> Hello again, >> >> Thanks for the response, but it seems like my phrasing was a bit unclear. >> The problem is not the second redirect - in fact there will be no >> multiple redirects. The second redirect is only there for the case when >> less than 25 hits are found and the first redirect is not called. The if >> clause will prevent the program for trying to redirect twice. >> >> My problem is rather that the redirect is only commited - the response >> is sent to the client - until the doPost method/thread finishes. I >> expected to be able to redirect (once) in the middle of the loop. What I >> am trying to accomplish is to do a query, enter the hits into a >> temporary table, and redirect to another program that displays a paged >> list of hits by reading from the table - in effect using the table as a >> queue. Since the paged display only shows the top 25 hits, there is no >> need to wait for all the query results. >> >> So once more, my problem is that the redirect is not committed until the >> function returns. Any help much appreciated. >> >> Tore >> >> Alan Chaney wrote: >>> Tore >>> >>> Your code below is written as though the 'out' was like writing data to >>> a console. The processing in a servlet is part of a request/response >>> cycle, where the 'request' tells it what to do and the response is the >>> reply. >>> >>> Because of the nature of the request/response cycle you only get one >>> chance at the reply. The javadocs for HttpServletResponse.sendRedirect >>> make this clear. >>> >>> "If the response has already been committed, this method throws an >>> IllegalStateException. After using this method the response should be >>> considered to be committed and should not be written to." >>> >>> In other words, in one servlet request/response cycle you get exactly >>> one chance to issue a 'sendRedirect'. If you think this through you'll >>> see that this is how it has to be: >>> >>> Browser sends request to servlet >>> Servlet process request and sendsRedirect >>> Browser display response. >>> >>> Your problem is that you are trying to generate a second response >>> without a correspondng request. The first response is for the 'top 25' >>> and the second is for 'all the rest', but by then you've already >>> committed the response. >>> >>> To achieve what I think you are trying to achieve would require you to >>> create some mechanism where the lucene query results are processed in a >>> separate thread and your application makes TWO requests - one for the >>> first set of results and then one for the final set of results. >>> >>> There are far too many different ways to do this to detail here - I hope >>> this helps >>> >>> Regards >>> >>> Alan Chaney >>> >>> >>> >>> Tore Eriksson wrote: >>>> Hi everybody, >>>> >>>> I have a problem with redirects in Tomcat 5.5.25. I am doing a Lucene >>>> search and would like to send a redirect after finding the top 25 hits, >>>> commit this response, and then continue processing the remaining hits. >>>> The relevant parts of the doPost() code are as below: >>>> >>>> final int PARTIAL_HITS = 25; >>>> >>>> for (int i = 0; i < hits.length(); i++) { >>>> >>>> Document doc = hits.doc(i); >>>> String citation = doc.get("citation"); >>>> >>>> /** Insert into table */ >>>> try { >>>> insertId.setInt(1, java.lang.Integer.parseInt(citation)); >>>> insertId.executeUpdate(); >>>> } >>>> catch (SQLException e) { >>>> out.sendError(500, "Bad SQL insert: " + e); >>>> } >>>> catch (Exception e) {} >>>> >>>> if (i == PARTIAL_HITS) { >>>> // Intermittant redirect >>>> out.sendRedirect(resultUrl); >>>> } >>>> } >>>> >>>> insertId.close(); >>>> >>>> if (!out.isCommitted()) { >>>> // Final redirect >>>> out.sendRedirect(resultUrl); >>>> } >>>> >>>> My problem is that the intermittant redirect is not committed until the >>>> function returns, which will take quite some time for some queries. I >>>> have tried HttpServletResponse.flushBuffer() and other possible >>>> variations. Any pointers would be most appreciated. >>>> >>>> Tore >> >> _______________________________________________________________ >> Tore Eriksson [tore.eriksson ad po.rd.taisho.co.jp] > > _______________________________________________________________ > Tore Eriksson [tore.eriksson at po.rd.taisho.co.jp] > > > > --------------------------------------------------------------------- > To start a new topic, e-mail: users@tomcat.apache.org > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To start a new topic, e-mail: users@tomcat.apache.org To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]