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

您可以使用 a ScheduledExecutorService,它是自 1.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

它不是递归的,而是重复的。您在这里有两个选择:

  • 将 Timer 和 TimerTask 与 scheduleAtFixedRate 一起使用
  • 重复使用 Quartz。

在石英中,您可以使用以下代码创建重复计划:

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

据我所知,等待有点意味着挂起,我真的不认为这是一个好主意。我建议您使用Quartz之类的东西,并以您希望的任何时间间隔运行您的方法。

Quartz 是一个功能齐全的开源作业调度服务,可以与几乎任何 Java EE 或 Java SE 应用程序集成或一起使用

教程可以在这里访问。

here所述,您可以执行以下操作:

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 回答