You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Richard Mundell <ri...@trgrp.com> on 2006/12/15 21:36:59 UTC

On Tomcat 5.5.9, can't flush the buffer or reduce buffer size < 8192

I'm trying to work around a timeout problem which one of my user's proxy
server has. The proxy's timeout is set to 1 minute. Should it not receive
any HTTP traffic for 1 minute it disconnects.
 
One of my JSPs takes >1 minute to perform processing and return results.
 
What I'm trying to do is...
 
1) Flush out HTTP headers immediately
2) (Start my database operation which takes >1 minute)
3) Write out and flush to the client a HTML comment (<!--hello-->) every 10
seconds while the database operation completes to stop the proxy timing out
4) (Database operation completes)
5) Write out results
 
By calling response.flushBuffer() immediately at the top of my JSP, the HTTP
headers are being written out to the TCP stream. So far, so good.
 
My code then, every 10 seconds, does an out.print("<!-- hello -->") and a
response.flushBuffer().
 
By using a packet sniffer I can see that although the headers get output to
the TCP stream, the "body" of the HTTP response does not get written out
until the very end of the execution of the JSP. The only way I can get the
buffer to flush is if I do an out.print with a string greater than 8192
characters (the default size of the buffer).
 
Note that I also tried out.flush() and that doesn't work either.
 
As a workaround I tried to set the buffer size artificially low, but this
call is being ignored:
 
    System.out.println(response.getBufferSize());
    // buffer size of 8192 printed to stdout
 
    response.setBufferSize(100);
    // buffer size should now be 100, right?
 
    System.out.println(response.getBufferSize());
    // buffer size of 8192 still printed to stdout
 
setBufferSize only works if I set the buffer > 8192.
 
I can't find any reference in the Tomcat spec to this being a deliberate
behavior, or a hard-coded minimum?
 
Anyone got any ideas of where I'm going wrong, or how I might get this to
work in Tomcat 5.5.9? (Note that I'm stuck at Tomcat 5.5.9 because the later
(Apache) HTTPS implementations don't work reliably in our environment).
 
Thanks,
 
Richard



---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: On Tomcat 5.5.9, can't flush the buffer or reduce buffer size < 8192

Posted by Tim Funk <fu...@joedog.org>.
You can't mix page directives with snippets. Page directives occur at 
page translation time (before the compilation process)

To eliminate buffering  - try
  <%@page buffer='none'%>


-Tim

Richard Mundell wrote:
> Thanks Tim.
> 
> out.flush() wasn't doing anything unless there was already 8KB in the
> buffer.
> 
> But, the JSP page directive helped:
> 
> Before setting the JSP page directive, the pre-compiled .java file that
> Tomcat was creating had...
> 
>       pageContext = _jspxFactory.getPageContext(this, request, response,
>       			"ErrorPage.jsp", true, 8192, true);
> 
> ...and now, with <%@page buffer="1kb"%>, it uses...
> 
>       pageContext = _jspxFactory.getPageContext(this, request, response,
>       			"ErrorPage.jsp", true, 1024, true); 
> 
> It looks like the buffer can only be specified in 1kb increments, but a 1KB
> keep-alive being sent every 30 seconds is better than an 8KB keep-alive.
> 
> Is there a way to make the JSP page directive conditional?
> 
> Basically, I only want to set the buffer to 1KB for certain users of my
> application.
> 
> I tried...
> 
> 	<%
> 	if (useSmallBuffer==true) {
> 		%><%@page buffer="1kb"%><%
> 	}
> 	%>
> 
> ...but this doesn't work (can't mix directives and scripting elements).
> 
> Any ideas?
> 
> Thanks,
> 
> Richard
> 
> 
> 
> 
> 
> -----Original Message-----
> From: Tim Funk [mailto:funkman@joedog.org] 
> Sent: Tuesday, December 19, 2006 6:53 AM
> To: Tomcat Users List
> Subject: Re: On Tomcat 5.5.9, can't flush the buffer or reduce buffer size <
> 8192
> 
> JSP's also have a buffer too. To make it smaller or eliminate it:
> 
> <%@page buffer='none'%>
> or use out.flush() instead or response.flushBuffer()
> 
> -Tim
> 

---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


RE: On Tomcat 5.5.9, can't flush the buffer or reduce buffer size < 8192

Posted by Richard Mundell <ri...@trgrp.com>.
Thanks Tim.

out.flush() wasn't doing anything unless there was already 8KB in the
buffer.

But, the JSP page directive helped:

Before setting the JSP page directive, the pre-compiled .java file that
Tomcat was creating had...

      pageContext = _jspxFactory.getPageContext(this, request, response,
      			"ErrorPage.jsp", true, 8192, true);

...and now, with <%@page buffer="1kb"%>, it uses...

      pageContext = _jspxFactory.getPageContext(this, request, response,
      			"ErrorPage.jsp", true, 1024, true); 

It looks like the buffer can only be specified in 1kb increments, but a 1KB
keep-alive being sent every 30 seconds is better than an 8KB keep-alive.

Is there a way to make the JSP page directive conditional?

Basically, I only want to set the buffer to 1KB for certain users of my
application.

I tried...

	<%
	if (useSmallBuffer==true) {
		%><%@page buffer="1kb"%><%
	}
	%>

...but this doesn't work (can't mix directives and scripting elements).

Any ideas?

Thanks,

Richard





-----Original Message-----
From: Tim Funk [mailto:funkman@joedog.org] 
Sent: Tuesday, December 19, 2006 6:53 AM
To: Tomcat Users List
Subject: Re: On Tomcat 5.5.9, can't flush the buffer or reduce buffer size <
8192

JSP's also have a buffer too. To make it smaller or eliminate it:

<%@page buffer='none'%>
or use out.flush() instead or response.flushBuffer()

-Tim


Richard Mundell wrote:
> No one replied, so in the hope someone might have the answer to this, 
> here's a repost... :-)
>  
> 
> -----Original Message-----
> From: Richard Mundell [mailto:richard.mundell@trgrp.com]
> Sent: Friday, December 15, 2006 3:37 PM
> To: users@tomcat.apache.org
> Subject: On Tomcat 5.5.9, can't flush the buffer or reduce buffer size 
> <
> 8192
> 
> I'm trying to work around a timeout problem which one of my user's 
> proxy server has. The proxy's timeout is set to 1 minute. Should it 
> not receive any HTTP traffic for 1 minute it disconnects.
>  
> One of my JSPs takes >1 minute to perform processing and return results.
>  
> What I'm trying to do is...
>  
> 1) Flush out HTTP headers immediately
> 2) (Start my database operation which takes >1 minute)
> 3) Write out and flush to the client a HTML comment (<!--hello-->) 
> every 10 seconds while the database operation completes to stop the 
> proxy timing out
> 4) (Database operation completes)
> 5) Write out results
>  
> By calling response.flushBuffer() immediately at the top of my JSP, 
> the HTTP headers are being written out to the TCP stream. So far, so good.
>  
> My code then, every 10 seconds, does an out.print("<!-- hello -->") 
> and a response.flushBuffer().
>  
> By using a packet sniffer I can see that although the headers get 
> output to the TCP stream, the "body" of the HTTP response does not get 
> written out until the very end of the execution of the JSP. The only 
> way I can get the buffer to flush is if I do an out.print with a 
> string greater than 8192 characters (the default size of the buffer).
>  
> Note that I also tried out.flush() and that doesn't work either.
>  
> As a workaround I tried to set the buffer size artificially low, but 
> this call is being ignored:
>  
>     System.out.println(response.getBufferSize());
>     // buffer size of 8192 printed to stdout
>  
>     response.setBufferSize(100);
>     // buffer size should now be 100, right?
>  
>     System.out.println(response.getBufferSize());
>     // buffer size of 8192 still printed to stdout
>  
> setBufferSize only works if I set the buffer > 8192.
>  
> I can't find any reference in the Tomcat spec to this being a 
> deliberate behavior, or a hard-coded minimum?
>  
> Anyone got any ideas of where I'm going wrong, or how I might get this 
> to work in Tomcat 5.5.9? (Note that I'm stuck at Tomcat 5.5.9 because 
> the later
> (Apache) HTTPS implementations don't work reliably in our environment).


---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org To unsubscribe,
e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org





---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: On Tomcat 5.5.9, can't flush the buffer or reduce buffer size < 8192

Posted by Tim Funk <fu...@joedog.org>.
JSP's also have a buffer too. To make it smaller or eliminate it:

<%@page buffer='none'%>
or use out.flush() instead or response.flushBuffer()

-Tim


Richard Mundell wrote:
> No one replied, so in the hope someone might have the answer to this, here's
> a repost... :-)
>  
> 
> -----Original Message-----
> From: Richard Mundell [mailto:richard.mundell@trgrp.com] 
> Sent: Friday, December 15, 2006 3:37 PM
> To: users@tomcat.apache.org
> Subject: On Tomcat 5.5.9, can't flush the buffer or reduce buffer size <
> 8192
> 
> I'm trying to work around a timeout problem which one of my user's proxy
> server has. The proxy's timeout is set to 1 minute. Should it not receive
> any HTTP traffic for 1 minute it disconnects.
>  
> One of my JSPs takes >1 minute to perform processing and return results.
>  
> What I'm trying to do is...
>  
> 1) Flush out HTTP headers immediately
> 2) (Start my database operation which takes >1 minute)
> 3) Write out and flush to the client a HTML comment (<!--hello-->) every 10
> seconds while the database operation completes to stop the proxy timing out
> 4) (Database operation completes)
> 5) Write out results
>  
> By calling response.flushBuffer() immediately at the top of my JSP, the HTTP
> headers are being written out to the TCP stream. So far, so good.
>  
> My code then, every 10 seconds, does an out.print("<!-- hello -->") and a
> response.flushBuffer().
>  
> By using a packet sniffer I can see that although the headers get output to
> the TCP stream, the "body" of the HTTP response does not get written out
> until the very end of the execution of the JSP. The only way I can get the
> buffer to flush is if I do an out.print with a string greater than 8192
> characters (the default size of the buffer).
>  
> Note that I also tried out.flush() and that doesn't work either.
>  
> As a workaround I tried to set the buffer size artificially low, but this
> call is being ignored:
>  
>     System.out.println(response.getBufferSize());
>     // buffer size of 8192 printed to stdout
>  
>     response.setBufferSize(100);
>     // buffer size should now be 100, right?
>  
>     System.out.println(response.getBufferSize());
>     // buffer size of 8192 still printed to stdout
>  
> setBufferSize only works if I set the buffer > 8192.
>  
> I can't find any reference in the Tomcat spec to this being a deliberate
> behavior, or a hard-coded minimum?
>  
> Anyone got any ideas of where I'm going wrong, or how I might get this to
> work in Tomcat 5.5.9? (Note that I'm stuck at Tomcat 5.5.9 because the later
> (Apache) HTTPS implementations don't work reliably in our environment).


---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


On Tomcat 5.5.9, can't flush the buffer or reduce buffer size < 8192

Posted by Richard Mundell <ri...@trgrp.com>.
No one replied, so in the hope someone might have the answer to this, here's
a repost... :-)
 

-----Original Message-----
From: Richard Mundell [mailto:richard.mundell@trgrp.com] 
Sent: Friday, December 15, 2006 3:37 PM
To: users@tomcat.apache.org
Subject: On Tomcat 5.5.9, can't flush the buffer or reduce buffer size <
8192

I'm trying to work around a timeout problem which one of my user's proxy
server has. The proxy's timeout is set to 1 minute. Should it not receive
any HTTP traffic for 1 minute it disconnects.
 
One of my JSPs takes >1 minute to perform processing and return results.
 
What I'm trying to do is...
 
1) Flush out HTTP headers immediately
2) (Start my database operation which takes >1 minute)
3) Write out and flush to the client a HTML comment (<!--hello-->) every 10
seconds while the database operation completes to stop the proxy timing out
4) (Database operation completes)
5) Write out results
 
By calling response.flushBuffer() immediately at the top of my JSP, the HTTP
headers are being written out to the TCP stream. So far, so good.
 
My code then, every 10 seconds, does an out.print("<!-- hello -->") and a
response.flushBuffer().
 
By using a packet sniffer I can see that although the headers get output to
the TCP stream, the "body" of the HTTP response does not get written out
until the very end of the execution of the JSP. The only way I can get the
buffer to flush is if I do an out.print with a string greater than 8192
characters (the default size of the buffer).
 
Note that I also tried out.flush() and that doesn't work either.
 
As a workaround I tried to set the buffer size artificially low, but this
call is being ignored:
 
    System.out.println(response.getBufferSize());
    // buffer size of 8192 printed to stdout
 
    response.setBufferSize(100);
    // buffer size should now be 100, right?
 
    System.out.println(response.getBufferSize());
    // buffer size of 8192 still printed to stdout
 
setBufferSize only works if I set the buffer > 8192.
 
I can't find any reference in the Tomcat spec to this being a deliberate
behavior, or a hard-coded minimum?
 
Anyone got any ideas of where I'm going wrong, or how I might get this to
work in Tomcat 5.5.9? (Note that I'm stuck at Tomcat 5.5.9 because the later
(Apache) HTTPS implementations don't work reliably in our environment).
 
Thanks,
 
Richard



---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org