6

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

4

8 回答 8

10

要定期调用某些东西,请参阅TimerTask

于 2009-11-18T13:15:58.650 回答
5

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

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

于 2009-11-18T13:17:31.197 回答
4

对于在服务器负载高时调用方法,您至少有两种可能的方法。您的 App Server 可能具有管理挂钩,您可以通过这些挂钩监控其行为并采取程序化操作。或者,您有一些系统监视功能(例如 Tivoli 或 OpenView)并且它会生成“事件”,传递诸如(例如)JMS 消息之类的事件并让您的服务器接收它们应该不会太难。

但是,您可能想要更多地解释您想要实现的目标。自适应应用程序行为可能很难正确处理。

于 2009-11-18T13:22:33.003 回答
2

如果您已经使用 Spring,您可能想看看 Spring 的任务执行框架 - 使用 @Scheduled 和 @Async 将方法注释为任务并在将实际工作委托给 Worker 的处理器中实现功能,如下所述:

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

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

于 2010-11-04T15:57:53.230 回答
2

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

(1) 因此,在您的部署描述符 (web.xml) 中定义一个侦听器以在启动时启动。

如何定期调用某个类的函数?

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

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

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

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

于 2009-11-18T13:25:48.567 回答
2

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

于 2009-11-18T13:21:34.233 回答
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 。

于 2009-11-18T16:44:12.200 回答
1

如何定期调用某个类的函数?

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

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

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

于 2009-11-18T13:25:22.960 回答