如何使用Java中的计时器在特定时间内运行作业?
我正在开发一个Web应用程序,我需要运行一个60秒的线程,需要检查来自Web服务的响应。 如果响应在60秒内到达,我将转发成功,然后我将在60秒后转发到超时页面。 我在使用JSF 2.0? 我曾想过使用Timer但不确定我是否只能在sprcefic的时间内运行计时器。
这有什么聪明的解决方案?
绝对不要使用Timer
! 对于一次性运行的桌面应用程序来说很有趣,但是在长期运行的Java EE Web应用程序中使用它时会遇到严重的潜在问题。
而是使用java.util.concurrent
包中的执行程序 。 这是一个启动示例:
ExecutorService executor = Executors.newSingleThreadExecutor(); // An application wide thread pool executor is better. Callable task = new Callable () { @Override public InputStream call() throws Exception { // Do here your webservice call job. return new URL("http://stackoverflow.com").openStream(); } }; try { InputStream input = executor.invokeAny(Arrays.asList(task), 60, TimeUnit.SECONDS); // Successful! Forward to success page here. } catch (TimeoutException e) { // Timeout occurred. Forward to timeout page here. }
是的,您可以创建一个在一定时间后过期的计时器。 请参阅此链接http://docs.oracle.com/javaee/1.4/api/javax/ejb/TimerService.html 。
Java
- 创建Session-或MessageDriven-Bean
-
注入TimerService
@Ressource TimerService ts;
-
创建计时器
... // create Timer which starts after 10s every 10s Timer timer = ts.createTimer(10000, 10000, "Test-Timer"); ...
重要事项:Timer Interval必须> 7sec,请参阅Java规范
-
创建定时器触发时要执行的方法
@Timeout //marks Method to be executed by Timer public void timerFired(Timer timer) { // your code here }
Java> vers。 6
@Schedule
-Annotation非常舒服
@Schedule(second="*/45", minute="*", hour="*", persistent="false") public void scheduler() { // your code here }
上面的代码实现了一个计时器,它每小时每隔45分钟被触发一次。 有关cron语法的更多信息,请查看维基百科。
这两种方法都实现了Serializable
-Interface,因此它们都是线程安全的。
如果你想扩展这个基本function,你应该看一下Quartz 。
希望这有帮助! 玩的开心!
听起来你应该坐在一个循环中60秒,然后在两次检查之间睡一会儿。 一旦60秒过去或请求进来,让代码继续并将用户转发到适当的页面。
这是最简单的方法。 您还可以使用更加用户友好的ajax轮询系统,因为您可以使用倒计时更新用户界面。
long startTime = System.currentTimeMillis(); boolean success = false; while (System.currentTimeMillis() < startTime + 60000) { // do check success = checkSucceeds(); if (success) break; try { Thread.sleep(1000); } catch (InterruptedException interruptedException) { // ignore } } if (success) // forward to success page ; else // forward to error page ;