Return-Path: Delivered-To: apmail-tomcat-users-archive@www.apache.org Received: (qmail 59311 invoked from network); 6 Oct 2006 15:14:18 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 6 Oct 2006 15:14:18 -0000 Received: (qmail 394 invoked by uid 500); 6 Oct 2006 15:14:05 -0000 Delivered-To: apmail-tomcat-users-archive@tomcat.apache.org Received: (qmail 368 invoked by uid 500); 6 Oct 2006 15:14:04 -0000 Mailing-List: contact users-help@tomcat.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "Tomcat Users List" Delivered-To: mailing list users@tomcat.apache.org Received: (qmail 356 invoked by uid 99); 6 Oct 2006 15:14:04 -0000 Received: from idunn.apache.osuosl.org (HELO idunn.apache.osuosl.org) (140.211.166.84) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 06 Oct 2006 08:14:04 -0700 X-ASF-Spam-Status: No, hits=0.0 required=5.0 tests= Received: from [68.236.111.6] ([68.236.111.6:34015] helo=paris.ifactory.com) by idunn.apache.osuosl.org (ecelerity 2.1.1.8 r(12930)) with ESMTP id A7/73-24193-8B276254 for ; Fri, 06 Oct 2006 08:14:01 -0700 Received: from bender.ifactory.com (bender.ifactory.com [192.168.10.24]) (authenticated bits=0) by paris.ifactory.com (8.13.4/8.12.10) with ESMTP id k96FDu8D022123 for ; Fri, 6 Oct 2006 11:13:56 -0400 Subject: Re: Response committed before getting to the filters From: Dan Adams To: Tomcat Users List In-Reply-To: <45266F98.2000908@cornell.edu> References: <1160146284.2217.282.camel@bender.ifactory.com> <45266F98.2000908@cornell.edu> Content-Type: text/plain Date: Fri, 06 Oct 2006 11:13:55 -0400 Message-Id: <1160147636.16788.7.camel@bender.ifactory.com> Mime-Version: 1.0 X-Mailer: Evolution 2.6.3 (2.6.3-1.fc5.5) Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.53 on 192.168.10.6 X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N The source code for both is below (this code is actually from the spring library if that makes any difference). I really don't think the filters have anything to do with it. I just set a conditional breakpoint in the first line of doFilter() in the first filter that gets called by tomcat for when response.isCommitted() evaluates to true. As soon as it happened again that breakpoint got hit and response.isCommitted() was, in fact, true. But in every other normal request the breakpoint never gets hit. This is what the first filter does (sorry looks ugly in email): public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException { if (!(request instanceof HttpServletRequest) || !(response instanceof HttpServletResponse)) { throw new ServletException("OncePerRequestFilter just supports HTTP requests"); } HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; String alreadyFilteredAttributeName = getAlreadyFilteredAttributeName(); if (request.getAttribute(alreadyFilteredAttributeName) != null || shouldNotFilter(httpRequest)) { // proceed without invoking this filter filterChain.doFilter(request, response); } else { // invoke this filter request.setAttribute(alreadyFilteredAttributeName, Boolean.TRUE); doFilterInternal(httpRequest, httpResponse, filterChain); } } and doFilterInternal() is: protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { SessionFactory sessionFactory = lookupSessionFactory(request); Session session = null; boolean participate = false; if (isSingleSession()) { // single session mode if (TransactionSynchronizationManager.hasResource(sessionFactory)) { // Do not modify the Session: just set the participate flag. participate = true; } else { logger.debug("Opening single Hibernate Session in OpenSessionInViewFilter"); session = getSession(sessionFactory); TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session)); } } else { // deferred close mode if (SessionFactoryUtils.isDeferredCloseActive(sessionFactory)) { // Do not modify deferred close: just set the participate flag. participate = true; } else { SessionFactoryUtils.initDeferredClose(sessionFactory); } } try { filterChain.doFilter(request, response); } finally { if (!participate) { if (isSingleSession()) { // single session mode TransactionSynchronizationManager.unbindResource(sessionFactory); logger.debug("Closing single Hibernate Session in OpenSessionInViewFilter"); try { closeSession(session, sessionFactory); } catch (RuntimeException ex) { logger.error("Unexpected exception on closing Hibernate Session", ex); } } else { // deferred close mode SessionFactoryUtils.processDeferredClose(sessionFactory); } } } } On Fri, 2006-10-06 at 11:00 -0400, David Smith wrote: > So what does the first filter do? Does it do anything with the response > before chaining to the second one? > > --David > > Dan Adams wrote: > > So every once in a while when you make a request to the server you won't > > get anything back and the log will show that one of the filters > > complained that response is already committed. So I restarted tomcat > > with the jpda debugger on, fired up my debugger in eclipse, and set a > > breakpoint at the place in the filter where this message is printed. > > > > My app has 2 filters right now and the breakpoint is in the second > > filter. So when I hit the breakpoint I went down in the stack trace to > > the point at which tomcat calls doFilter on the first filter in the > > filter chain. At that point is the stack, response.isCommitted() > > evaluates to 'true'(!?). Exploring the objects the response shows that > > the headers written so far are: > > > > Transfer-Encoding = chunked > > Date = Fri, 06 Oct 2006 14:33:33 GMT > > > > and contentLength == -1. > > > > Why would the response be committed before even getting to any of the > > code in my application? Even suggestions on what to investigate further > > would be help at this point. Thanks in advance. > > > > > > > --------------------------------------------------------------------- > 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 > -- Dan Adams Senior Software Engineer Interactive Factory 617.235.5857 --------------------------------------------------------------------- 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