在Java中定期调用函数

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

要定期调用某些内容,请参阅TimerTask

如果你需要更强大的东西,你可以使用Quartz

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

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

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

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

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

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

如何定期调用某类的function?

(2)在监听器中创建一个Timer 。

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

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

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

不要忘记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 。

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

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

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

如何定期调用某类的function?

有几种解决方案: Timer ,Java cron实现,如cron4j , Quartz ,甚至是EJB Timer API 。 选择一个或另一个高度取决于上下文:应用程序的类型,使用的技术,作业的数量等。

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

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