2013-04-12 15 views
5

Tôi mới đến các chú thích @Schedule trong J2EE6thông số động cho phương pháp @Schedule trong một 3.x EJB

Tôi muốn chạy một công việc sử dụng EJB 3.x với Glassfish 3.1.

Các javax.ejb.Schedule có vẻ là một lựa chọn tốt cho chúng tôi, vì vậy chúng ta có thể nghĩ về thời gian tùy chỉnh của chúng tôi như một cái gì đó như:

@Singleton 
public class CustomTimer { 
    @EJB 
    SettingsFacade settingsFacade; 

    @Schedule(second="someSecondParameter", minute="someMinuteParameter",hour="someHourParameter", persistent=false) 
    public void executeTimer(){ 
     //Code executing something against database using the settingsFacade 
    } 
} 

Dưới đây, chúng tôi muốn các thông số để được nhận được từ cơ sở dữ liệu, để chúng được thay đổi mỗi tháng. Bất kỳ giải pháp sạch cho điều này?

+0

cũng http://stackoverflow.com/questions/2598712/how-to-parameterize-scheduledfixeddelay-with-spring-3-0-expression-language thấy không biết về glassfish nhưng có lẽ ngôn ngữ biểu hiện + thuộc tính bean hoạt động – gpilotino

+0

Kính gửi @javadev, Bạn có tìm thấy giải pháp nào cho trình lập lịch tham số không? Nếu bạn tìm thấy, bạn có thể vui lòng xem câu hỏi của tôi: http://stackoverflow.com/questions/42242037/parameterize-ejb-scheduler-with-schedule-expression –

Trả lời

3

Không, không có giải pháp nào với @Schedule, vì thuộc tính chú thích nói chung phải là hằng số thời gian biên dịch.

Khi cần thêm sự linh hoạt, có thể sử dụng programmatic timers. Ngoài ra, cơ sở dữ liệu thăm dò ý kiến ​​để thay đổi cấu hình và loại bỏ hiện tại và tạo bộ tính giờ mới phải được triển khai.

+0

Lớp ScheduleExpression không hoạt động chính xác –

0

Vâng Bạn cần tạo hai Trình lập lịch biểu Trình lập lịch biểu sẽ chạy để cập nhật dữ liệu từ cơ sở dữ liệu Dựa trên đó bạn có thể tạo Bộ lập lịch khác.

Nhưng đối với điều này cần phải làm điều đó một số những gì có lập trình. Bạn cũng có thể xem EJB Timers cho cùng những gì sẽ giúp bạn trong trường hợp này. đó cũng là chú thích dựa trên.

0

Có một cách đơn giản để thực hiện việc này. Tôi muốn một cái gì đó gọi là một quá trình mỗi ngày nhưng, công việc chính nó nên được thực hiện ngẫu nhiên trong cùng một ngày. Tôi quản lý để làm điều đó bằng cách thêm một công nhân thread đơn giản để chạy sau khi dịch vụ hẹn giờ EJB đã được gọi. Sau đó, tôi sẽ đặt nó vào giấc ngủ trong một khoảng thời gian ngẫu nhiên trong ngày đó.

Đoạn mã sau là ví dụ về dịch vụ thức dậy sau mỗi 1 phút và đợi cho một chuỗi kết thúc.

@Schedule(minute = "*/1", hour = "*", persistent = false) 
public void runEveryMinute() throws InterruptedException { 
    log.log(Level.INFO, "Scheduling for every minute .. now it's: " + new Date().toString()); 

    // Delay, in milliseconds before we interrupt adding a follower thread 
    //we can therefore garantee that it runs every day 
    long patience = 1000 * 5; 

    threadMessage("Starting forever alone no more thread"); 
    long startTime = System.currentTimeMillis(); 
    Thread t = new Thread(new MessageLoop()); 
    t.start(); 

    threadMessage("Waiting for new thread to finish"); 
    // loop until MessageLoop thread exits 
    while (t.isAlive()) { 
     threadMessage("Still waiting..."); 
     // Wait maximum of 1 second for MessageLoop thread to finish. 
     t.join(1000); 
     if (((System.currentTimeMillis() - startTime) > patience) 
       && t.isAlive()) { 
      threadMessage("Tired of waiting! Adding new followers now!"); 
      t.interrupt(); 
      // Shouldn't be long now -- wait indefinitely 
      t.join(); 
     } 
    } 
    threadMessage("Finally! You are not alone anymore!"); 

} 

// Display a message, preceded by 
// the name of the current thread 
static void threadMessage(String message) { 
    String threadName = Thread.currentThread().getName(); 
    System.out.format("%s: %s%n", threadName, message); 
} 

private static class MessageLoop implements Runnable { 

    public void run() { 
     String importantInfo[] = { 
      "A kid will eat ivy too" 
     }; 
     try { 
      for (int i = 0; 
        i < importantInfo.length; 
        i++) { 
       // Pause for 4 seconds 
       int max = 10; 
       int min = 2; 
       int randomTimer = 0 + (int) (Math.random() * ((max - min) + 1)); 
       Thread.sleep(randomTimer * 1000); 
       // Print a message 
       threadMessage(importantInfo[i]); 
      } 
     } catch (InterruptedException e) { 
      threadMessage("Patience is not a virtue! Thread stopping for now!"); 
     } 
    } 
} 
4
 
@Singleton 
@Startup 
public class ScheduleTimerService { 

    @Resource private TimerService timerService; 

    public void setTimerService(TimerService timerService) {this.timerService = timerService; } 

    @PostConstruct 
    private void postConstruct() { 
     timerService.createCalendarTimer(createSchedule()); 
    } 

    @Timeout 
    public void timerTimeout(Timer timer) { 
      Add your code here to be called when scheduling is reached... 
      in this example: 01h:30m every day ;-) 
    } 

    private ScheduleExpression createSchedule(){ 

     ScheduleExpression expression = new ScheduleExpression(); 
     expression.dayOfWeek("Sun,Mon,Tue,Wed,Thu,Fri,Sat");  
     expression.hour("01"); 
     expression.minute("30"); 

     return expression; 
    } 
} 
+0

Cảm ơn bạn @ Sólon Soares , Tôi có hai câu hỏi: 1-Làm thế nào để thiết lập lịch trình này được gọi khi khởi động? , 2- Tương đương với @Schedule (giây = "1", phút = "\ */5", giờ = "\ *", persistent = false), Vui lòng chỉnh sửa mã của bạn để chạy khi khởi động. –

+1

Hi @ H.Aqjn, 1) Khởi động xảy ra khi jboss hoặc máy chủ ứng dụng khác đang bắt đầu. Xem chú thích "@Startup" phía trên khai báo lớp tên. Ứng dụng máy chủ tạo bộ đếm thời gian lập trình "@PostContruct". Vì vậy, khi bộ đếm thời gian đạt tới nó sẽ kích hoạt phương thức được chú thích bởi "@Timeout" Do đó, bất cứ khi nào có thay đổi hẹn giờ, nó sẽ được tải lại gói trong máy chủ ứng dụng (tai hoặc chiến tranh hoặc định dạng gói khác ..). Lớp biểu thức chấp nhận cùng một tham số của chú thích. –

+0

Kính gửi Sólon Soares, xin hãy xem câu hỏi của tôi: http://stackoverflow.com/questions/42242037/parameterize-ejb-scheduler-with-schedule-expression –

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