【问题标题】:How can I automatically invoke a servlet periodically at specified time intervals [duplicate]如何以指定的时间间隔定期自动调用 servlet [重复]
【发布时间】:2014-10-18 06:01:24
【问题描述】:

必须定期调用servlet。(类似于andorid中的服务概念)

如何做到这一点。使用计时器或任何其他解决方案?

提前致谢。

【问题讨论】:

  • 你真正想要达到什么目的?定期在服务器上做一些事情,还是定期向您的服务器发出 HTTP 请求?
  • 先生,必须定期在服务器上做一些事情。
  • 然后开始忘记使用 servlet 来做这件事。 servlet 的唯一目标是服务 HTTP 请求。您不想在这里处理 HTTP 请求。你想要的只是在你的服务器上定期做一些事情。看docs.oracle.com/javase/7/docs/api/java/util/concurrent/…docs.oracle.com/javaee/6/api/javax/servlet/…
  • 好的先生,我查找了上面的链接。想法创建一个包含计时器的类。现在的疑问是如何在 web.xml 中声明该类。在 servlet(web.xml) 中声明这个类哪个更好.
  • 使用 ServletContextListener。您确实需要 web.xml 中的侦听器元素,或者,如果使用 servlet 3.0+ 引擎,则需要一个简单的 WebListener 注释。

标签: java api jsp servlets timer


【解决方案1】:

JB Nizet 对 cme​​ts 的扩展……

formerly accepted answer 有点像 hack。如果目标是将某些常规任务作为 Web 应用程序的一部分执行,Java 提供了一些巧妙的技术来实现这一目标。

ServletContextListener

第一个是 Servlet 规范定义的钩子,用于在部署 Web 应用程序和关闭 Web 应用程序时调用代码。这个钩子是ServletContextListener

ScheduledExecutorService

第二部分是添加到 Java 最新版本中的执行器服务,作为旧 Timer 类的更复杂的替代品。特别是您需要ScheduledExecutorService

因此,当您的 Web 应用启动时,ServletContextListener 会启动一个 ScheduledExecutorService。当 ServletContextListener 被通知关闭时,它会告诉 executor 优雅地退出。

对此有一个技巧:确保在您的执行程序中捕获所有异常。如果异常泄漏,执行器会静默停止执行。这是一个功能而不是错误。阅读文档并通过谷歌搜索进行研究。

在 StackOverflow 中搜索这两个示例和讨论。

【讨论】:

【解决方案2】:

你可以使用,

response.addHeader("Refresh", "5");

“5”表示5 secondsresponse.addHeader("Refresh", "5") 调用添加了一个响应头,该响应头被发送回客户端,指示浏览器应在 5 秒后再次请求 servlet。

同样的事情也可以用 html 来完成,

<meta http-equiv="refresh" content="5" />

你也可以在这里传递 url,

<meta http-equiv="refresh" content="5" url="example.com"/>

也可以看看here ..

【讨论】:

  • 谢谢先生。但我真正想要的是定期调用服务器中的方法来请求或响应客户端。
  • 是的,你可以很好地做到这一点。使用可以刷新页面的一部分的ajax。看看这个样本avajava.com/tutorials/lessons/…
【解决方案3】:

如果你使用Java EE 6,可以在war中打包一个EJB,你可以使用一个@Schedule注解的EJB。

它将定期执行,您无需执行任何其他操作(运行线程或睡眠)。

【讨论】:

    【解决方案4】:

    您可以使用 Java 线程来做到这一点。

    1. 安排一个 servlet 在服务器启动时加载。请参阅如何将 servlet 设置为在容器启动时加载,而不是在第一次请求时加载?

    2. 在这个 servlet 的 init() 方法中,产生一个线程。

    3. 在此线程的 run() 方法中,计算等待任务执行的毫秒数。然后调用 Thread.sleep(msec)。然后执行任务,并循环(无限)。 java.util.Timer 类可以提供很多帮助。

    使用 java.util.Timer 类的 schedule() 方法:

    long now = System.currentTimeMillis();
    Date whenToRun = new Date(now+millisecondsInFuture);
    Timer timer = new Timer();
    TimerTask task = new TimerTask() {
      public void run() {
    // job code here
      }
    };
     timer.schedule(task, whenToRun);
    

    或者使用java.util.Timer类的scheduleAtFixedRate()方法:

    int initialDelay = 30000; // start after 30 seconds
    int period = 5000;        // repeat every 5 seconds
    Timer timer = new Timer();
    TimerTask task = new TimerTask() {
     public void run() {
    // job code here
      }
    };
     timer.scheduleAtFixedRate(task, initialDelay, period);
    

    【讨论】:

    • 好的,先生。希望能帮助到你。是否有任何教程或示例。
    • 在servlet中声明这个类哪个更好
    • 永远永远永远不要在 Java EE 应用程序中使用 Timer
    • @BalusC 先生:为什么我们不想在 java EE 应用程序中使用计时器?
    • 查看链接的副本。简而言之:它不符合 Java EE 应用程序的“终身运行”性质。例如。如果在计时器线程中抛出异常,则计时器实际上是死的。在您重新启动整个服务器之前,它基本上不会再运行了。这没有任何意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2011-05-20
    相关资源
    最近更新 更多