具有时间延迟的递归函数调用

时间:2012-04-16 07:16:53

标签: java multithreading web-services recursion scheduled-tasks

我有一个Web应用程序,我需要运行一个后台程序来启动Web服务,在得到响应后它将等待几秒钟(比如30)然后再次点击该服务。响应数据可以从非常小到非常大,所以我不想调用processagain直到我完成数据处理。所以,它是一个带有时间延迟的递归调用。我打算怎么做:

  1. 将ContextListener添加到网络应用程序。

  2. 在contextIntialized()方法中,调用invokeWebService(),即使用任意方法来访问Web服务。

  3. invokeWebService将如下所示:

    invokeWebService()
    {
    
    //make request
    
    //hit service
    
    //get response
    
    //process response
    
    timeDelayInSeconds(30);
    
    //recursive call
    invokeWebService();
    
    }
    
  4. PLS。建议我是否做得对。或者使用线程或调度程序。 PLS。回答示例代码。

3 个答案:

答案 0 :(得分:3)

您可以使用ScheduledExecutorService, which is part of the standard JDK since 1.5

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

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

    scheduler.scheduleAtFixedRate(r, 0, 30, TimeUnit.SECONDS);

答案 1 :(得分:1)

这不是递归的,而是重复的。你有两个选择:

  • 使用Timer和TimerTask with scheduleAtFixedRate
  • 重复使用Quartz。

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

TriggerBuilder.newTrigger().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(30))
                .build()

答案 2 :(得分:1)

从我得到的,等待有点意味着悬挂,我不认为这是一个好主意。我建议您使用诸如Quartz之类的内容,并以您希望的任何间隔运行您的方法。

  

Quartz是一个功能齐全的开源作业调度服务   与几乎任何Java EE或Java集成或一起使用   SE申请

可以访问教程here

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
    }