我有一个Web应用程序,我需要运行一个后台程序来启动Web服务,在得到响应后它将等待几秒钟(比如30)然后再次点击该服务。响应数据可以从非常小到非常大,所以我不想调用processagain直到我完成数据处理。所以,它是一个带有时间延迟的递归调用。我打算怎么做:
将ContextListener添加到网络应用程序。
在contextIntialized()方法中,调用invokeWebService(),即使用任意方法来访问Web服务。
invokeWebService将如下所示:
invokeWebService()
{
//make request
//hit service
//get response
//process response
timeDelayInSeconds(30);
//recursive call
invokeWebService();
}
PLS。建议我是否做得对。或者使用线程或调度程序。 PLS。回答示例代码。
答案 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)
这不是递归的,而是重复的。你有两个选择:
在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
}