2012-07-14 70 views
16

我想尝试使用@Schedule注释以下列方式:@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计划任务工作?

回答

51

作为每Javadoc@Schedule注释,默认值是:

  • *以外的小时,分​​钟和秒的所有字段;和
  • 0默认为小时,分钟和秒。

通过指定minute="*",并在其0默认离开时,它请求定时器运行午夜一小时后每分钟(即00:00,00:01,00:02,... 00:59),然后再不等到第二天。相反,使用:

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

运行每隔几秒钟(例如,10秒),你可以使用一个cron样的语法:

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

默认情况下,调度仍然存在的事件。如果需要,设置persistent = false将防止它们随着时间流逝而累积。