2011-10-21 27 views
13

Sau một vấn đề báo cáo trên question này, một giải pháp đã được tìm thấy:Làm thế nào để tránh yêu cầu thiết lập ASYNC_SUPPORTED = true để cho phép xử lý async servlet 3.0 trên Tomcat 7?

req.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true); 

này có vẻ hơi kỳ lạ và không thực sự mã 'xách tay' (nó sẽ không làm tổn thương, nhưng ...). Dường như cụ thể cho Tomcat 7. Tôi đang sử dụng Tomcat 7.0.14 như được cung cấp bởi NetBeans 7.0.1.

Tôi không thể tìm thấy tài liệu cho biết cần phải bật xử lý yêu cầu không đồng bộ trong servlet 3.0 với thuộc tính catalina. Tôi không thể tìm thấy tài liệu cho thấy một cái gì đó đặc biệt là cần thiết ở cấp cấu hình Tomcat quá.

Có cách nào để tránh phải đặt ASYNC_SUPPORTED=true trong mỗi yêu cầu để bật xử lý không đồng bộ servlet 3.0 trong Tomcat 7 không?

+0

trong Tomcat 7.0.27 'req.startAsync()' hoặc 'req.startAsync (req, res)' hoạt động không có lỗi và cài đặt bổ sung. – user1516873

Trả lời

7

Một vài điều cần kiểm tra đầu tiên:

Hãy chắc chắn rằng bất kỳ bộ lọc hoạt động theo yêu cầu cũng hỗ trợ async (như đề cập trong one of the answers cho câu hỏi bạn tham chiếu).

Hãy chắc chắn rằng bạn đang sử dụng một web.xml Servlet 3.0 - ví dụ:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
     version="3.0" 
     metadata-complete="true"> 
4

Cố gắng nâng cấp.

  • Bug 53623 cố định trong 7.0.30.
  • "Bật các van còn lại cho hỗ trợ xử lý không đồng bộ Servlet 3". (được ấn định trong 7.0.16)

Kiểm tra chi tiết đầy đủ để biết chi tiết Tomcat 7 ChangeLog.

Ngoài ra, nếu bạn muốn sử dụng async, bạn sẽ cần đảm bảo rằng tất cả các bộ lọc và van trong chuỗi (cũng như servlet, tất nhiên) đều hỗ trợ async. Đây có thể là vấn đề trong câu hỏi ban đầu, cũng như với trường hợp của bạn, ở đây.

+0

Downvote không có lời giải thích? :/ –

+0

Tôi đang sử dụng Tomcat 7.0.34, phiên bản servlet trong web.xml thực sự là 3.0 và mọi thứ nên được bật đồng bộ (vì nó hoạt động với Cầu cảng) – Eugen

+0

@Eugen Jetty có thể diễn giải thông số hơi khác một chút. "Nó hoạt động trong Jetty" không phải là một đối số vững chắc mà Tomcat có một lỗi. –

1

Tôi thấy rằng org.apache.catalina.ASYNC_SUPPORTED=true chỉ cần thiết khi bạn từ một servlet bình thường-servlet/jsp (nội bộ) sang một async-servlet! Ví dụ: Trong index.jsp của tôi, tôi nhúng <jsp:forward page="/path/AsyncServlet" /> Tôi hứa AsyncServlet hoạt động tốt trên cả Tomcat7 và Glassfish3, khi tôi kích hoạt trực tiếp từ trình duyệt! Tuy nhiên khi tôi kích hoạt nó bằng index.jsp: Tomcat7 báo cáo 500 cho "Không được hỗ trợ" Glassfish3 báo cáo 500 cho "Yêu cầu nằm trong phạm vi của bộ lọc hoặc servlet không hỗ trợ hoạt động không đồng bộ" Nếu tôi nhúng <% request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true); %> trước <jsp:forward> trong index.jsp, Tomcat7 OK, nhưng Glassfish3 vẫn là BAD! Vì vậy, tôi tìm thấy một giải pháp cho cả hai Tomcat7 và Glassfish3 (không SYNC_SUPPORTED!): Chỉ CHÍNH XÁC đính kèm sau trong web.xml:

<servlet> 
    <servlet-name>indexPage</servlet-name> 
    <jsp-file>/index.jsp</jsp-file> 
    <async-supported>true</async-supported> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>indexPage</servlet-name> 
    <url-pattern>/index.jsp</url-pattern> 
    </servlet-mapping> 

Kết luận (đối với tôi): bạn không thể chuyển tiếp từ một bình thường-servlet/jsp/filter thành một async-one! Vì tính năng yêu cầu không đồng bộ phải được đặt trước! Vì vậy, các giải pháp chung cho một servlet/jsp/lọc mà cần phải chuyển tiếp đến một async-servlet là: Sử dụng <servlet>/<async-supported>true hoặc @WebServlet(asyncSupported = true) cho một servlet được xử lý trước; Sử dụng <servlet>/<async-supported>true cho một jsp được xử lý trước Sử dụng <filter>/<async-supported>true hoặc @WebFilter(asyncSupported = true) cho bộ lọc được xử lý trước; Hy vọng điều này có thể giúp ích một chút!

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