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

2022-09-01 07:08:12

我想尝试通过以下方式使用@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 调度任务工作?


答案 1

根据注释的 Javadoc,缺省值为:@Schedule

  • *对于除小时、分钟和秒之外的所有字段;和
  • 0默认情况下,为小时、分钟和秒。

通过将小时指定并保留其默认值 ,它请求计时器在午夜后每分钟运行一小时(即 00:00、00:01、00:02、...、00:59),然后直到第二天才再次运行。相反,请使用:minute="*"0

@Schedule(hour="*", minute="*")

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

@Schedule(hour = "*", minute = "*", second = "*/10", persistent = false)

默认情况下,计划程序保留事件。如果需要,设置将防止它们随着时间的推移而积聚。persistent = false


答案 2

请查找调度程序配置的以下详细信息。

(1) 每1分钟一班

@Schedule(hour = "*", minute = "*/1", persistent = false)

(2) 每5分钟一班

@Schedule(hour = "*", minute = "*/5", persistent = false)

(3) 每 30 秒运行一次

@Schedule(hour = "*", minute = "*", second = "*/30", persistent = false)

(4)每天上午6:00跑步

@Schedule(hour = "6", minute = "0", second = "0", persistent = false)

(5)每周五下午2:00运行

@Schedule(dayOfWeek = "Fri", hour = "14", persistent = false)

(6)每月第一天上午5:00运行

@Schedule(dayOfMonth="1", hour = "5", persistent = false)

我希望这些信息能帮助您按照自己的要求配置调度程序。


推荐