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
保证在调用任何其他方法之前执行此方法

在无法避免抛出异常的情况下,这可能很有用