@Schedule注解每隔几分钟(或秒)运行一次。

34

我想尝试以下方式使用@Schedule注解:

public class MyTestServlet extends HttpServlet {
    private static JcanLogger LOG = JcanLoggerFactory.getLogger(ServiceTestServlet.class);

    @EJB CronService cronService;

    public void service(HttpServletRequest req, HttpServletResponse resp) throws .... {
    ....
    cronService.iLive(); 
}
---
    @Local // because the ejb is in a servlet (there is no other jvm)
public interface CronService {

    public void iLive();
    public void runsEveryMinute();
}
---
@Singleton
public class CronServiceBean implements CronService {
    private static final JcanLogger LOG = JcanLoggerFactory.getLogger(CronServiceBean.class);

    @Schedule(minute="*")
    public void runsEveryMinute() {
        LOG.info(" runs EveryMinute ");
    }

    public void iLive() {
        LOG.info("iLive");

    }
 ---
 LOG
 ... 
 CronServiceBean:34  ] iLive

根据日志,CronService正常运行,但是预定的任务“runsEveryMinute”没有按计划执行。

使用EJB预定任务应该如何工作?

2个回答

77
根据 Javadoc@Schedule 注释的默认值,除了 hour、minute 和 second 字段外,其它所有字段都使用 *;hour、minute 和 second 字段默认为 0
通过指定 minute="*" 并将 hour 保留为默认值 0,请求定时器在午夜后每分钟运行一次,持续一个小时(即 00:00、00:01、00:02、...、00:59),然后直到第二天才再次运行。不要使用这种方式,而应该使用:
@Schedule(hour="*", minute="*")

要每隔几秒钟运行一次(例如,10 秒),您可以使用类似于 cron 的语法:

@Schedule(hour = "*", minute = "*", second = "*/10", persistent = false)
默认情况下,调度程序会持久化事件。如果需要,将 persistent = false 可以防止事件随时间累积。

27
请查看以下安排程序配置的详细信息。
(1)每1分钟运行一次。
@Schedule(hour = "*", minute = "*/1", persistent = false)

(2) 每5分钟运行一次

@Schedule(hour = "*", minute = "*/5", persistent = false)
每30秒运行。
@Schedule(hour = "*", minute = "*", second = "*/30", persistent = false)
每天早上6:00运行
@Schedule(hour = "6", minute = "0", second = "0", persistent = false)

(5)在每周五下午2点运行

@Schedule(dayOfWeek = "Fri", hour = "14", persistent = false)
每个月的第一天上午5:00运行
@Schedule(dayOfMonth="1", hour = "5", persistent = false)

我希望这些信息可以帮助您按照您的要求配置计划任务。


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