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 计划任务工作?

4

2 回答 2

77

根据注解的Javadoc@Schedule默认值为:

  • *用于除小时、分钟和秒之外的所有字段;和
  • 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将防止它们随着时间的推移而累积。

于 2012-07-14T14:11:39.803 回答
25

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

(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)

我希望这些信息可以帮助您根据需要配置调度程序。

于 2019-08-01T20:47:16.943 回答