2017-02-15 33 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注解根本就没有执行。我的意思是调度程序在开始时不调用。另外,我还有另一个要求:如果可能的话(我真的很感谢)修改你的答案(特别是代码),以便其他用户(我的意思是不依赖于你的班级)通用。 –