2011-02-04 41 views
8

Tôi gặp sự cố khi làm mới hoặc tải lại một bean được quản lý phạm vi ứng dụng. Nó hoạt động như bean dữ liệu được lưu trữ. Vì vậy, một khi dữ liệu được thay đổi trên bên db, tôi muốn tải lại danh sách trong bean. Có cách nào để làm mới/tải lại danh sách, nói một lần một ngày dựa trên thời gian nhất định không? Cảm ơnLàm mới/Tải lại Phạm vi quản lý phạm vi ứng dụng

Trả lời

14

Chỉ cần thêm phương pháp vào bean được phủ phạm vi ứng dụng thực hiện chính xác điều đó.

public void reload() { 
    list = dao.list(); 
} 

Sau đó lấy/tiêm hạt này vào đậu khác và gọi phương thức.

data.reload(); 

Cập nhật xin lỗi, tôi bỏ qua "một lần một ngày" bit. Bạn có nghĩa là tải lại tự động trong nền? Điều này là tốt nhất để đạt được bằng một chuỗi nền được quản lý bởi ScheduledExecutorService. Tạo một ServletContextListener thích sau:

@WebListener 
public class Config implements ServletContextListener { 

    private ScheduledExecutorService scheduler; 

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     Reloader reloader = new Reloader(event.getServletContext()); 
     scheduler = Executors.newSingleThreadScheduledExecutor(); 
     scheduler.scheduleAtFixedRate(reloader, 1, 1, TimeUnit.DAYS); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent event) { 
     scheduler.shutdownNow(); 
    } 

} 

đâu giao diện lớp Reloader như thế này (giả định rằng tên bean được quản lý là data)

public class Reloader implements Runnable { 

    private ServletContext context; 

    public Reloader(ServletContext context) { 
     this.context = context; 
    } 

    @Override 
    public void run() { 
     Data data = (Data) context.getAttribute("data"); 
     if (data != null) { 
      data.reload(); 
     } 
    } 

} 
+0

Cảm ơn @BalusC nhiều – leo

+1

Bạn đang chào đón. Tuy nhiên, bạn phải cực kỳ cẩn thận với việc quản lý các luồng trong một servletcontainer. 'Scheduler.shutdownNow();' bit trong 'contextDestroyed()' là rất quan trọng. Bạn có thể xem xét ủy quyền công việc quản lý luồng cho servletcontainer, nếu nó hỗ trợ nó. JBoss có ví dụ Quartz cho điều này, Glassfish có ví dụ 'WorkManager' cho việc này. Trong Tomcat, ví dụ trên là đặt cược tốt nhất của bạn. – BalusC

+0

@BalusC Tôi có cùng nhu cầu. Tôi đã thực hiện điều này trong ứng dụng của mình. Vấn đề duy nhất là trong phương thức 'Reloader'' run() 'bean của tôi luôn là null. Bạn có thể gợi ý cho tôi không – leostiw