2009-08-12 11 views
10

Tôi cần tạo Bộ hẹn giờ khoảng thời gian được đặt tự động chạy một lần một tuần. Tôi không muốn nó bắt đầu dựa trên đầu vào của người dùng, nhưng tôi muốn nó được tạo khi ứng dụng được triển khai đến máy chủ. Mỗi ví dụ mà tôi đã thấy có một lớp khác bắt đầu hẹn giờ. Tôi không muốn sử dụng một bean điều khiển thông báo để tạo bộ đếm thời gian vì kiểm toán chỉ nên truy vấn cơ sở dữ liệu trong một khoảng thời gian nhất định và không dựa trên các hành động gửi tin nhắn.Làm thế nào để bắt đầu hẹn giờ EJB khi triển khai?

Tôi đã bao gồm ví dụ về Bộ hẹn giờ. Trong ví dụ bên dưới, bộ hẹn giờ sẽ kích hoạt sau mỗi 10 phút. Là một thử nghiệm, tôi muốn bộ đếm thời gian kích hoạt sau mỗi 10 phút để tôi có thể kiểm tra bộ hẹn giờ.

@Stateless 
public class TimerTest implements 
     TimerTestLocal, TimerTestRemote{ 

    @Resource 
    private TimerService timerService; 
    private Logger log = Logger.getLogger(TimerTest.class); 
    private long interval = 1000 * 60 * 10; 
    private static String TIMER_NAME = "AuditTimer"; 

    public void scheduleTimer() throws NamingException { 
     // TODO Auto-generated method stub 
     Calendar cal = Calendar.getInstance(); 
     //cal.set(Calendar.HOUR_OF_DAY, 23);//run at 11pm 
     //cal.set(Calendar.MINUTE, 00); 
     //cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY); 
     SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm"); 
     log.debug("schedule for: " + sdf.format(cal.getTime())); 

     timerService.createTimer(cal.getTime(), interval, TIMER_NAME); 
    } 

    public void cancelTimer() { 
     for(Object obj : timerService.getTimers()) 
     { 
      Timer timer = (Timer)obj; 
      if(timer.getInfo().equals(TIMER_NAME)) 
       timer.cancel(); 
     } 
    } 

    @Timeout 
    public void timerEvent(Timer timer) { 
     log.debug("timer fired"); 
    } 


} 

Vì vậy, có cách nào để tôi có thể bắt đầu hẹn giờ này khi ứng dụng được triển khai không? Tôi không nghĩ rằng đó là một ý tưởng tốt để đặt việc tạo ra các bộ đếm thời gian trong một phương pháp @PostConstruct vì bộ nạp lớp trên máy chủ.

Trả lời

16

Cách mà tôi đã thực hiện bộ hẹn giờ trong quá khứ là tạo trình nghe ngữ cảnh trong web.xml để định cấu hình bộ hẹn giờ.

Bằng cách đó bạn có thể đảm bảo rằng nó được bắt đầu với vùng chứa và tắt một cách rõ ràng khi ứng dụng bị gỡ xuống.

+0

Điều đó hiệu quả. Cảm ơn. – scheibk

1

Tôi không biết liệu việc sử dụng contextListener để bắt đầu hẹn giờ có thể hoạt động hay không. Từ bài viết này, how to use EJb 3 timer in a weblogic 10 cluster, có vẻ như bạn có thể gặp phải một số sự cố trong weblog 10.3.2.

+0

Tôi đã tìm thấy cùng một vấn đề trong JBoss EAP 5.1. Không thể truy cập EJB tại thời điểm trình nghe ngữ cảnh được gọi. – mekondelta

24

Nếu dự án của bạn có thể sử dụng jee6/ejb3.1 thì có một giải pháp tốt hơn cho vấn đề này. http://docs.oracle.com/javaee/6/tutorial/doc/bnboy.html

@javax.ejb.Schedule(minute="*/10", hour="*") 
public void automaticTimeout() { 
    logger.info("Automatic timeout occured"); 
} 

Bằng việc sử dụng chú thích @Schedule mới, bạn có quyền kiểm soát sâu rộng về khi nào và bao lâu một phương pháp thời gian chờ sẽ được gọi. Ưu điểm lớn: bạn không còn phải khởi động bộ hẹn giờ "từ bên ngoài" nữa.

Oracle viết:

giờ tự động được tạo ra bởi các EJB container khi một doanh nghiệp đậu có chứa các phương pháp chú thích với các @Schedule hoặc @Schedules chú thích được triển khai. Một bean doanh nghiệp có thể có nhiều phương thức thời gian chờ tự động , không giống như bộ hẹn giờ có lập trình, cho phép chỉ một phương pháp được chú thích bằng chú thích @Timeout trong lớp bean doanh nghiệp .

+0

Để trả lời câu hỏi khác của bạn – seafoxx