さて、JBossにJavaアプリをデプロイしています。アプリケーションは、ジョブについて外部Webサービスをポーリングする必要があります。各ジョブは、独自のスレッドで実行する必要があります。これは、メッセージを処理するmdbsのプールを持つjmsキューと非常によく似た動作をします。唯一の本当の違いは、作業のキューが安らかなWebサービスによって提供されることです。だから私の質問は、スレッドのプールを起動するための最良の方法は何ですか、またはjbossはこれを行うためのより良い方法を持っていますか?JMSはオプションではありません。
質問する
3160 次
1 に答える
1
理論的には、Java EEコンテナーでセルフスレッドを管理するべきではありません(実際には、EJB、JPA、またはその他のコンテナー機能を使用しない場合は、もう少しリラックスできます)。
Java EE 6(JBoss 7)では、JavaEE機能を使用してそれを行うことができます。新しい@AsynchronousEJB呼び出しでタイマー機能を活用する必要があります。唯一の問題は、非同期呼び出しが失敗した場合(処理中にサーバーがクラッシュした場合)、ジョブが失われた場合に、非同期呼び出しの永続性がないことです。
ジョブが完了していることを確認する必要がある場合、Java EEの唯一の方法は永続性JMSです(タイマーEJBが設定されたローカルのものでも)
例:
@Singleton
@Startup
public class Pool{
@Inject
private AsyncBean aBean;
@Resource
private TimerService timerService;
@Timeout
public void pull(){
try{
// for performance you may get several job and launch several async job
job = getJob() // make your REST call to get the job
// make sure you realy get a job
aBean.async(job)
}finally{
//recreate the timer
timerService.createSingleActionTimer(100, new TimerConfig("timer name", false));
}
}
@PostConstruct
void init(){
timerService.createSingleActionTimer(100, new TimerConfig("timer name", false));
// as timer is created at each start up no need to persist it.
}
}
非同期Bean:
@Stateless
public class AsyncBean{
@Asynchronous
public void async(Job job){
// do your stuff
}
}
于 2012-07-27T18:22:22.680 に答える