1

私は Web アプリケーションを持っています。Web サービスにヒットするバックグラウンド プロセスを実行する必要があります。応答を取得した後、数秒 (たとえば 30) 待機してから、再びサービスにヒットします。応答データは非常に小さいものから非常に大きいものまでさまざまであるため、データの処理が完了するまでプロセスを再度呼び出したくありません。したがって、時間遅延のある再帰呼び出しです。私がやろうとしている方法は次のとおりです。

  1. ContextListener を Web アプリに追加します。

  2. contextIntialized() メソッドで、invokeWebService() を呼び出します。つまり、任意のメソッドを呼び出して Web サービスにアクセスします。

  3. invokeWebService は次のようになります。

    invokeWebService()
    {
    
    //make request
    
    //hit service
    
    //get response
    
    //process response
    
    timeDelayInSeconds(30);
    
    //recursive call
    invokeWebService();
    
    }
    

お願いします。私がそれを正しく行っているかどうかを提案します。または、スレッドまたはスケジューラを使用します。お願いします。サンプルコードで答えます。

4

3 に答える 3

3

ScheduledExecutorService1.5 以降の標準 JDK の一部である を使用できます。

    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    Runnable r = new Runnable() {

        @Override
        public void run() {
            invokeWebService();
        }
    };

    scheduler.scheduleAtFixedRate(r, 0, 30, TimeUnit.SECONDS);
于 2012-04-16T08:59:32.960 に答える
1

再帰的ではありませんが、繰り返されます。ここでは2つの選択肢があります。

  • scheduleAtFixedRateでTimerとTimerTaskを使用する
  • 繰り返しスケジュールでクォーツを使用します。

クォーツでは、次のコードを使用して繰り返しスケジュールを作成できます。

TriggerBuilder.newTrigger().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(30))
                .build()
于 2012-04-16T07:22:33.880 に答える
1

私が得ていることから、待つことはぶら下がることを意味しますが、それは本当に良い考えではないと思います。Quartzなどを使用して、任意の間隔でメソッドを実行することをお勧めします。

Quartzは、事実上すべてのJavaEEまたはJavaSEアプリケーションと統合したり、一緒に使用したりできる、フル機能のオープンソースジョブスケジューリングサービスです。

チュートリアルはここからアクセスできます。

ここで述べられているように、あなたはそのようなことをすることができます:

JobDetail existingJobDetail = sched.getJobDetail(jobName, jobGroup);
    if (existingJobDetail != null) {
        List<JobExecutionContext> currentlyExecutingJobs = (List<JobExecutionContext>) sched.getCurrentlyExecutingJobs();
        for (JobExecutionContext jec : currentlyExecutingJobs) {
            if(existingJobDetail.equals(jec.getJobDetail())) {
                //String message = jobName + " is already running.";
                //log.info(message);
                //throw new JobExecutionException(message,false);
            }
        }
        //sched.deleteJob(jobName, jobGroup); if you want to delete the scheduled but not-currently-running job
    }
于 2012-04-16T07:24:53.597 に答える