从其他方法抛出异常后,EJB计时器停止

时间:2012-09-20 20:27:55

标签: java-ee timer ejb

据我所知,如果计时器遇到异常,它将停止运行。但这是我的代码:

@Startup
@Singleton
public class TimerBean
{
    private HashMap myMap;    

    @EJB
    private MyBean myBean;

    @Schedule (minute="*/1" ....)
    public void myTimer()
    {  
       myMap.clear();
       myMap = myBean.createData(); //this takes a few seconds to finish

    }
...
}

所以计时器每1分钟触发一次,并调用myBean从数据库中获取数据并填充hashmap。

现在在另一个类中,客户端调用restFul web服务来获取hashmap,这里是代码:

@EJB
private TimerBean timerBean;

@GET
@Path("query")
@Produces(MediaType.APPLICATION_JSON)
public MyObject getData()
{
    timerBean.getMyMap(); //call timerBean to get the hashmap
    //in case the hashmap returned is empty, meaning it's not ready yet
     //(it's still in the process of populating)
     //throw an WebApplicationException 
    //so that from the user's end, I can show a different web page
    //and ask the user to wait.

}
发生的事情是,有时,当它抛出异常时,它也会导致计时器再次停止工作。为什么?计时器itselt没有遇到任何异常。

我意识到潜在的问题是当用户尝试获取hashmap时,计时器可能正在填充hashmap。我该怎么做才能防止这种情况发生?比如阻止网络服务电话直到它准备好了吗?

感谢

1 个答案:

答案 0 :(得分:0)

我不明白为什么计时器会停止,但是你可以做的就是在填充地图之前阻止调用方法:

@PostConstruct
public void atStartup() {
  myMap = myBean.createData(); 
}

@Startup保证在调用任何其他方法之前执行此方法。