2013-10-21 41 views
0

我想在计划时间(英国东部时间23点59分和英国西部时间8点)执行两项任务。我创建了一个保持这些方法的EJB单例bean:Java EE单例计划任务执行两次

@Singleton 
public class OfferManager { 

    @Schedule(hour = "23", minute = "59", timezone = "CET") 
    @AccessTimeout(value = 0) // concurrent access is not permitted 
    public void fetchNewOffers() { 
     Logger.getLogger(OfferManager.class.getName()).log(Level.INFO, "Fetching new offers started"); 

     // ... 

     Logger.getLogger(OfferManager.class.getName()).log(Level.INFO, "Fetching new offers finished"); 
    } 

    @Schedule(hour="8", minute = "0", timezone = "CET") 
    public void sendMailsWithReports() { 
     Logger.getLogger(OfferManager.class.getName()).log(Level.INFO, "Generating reports started"); 

     // ... 

     Logger.getLogger(OfferManager.class.getName()).log(Level.INFO, "Generating reports finished"); 
    } 
} 

问题是两个任务都执行了两次。服务器是WildFly Beta1,在UTC时间配置。

这里有一些服务器日志,这可能是有用的:

2013-10-20 11:15:17,684 INFO [org.jboss.as.server] (XNIO-1 task-7) JBAS018559: Deployed "crawler-0.3.war" (runtime-name : "crawler-0.3.war") 
2013-10-20 21:59:00,070 INFO [com.indeed.control.OfferManager] (EJB default - 1) Fetching new offers started 
.... 
2013-10-20 22:03:48,608 INFO [com.indeed.control.OfferManager] (EJB default - 1) Fetching new offers finished 
2013-10-20 23:59:00,009 INFO [com.indeed.control.OfferManager] (EJB default - 2) Fetching new offers started 
.... 
2013-10-20 23:59:22,279 INFO [com.indeed.control.OfferManager] (EJB default - 2) Fetching new offers finished 

什么可能是这种行为的原因是什么?

+0

检查是否有其他'@ Schedule'可以在'21:59:00'上运行。您显示的代码此时应该*不*运行。 – 2013-10-21 09:53:37

+0

这些是使用'@ Schedule'注释的唯一方法 – Khozzy

+0

第二种方法也执行两次。在计划的时间之前2小时,然后正确 – Khozzy

回答

1

我解决了指定与服务器时间(UTC)的预定时间的问题。 所以

@Schedule(hour = "23", minute = "59", timezone = "CET") 

被替换:

@Schedule(hour = "21", minute = "59") 

我不知道这样beahaviour的原因,也许Wildfly的提前释放的问题。

0

我与TomEE羽流7.0.4有同样的问题。在我的情况下,解决方案是将@Singleton更改为@Stateless