2011-11-18 15 views
8

Tôi đang phát triển một ứng dụng web Java. Ứng dụng này kết nối với chỉ mục Lucene. Tôi tạo ra một ví dụ đơn lẻ của IndexSearcher. Ví dụ này sẽ mở một số tệp. Khi tôi triển khai lại ứng dụng web, các tệp được mở bởi phiên bản trước đó của IndexSearcher tiếp tục vẫn mở và một cá thể khác được tạo bởi ứng dụng được triển khai lại. Sau một vài redeploys, hệ thống bắt đầu ném một ngoại lệ "quá nhiều tệp mở". Tôi muốn đóng phiên bản cũ trước khi triển khai lại, để các tệp cũ được đóng lại, nhưng tôi không thể tìm ra cách để thực hiện điều đó? Có một chỉ thị nào trong web.xml được gọi là không triển khai, tương tự như tải-on-startup không? Tôi đang chạy ứng dụng web trên máy chủ jboss.Phương thức gọi để hủy kết nối từ ứng dụng web Java

Trả lời

17

Triển khai ServletContextListener.

@WebListener 
public class LuceneConfig implements ServletContextListener { 

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     // Do your job here during webapp startup. 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent event) { 
     // Do your job here during webapp shutdown. 
    } 

} 

Nếu bạn không phải trên Servlet 3.0 chưa (đó là đã ra trong 2 năm mặc dù), sau đó bạn cần phải loại bỏ các @WebListener chú thích và đăng ký nó bằng tay trong web.xml như sau:

<listener> 
    <listener-class>com.example.LuceneConfig</listener-class> 
</listener> 
+0

Nó hoạt động ở đây mà không cần đăng ký. Sử dụng Mojarra 2.3.3 trên Payara 4.1 (173 build). – Roland

+1

Chắc chắn nó sẽ hoạt động tốt. Payara 4.x là Servlet 3.1. Sau đó, '@ WebListener' sẽ hoạt động tốt. Như đã trả lời, nó sẽ không hoạt động khi bạn chưa sử dụng Servlet 3.0. Hàm JSF/phiên bản không liên quan vì nó không đóng vai trò ở đây. Chỉ phiên bản Servlet mới có liên quan. – BalusC

+0

Cảm ơn bạn đã làm rõ. – Roland

2

Nếu bạn triển khai javax.servlet.ServletContextListener và đăng ký lớp đó trong web.xml dưới dạng <listener>, sau đó phương thức contextDestroyed() sẽ được gọi trước khi bối cảnh bị dỡ.