Since there's no such thing as HttpServletRequest.available(), i'm going to assume you mean
ServletInputStream.available() With Servlet 3.1 and async I/O everywhere, this isn't going to work the way you think. Take a look at the javadoc for ServletInputStream. http://docs.oracle.com/javaee/7/api/javax/servlet/ServletInputStream.html Notice that it does not override the .available() call? Now take a look at the InputStream.available() method javadoc http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html?#available() It says The available method for class InputStream always returns 0. Its doing exactly what its been designed to do, and ServletInputStream does nothing special about it. If you are attempting to use ServletInputStream in a non-blocking way, then you should look into the Async I/O features. It uses AsyncContext, with a ReadListener and events to onDataAvailable() to know if there is data available to read. Then, internally, use the ServletInputStream.isReady() is used to know if blocking would occur or not. And then use the byte buffer read that returns a length, that way you know how much was read. AsyncContext context = request.startAsync(); ServletInputStream input = request.getInputStream(); input.setReadListener(new MyReadListener(input, context)); MyReadListener.onDataAvailable() { try { int len = -1; byte b[] = new byte[1024]; while (input.isReady()) { len = input.read(b); if(len == -1) { // EOF, nothing left to read return } // Process bytes read (you know the length now) } } catch (IOException ex) { ex.printStackTrace(); } } -- Joakim Erdfelt <[email protected]> webtide.com <http://www.webtide.com/> - intalio.com/jetty Expert advice, services and support from from the Jetty & CometD experts eclipse.org/jetty - cometd.org On Fri, Feb 6, 2015 at 7:19 AM, Guus der Kinderen < [email protected]> wrote: > Hi all, > > Over the past few days, I have been fighting with the following issue. The > scenario revolves around a Jetty 9.2.7 based application, in which a > request gets POSTed to a servlet. The HTTP payload in the request is to be > consumed. > > The servlet implementation overrides doPost(HttpServletRequest request, > HttpServletResponse response). We experience that request.available() > returns zero in this implementation (which causes problems when trying to > consume the HTTP payload using the InputStream from the request). This > happens with some frequency (approximately once in every 50 requests). > > The work-around that we have in place: invoke Thread.sleep(100) when > request.available() returns zero. This works, but is an undesirable > solution. > > The efforts to reproduce the problem in a more compact code-base than the > elaborate servlet and client implementations in our products have not been > successful. > > I am looking for thoughts on the cause of this issue, suggestions for > fixes, and/or approaches to create a portable reproduction path. Any help > is much appreciated! > > Regards, > > Guus > > _______________________________________________ > jetty-users mailing list > [email protected] > To change your delivery options, retrieve your password, or unsubscribe > from this list, visit > https://dev.eclipse.org/mailman/listinfo/jetty-users >
_______________________________________________ jetty-users mailing list [email protected] To change your delivery options, retrieve your password, or unsubscribe from this list, visit https://dev.eclipse.org/mailman/listinfo/jetty-users
