Jakarta ee EJB计时器在从其他方法引发异常后停止
我知道如果计时器遇到异常,它将停止运行。但我的代码是:Jakarta ee EJB计时器在从其他方法引发异常后停止,jakarta-ee,timer,ejb,Jakarta Ee,Timer,Ejb,我知道如果计时器遇到异常,它将停止运行。但我的代码是: @Startup @Singleton public class TimerBean { private HashMap myMap; @EJB private MyBean myBean; @Schedule (minute="*/1" ....) public void myTimer() { myMap.clear(); myMap = myB
@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.
}
有时,当它抛出异常时,也会导致计时器再次停止工作。为什么?计时器本身没有遇到任何异常
<>我意识到潜在的问题是当用户试图获取哈希表时,计时器可能在填充哈希表的中间。我应该做些什么来防止这种情况?比如在web服务调用准备就绪之前阻止它
谢谢我不明白计时器为什么会停止,但下面是您可以做的事情,防止在填充映射之前调用该方法:
@PostConstruct
启动时的公共无效(){
myMap=myBean.createData();
}
@Startup
保证在调用任何其他方法之前执行此方法 在无法避免抛出异常的情况下,这可能很有用