据我所知,如果计时器遇到异常,它将停止运行。但这是我的代码:
@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。我该怎么做才能防止这种情况发生?比如阻止网络服务电话直到它准备好了吗?
感谢
答案 0 :(得分:0)
我不明白为什么计时器会停止,但是你可以做的就是在填充地图之前阻止调用方法:
@PostConstruct
public void atStartup() {
myMap = myBean.createData();
}
@Startup
保证在调用任何其他方法之前执行此方法。