1

さて、JBossにJavaアプリをデプロイしています。アプリケーションは、ジョブについて外部Webサービスをポーリングする必要があります。各ジョブは、独自のスレッドで実行する必要があります。これは、メッセージを処理するmdbsのプールを持つjmsキューと非常によく似た動作をします。唯一の本当の違いは、作業のキューが安らかなWebサービスによって提供されることです。だから私の質問は、スレッドのプールを起動するための最良の方法は何ですか、またはjbossはこれを行うためのより良い方法を持っていますか?JMSはオプションではありません。

4

1 に答える 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 に答える