2008-09-05 27 views
7

Tôi có một Bộ lọc Tomcat ủy quyền các yêu cầu đến đối tượng xử lý tùy thuộc vào URL. Đây là bộ lọc duy nhất trong số FilterChain. Tôi có một ứng dụng Ajax mà búa bộ lọc này với rất nhiều yêu cầu.Tomcat doFilter() được gọi với phản hồi cam kết

Gần đây, tôi nhận thấy một vấn đề trong đó phương pháp doFilter của bộ lọc thường được gọi với một phản hồi được cam kết như một tham số (Nội bộ, đó là phản hồi coyote được đánh dấu là cam kết).

Dường như với tôi rằng cách duy nhất mà điều này có thể xảy ra là nếu phương pháp recycle() không được gọi trên phản hồi coyote này. Tôi đã kiểm tra để đảm bảo rằng tôi không giữ tài liệu tham khảo cho bất kỳ yêu cầu, phản ứng, outputStream, hoặc các đối tượng nhà văn. Ngoài ra, tôi đã đảm bảo đóng outputStream trong một khối cuối cùng. Tuy nhiên, điều này không giải quyết được vấn đề này.

Điều này có vẻ như tôi đang làm điều gì đó để lạm dụng bộ chứa servlet nhưng tôi đang gặp sự cố khi theo dõi nó.

Trả lời

3

Tôi đã thử sử dụng Tomcat 6.16 và 6.18. Điều này chắc chắn là bộ lọc duy nhất trong chuỗi.

Dường như một thứ gì đó đang giữ tham chiếu đến dòng xuất của servlet. Tôi đã bọc ServletOutputStream trong OutputStream của riêng mình và sau đó đảm bảo tham chiếu bị hủy. Điều này đã khắc phục vấn đề để tôi không còn thấy phản hồi đã cam kết được thông qua.

Đây là một tác dụng phụ lạ khi giữ tham chiếu. Nhưng tôi không nghĩ rằng nó đủ điều kiện như là một lỗi Tomcat. Nhiều khả năng một lỗi trong ImageIO.createImageOutputStream() mà tôi nghi ngờ đang giữ tham chiếu.

+0

chúng tôi phải làm điều tương tự. Gói luồng đầu ra và ngăn không cho nó phản hồi cho đến khi chúng tôi sẵn sàng. – ScArcher2

0

Bạn đang sử dụng phiên bản Tomcat nào? Đối với tôi, điều này nghe giống như một lỗi trong Tomcat, tôi không thể nghĩ ra lý do tại sao phương pháp doFilter của bạn nên được gọi với một phản hồi đã được cam kết (nếu bộ lọc đó là bộ lọc duy nhất trong chuỗi, bạn có chắc chắn về điều này không?).

Các vấn đề liên quan