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