我们需要在Java Web应用程序中定期运行一个函数。 如何定期调用某类的功能? 有什么方法可以在某些事件发生时调用函数,如服务器中的高负载等等。什么是crontab?这是定期工作吗?
答案 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实现,如cron4j,Quartz,甚至是EJB Timer API。选择其中一个高度取决于具体情况:应用类型,使用的技术,工作数量等。
当某些事件发生时,有什么方法可以调用函数,如服务器中的高负载等等
您可以在作业中使用JMX来访问和监控信息,并在某些特定条件下触发操作。但这更像是一种拉动模式,而不是基于事件的。