[英]How to start @Schedule method in Java EJB in Tomcat
我有一个在Tomcat8中运行的Java Servlet(在Eclipse中)。 调用Servlet时,我想执行一个命令并调用一个使用Scheduler的方法。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Scheduler s = new Scheduler();
s.doStuff();
。
package xy;
import javax.ejb.Schedule;
import javax.ejb.Singleton;
@Singleton
public class Scheduler {
private int counter = 0;
@Schedule(second = "*/5", minute = "*", hour = "*", info="Every 5 seconds")
public void doStuff(){
counter++;
System.out.println("counter: " +counter);
}
}
按照我的逻辑,每隔5秒我应该看到一个计数器println越来越高。 但是什么也没发生。
Tomcat不是完整的Java EE容器。 它仅实现Java Servlet和JavaServer Pages技术,因此您将无法使用EJB( @Singleton
)或Timer Service( @Schedule
)。 考虑使用Java EE服务器或ScheduledExecutorService 。
Tomcat不是EJB容器
在tomcat中执行计划执行的最简单方法-使用java.util.concurrent.ScheduledExecutorService
。
@WebListener
public class MyAppContextListener implements ServletContextListener {
private ScheduledExecutorService scheduler;
@Override
public void contextInitialized(ServletContextEvent event) {
//init sheduler
scheduler = Executors.newSingleThreadScheduledExecutor();
//!!!Shedule task
scheduler.scheduleAtFixedRate(...);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
scheduler.shutdownNow();
}
}
放弃任务使用:
scheduler.scheduleAtFixedRate(command, initialDelay, period, unit);
command
-类的实例,它实现java.lang.Runnable
initialDelay
以时间单位首次运行之前的延迟
period
-任务执行之间的时间间隔
unit
java.util.concurrent.TimeUnit
(例如TimeUnit.MINUTES
)
尝试使用jboss open src免费版本或http://tomee.apache.org/ Tommy,它的下面有tomcat。 就像其他人所说的,tomcat不是完整的应用程序容器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.