繁体   English   中英

如何在Tomcat的Java EJB中启动@Schedule方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM