2012-05-28 29 views
8

Tôi có một servlet được sử dụng để lấy dữ liệu từ nhiều datapoint REST của bên thứ ba, tích hợp tất cả dữ liệu và báo cáo dữ liệu ở định dạng HTML. Tôi cũng có một bộ lọc trong đó có các dòng sau -Làm thế nào để nâng cấp các bộ lọc để hỗ trợ servlet Servlet 3.0 không đồng bộ

  1. Tạo một bản ghi sự kiện khi yêu cầu truy cập các bộ lọc và thêm các đối tượng eventrecord để yêu cầu
  2. thực hiện chain.doFilter - cho phép servlet để bổ sung thêm chi tiết cho eventrecord
  3. trên đường trở về trình duyệt, bộ lọc nhận đối tượng sự kiện và ghi nhật ký.

Bây giờ nếu tôi sử dụng không đồng bộ servlet sử dụng AsyncContext context = request.getAsyncContext();, mà sẽ nói chuyện với datapoints REST của cùng nhưng như và khi dữ liệu đã sẵn sàng, nó sẽ ghi vào dòng phản ứng thay vì chờ cho tất cả các điểm dữ liệu REST để trả lời, Tôi sẽ viết lại bộ lọc của mình bằng cách nào? Nó sẽ được gắn vào luồng có trách nhiệm xóa dữ liệu từ các điểm dữ liệu REST sao cho khi tất cả dữ liệu được xử lý và được sử dụng, nó sẽ ghi lại sự kiện không? Có bất kỳ mẫu phổ biến nào mà tôi có thể nghiên cứu để hiểu cách các trường hợp sử dụng này có thể được xử lý với servlet không đồng bộ của Servlet 3.0 không? Tôi đang sử dụng JDK 6.0, Tomcat 7.0.

Trả lời

7

Chỉ cần thêm @WebFilter(urlPatterns = {"/*" }, asyncSupported = true) vào web-xml cho bộ lọc của bạn.

Hoặc thêm <async-supported>true</async-supported>

0

Tôi đã đặt một bounty như tôi không chắc chắn bản thân mình như thế nào để hỗ trợ đúng instrumenting hoặc chẩn đoán bộ lọc (ví dụ Codahales metrics filters).

Trong khi thêm <async-supported>true</async-supported> vào bộ lọc của bạn chắc chắn sẽ làm cho chúng hoạt động, nó có thể không nhận được kết quả bạn mong đợi (trong trường hợp chỉ số tất cả yêu cầu của bạn sẽ xuất hiện rất nhanh). Nó có thể có vẻ như một ý tưởng tốt để có được AsyncContext ngay trong bộ lọc để ràng buộc dữ liệu số liệu but various containers apparently have issues with this và tôi tin rằng các khung như Spring cũng có vấn đề (điều này có thể chỉ là phiên bản cũ hơn của Spring). Đó là hầu hết các khuôn khổ mong đợi nửa đầu của yêu cầu xử lý để được đồng bộ (tôi có thể ồ ạt sai về điều này).

Do đó, có vẻ như cách chứng minh lừa chỉ là tích hợp bộ lọc ở cấp khung. Ví dụ: Spring cung cấp org.springframework.web.context.request.async.DeferredResultProcessingInterceptor tương tự như các sự kiện AsyncContext.

Điều này hơi không may vì không phải tất cả yêu cầu có thể được xử lý bởi khung web nhưng sau đó lại có sự khác biệt giữa xử lý phần đầu tiên của yêu cầu và thực sự hoàn thành (nghĩa là bây giờ là hai số liệu bạn có thể muốn theo dõi).

0

@WebFilter Chú thích đã được giới thiệu trong Java EE 6. Nó định nghĩa các phần tử khác nhau như filterName, asyncSupported và servletNames, vv @WebFilter không thể được sử dụng mà không có web.xml vì @WebFilter không xác định thứ tự. @WebFilter giảm cấu hình khác trong web.xml.

@WebFilter(filterName="filterOne") 
public class FilterOne implements Filter { 
    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 
    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 
     System.out.println("Inside filter one."); 
     chain.doFilter(request, response); 
    } 
    @Override 
    public void destroy() { 
    } 
} 
Các vấn đề liên quan