在Java中定期调用函数

时间:2009-11-18 13:14:32

标签: java java-ee crontab

我们需要在Java Web应用程序中定期运行一个函数。 如何定期调用某类的功能? 有什么方法可以在某些事件发生时调用函数,如服务器中的高负载等等。什么是crontab?这是定期工作吗?

8 个答案:

答案 0 :(得分:10)

要定期致电,请参阅TimerTask

答案 1 :(得分:5)

如果您需要更强大的功能,可以使用Quartz

至于crontab是Unix机器上的调度工具。

答案 2 :(得分:4)

对于服务器负载较高时调用方法,您至少有两种可能的方法。您的应用服务器可能具有管理挂钩,您可以使用它来监控其行为并采取推进操作。另外,你有一些系统监控功能(例如Tivoli或OpenView)并且它会生成“事件”,它不应该太难以提供诸如(例如)JMS消息之类的事件并让你的服务器接收它们。

但是,您可能想要更多地了解您想要实现的目标。正确的应用程序beahviour可能非常棘手。

答案 3 :(得分:2)

如果您想定期运行某些内容,请不要在网络服务器中执行此操作。这对IMO来说是一个非常错误的方法。如果您使用的是类Unix操作系统,最好使用cron。 Windows服务器提供类似的功能。

答案 4 :(得分:2)

  

我们需要定期运行一个函数   在Java Web应用程序中

(1)因此,请查看部署描述符(web.xml),定义在启动时启动的侦听器。

  

如何调用某类的功能   定期吗?

(2)在监听器中创建Timer

  

有没有办法调用函数   当一些事件发生像高负荷   在服务器等等

(3)并运行一些线程来检查可以通过Java访问的系统条件,甚至运行系统程序(正常运行时间等)并解析输出。

crontab可能是一种方式,但Java的执行将启动另一个JVM,这实际上是servlet容器中的热点:所有运行在同一个JVM中。

答案 5 :(得分:2)

不要忘记java.util.concurrent - 它有很多用于调度的类,例如: ScheduledThreadPoolExecutor,如果你需要的不仅仅是一个简单的Timer。

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html

它还有一个向Java 1.4的后端:http://backport-jsr166.sourceforge.net

答案 6 :(得分:2)

如果您已经使用过Spring,那么您可能需要查看Spring的任务执行框架 - 使用@Scheduled和@Async将方法注释为任务,并在将实际工作委派给Worker的Processor中实现功能,如描述于:

http://blog.springsource.com/2010/01/05/task-scheduling-simplifications-in-spring-3-0/

优点是您可以在spring上下文中使用类似cron的语法定义计时器,并且您不需要任何特殊的设置任务,它也可以很好地集成到Java EE应用程序中,并且可以很好地与Web服务器配合使用(哪些自定义线程往往不会这样做。)

答案 7 :(得分:1)

  

如何定期调用某类的功能?

有几种解决方案:一个Timer,一个Java cron实现,如cron4jQuartz,甚至是EJB Timer API。选择其中一个高度取决于具体情况:应用类型,使用的技术,工作数量等。

  

当某些事件发生时,有什么方法可以调用函数,如服务器中的高负载等等

您可以在作业中使用JMX来访问和监控信息,并在某些特定条件下触发操作。但这更像是一种拉动模式,而不是基于事件的。