如何使用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 6

  1. 创建Session-或MessageDriven-Bean
  2. 注入TimerService

     @Ressource TimerService ts; 
  3. 创建计时器

     ... // create Timer which starts after 10s every 10s Timer timer = ts.createTimer(10000, 10000, "Test-Timer"); ... 

    重要事项:Timer Interval必须> 7sec,请参阅Java规范

  4. 创建定时器触发时要执行的方法

     @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 ;