如何在EJB调度中设置计时器值?

3

目前我正在使用以下配置来安排我的调度程序。

 @Schedule(second ="1/10", minute = "*", hour = "*")
 private void scheduleUser() {      
    try {
        new UserFacade().insertUserInfo();            
    } catch (Exception e) {
        logger.error("Error in : " + e);
    }
 }

现在我想以运行时的方式设置计时器值而不是硬编码方式。 假设我有一个名为 Property 的bean,并且它有一个名为 frequency 的字段。

现在我想要为 EJB 调度程序设置像 new Property().getFrequency() 这样的值。

是否有一种类似以下方式的方法?

 @Schedule(second =new Property().getFrequency(), minute = "*", hour = "*")
 private void scheduleUser() {      
    try {
        new UserFacade().insertUserInfo();            
    } catch (Exception e) {
        logger.error("Error in : " + e);
    }
 }
2个回答

2

不使用注释,需要使用编程定时器(Java 7,EE7):

package com.foo;

import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.ejb.EJBException;
import javax.ejb.Singleton;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerService;

@Singleton
public class MyTimer {
    @Resource
    private TimerService timerService;

    @Timeout
    public void timeout(Timer timer) {
        System.out.println("TimerBean: timeout occurred");
    }

    public void schedule(Date start, long intervalMilis) {
        try{
            timerService.createTimer(start, intervalMilis, "my timer");            
        } catch (EJBException|IllegalArgumentException|IllegalStateException ex)  {
            Logger.getLogger(MyTimer.class.getName()).log(Level.WARNING, ex.getMessage(), ex);
        }
    }
}

请参阅https://docs.oracle.com/javaee/7/tutorial/ejb-basicexamples004.htm以获取更多信息。


0
与Vegard提交的答案类似,但这个使用ScheduleExpression。 更多信息请参见Beginning Java EE 7 book
import javax.ejb.ScheduleExpression;

@Singleton
public class MyTimer {

    @Resource
    private TimerService timerService;

    @Timeout
    public void timeout(Timer timer) {
        System.out.println("TimerBean: timeout occurred");
    }

    public void schedule(String DOW, String H, String M, String S) {
        try{
            ScheduleExpression scheduleExpression = new ScheduleExpression();
            scheduleExpression.dayOfWeek(DOW); 
            scheduleExpression.hour(H); 
            scheduleExpression.minute(M); 
            scheduleExpression.second(S); 

            timerService.createCalendarTimer(scheduleExpression, new TimerConfig(this, false));
        } catch (EJBException|IllegalArgumentException|IllegalStateException ex)  {
            Logger.getLogger(MyTimer.class.getName()).log(Level.WARNING, ex.getMessage(), ex);
        }
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接