0

タイマーに例外が発生すると、タイマーの実行が停止することを理解しています。しかし、ここに私のコードがあります:

@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を呼び出してデータベースからデータを取得し、ハッシュマップにデータを入力します。

別のクラスで、クライアントはrestFul Webサービス呼び出しを行い、ハッシュマップを取得します。コードは次のとおりです。

@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サービス呼び出しをブロックするようなものですか?

ありがとう

4

1 に答える 1

0

タイマーが停止する理由はわかりませんが、マップが作成される前にメソッドを呼び出さないようにできることは次のとおりです。

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

@Startup他のメソッドが呼び出される前に、このメソッドが実行されることを保証します。

于 2012-09-20T21:54:54.703 に答える