2017-02-15 28 views
1

我使用EJB 3.1和jboss-EAP-6.4,我想設置一些動態參數,小時,分鐘和EJB調度的第二如下:參數化EJB調度附表表達

非參數代碼 - 這在每5分鐘的第30秒運行:

@Singleton 
@Startup 
public class TriggerJob { 
    @EJB 
    //some db injections   

    @PostConstruct 
    public void onStartup() { 
     try { 
      preparation(); 
     } catch (CertificateVerificationException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Schedule(second = "30", minute = "*/5", hour = "*", persistent = false) 
    public void preparation() { 
    //my scheduled tasks 
    } 
} 

上面的代碼正確執行。

動態參數代碼 - 這應該在每5分鐘的第30秒運行:

@Singleton 
@Startup 
public class TriggerJob { 

    @EJB 
    //some injections 

    private boolean runningFlag = false; 

    @Resource 
    private TimerService timerService; 

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

    @Timeout 
    public void timerTimeout() { 
     try { 
      preparation(); 
     } catch (CertificateVerificationException e) { 
      e.printStackTrace(); 
     } 
    } 

    @PostConstruct 
    private void postCunstruct() { 
     timerService.createCalendarTimer(createSchedule(),new TimerConfig("EJB timer service timeout at ",false)); 
    } 

    private ScheduleExpression createSchedule() { 
     ScheduleExpression expression = new ScheduleExpression(); 
     expression.hour("*") 
       .minute("*/5") 
       .second("30"); 
     return expression; 
    } 

    public void preparation(){ 
    // my scheduled tasks 
    } 
} 

上面的代碼不正確執行,通常它在第二執行多次。

另外,我看了這並沒有幫助我的一些其他問題:

Dynamic parameters for @Schedule method in an EJB 3.x

Using the Timer Service - The Java EE 6 Tutorial

任何幫助,將不勝感激。

+0

可以調試和驗證「定時器」目的是通過「createCalendarTimer」回來了,它包含ScheduleExpression和比較的需要與否無論是創建。另外檢查是否沒有其他定時器處於活動狀態。 –

+0

親愛的@Nayan Wadekar乘法運行可以通過回答來解決,但會出現一個新問題:調度程序在啓動時不會執行 –

+1

不要認爲給定的代碼有任何問題。您是否嘗試過調試,表達式是否正確,超時方法調用是否正確,postconstruct等。 –

回答

1

相反,使用編程調度,這裏是一個〔實施例:

@Singleton 
@Startup 
public class TriggerJob{ 

    @EJB 
    //some injections 

    @Resource 
    private TimerService timerService; 

    @PostConstruct 
    public void init() { 
     createTimer(); 
     //the following code resolve my startup problem 
     try { 
     preparation(); 
     } catch (CertificateVerificationException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Timeout 
    public void timerTimeout() { 
     try { 
     preparation(); 
     } catch (CertificateVerificationException e) { 
     e.printStackTrace(); 
     } 
    } 

    private void createTimer() { 
     ScheduleExpression scheduleExpression = new ScheduleExpression(); 
     scheduleExpression.second("30").minute("*/5").hour("*"); 
     TimerConfig timerConfig = new TimerConfig(); 
     timerConfig.setPersistent(false); 
     timerService.createCalendarTimer(scheduleExpression, timerConfig); 
     } 

    public void preparation(){ 
     // my scheduled tasks 
    } 
} 
+0

致謝親愛的@javadev,但您的代碼中存在一些誤解問題:1-'PropertiesLoader'爲未知類,2-'constructCronsMap'爲未定義的參數,3-我應該在哪裏定義'SECOND','MINUTE'和'HOUR'? ,4-您的解決方案不是全參數,因爲您爲AccessTimeout註釋設置了一個數字(30);有沒有完整的參數化方法? –

+1

entitiesUpdater在schedulerexpression上調用時基於cron表達式,30只是timeOut(當發生大事務時),所以關於註釋(我把它移除了)。 PropertiesLoader是我自己的類(我從屬性文件中加載這些屬性,MINUTE,SECOND和DAY_OF_WEEK是屬性鍵btw)。你可以配置你自己的參數(我假設你從DB獲得這些參數)。 – javadev

+0

你說的沒錯,但是有一個問題:@Startup註解根本就沒有執行。我的意思是調度程序在開始時不調用。另外,我還有另一個要求:如果可能的話(我真的很感謝)修改你的答案(特別是代碼),以便其他用戶(我的意思是不依賴於你的班級)通用。 –