2
ManagedScheduledExecutorServiceで問題があります。私のアプリケーションを無効にしたり、展開したりすると、スケジューラはまだ動作しています。アプリケーションサーバーを再起動したときにのみ停止します。私のアプリケーションを無効にするか、または展開解除した後にスケジュールされたまま実行されています
私はJEE、アプリケーションサーバーWildfly 9とJava8を使用しています。
下次のコード
package br.com.decarli;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import javax.annotation.Resource;
import javax.enterprise.concurrent.LastExecution;
import javax.enterprise.concurrent.ManagedScheduledExecutorService;
import javax.enterprise.concurrent.Trigger;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.Destroyed;
import javax.enterprise.context.Initialized;
import javax.enterprise.event.Observes;
@ApplicationScoped
public class ApplicationSchedulerX {
@Resource(lookup = "java:jboss/ee/concurrency/scheduler/MyScheduler")
private ManagedScheduledExecutorService timerService;
public void init(@Observes @Initialized(ApplicationScoped.class) Object o) {
timerService.schedule(() -> {
System.out.println(" Run scheduler... " );
}, new Trigger() {
@Override
public Date getNextRunTime(LastExecution le, Date date) {
return getNextDateBySeconds(60);
}
@Override
public boolean skipRun(LastExecution le, Date date) {
return false;
}
});
}
private Date getNextDateBySeconds(long seconds) {
LocalDateTime ldt = LocalDateTime.now().plusSeconds(seconds);
return Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
}
public void destroy(@Observes @Destroyed(ApplicationScoped.class) Object o) {
//TODO error: Lifecycle operation not supported
//timerService.shutdown();
}
}
Wildfly 9スケジューラ構成:
<managed-scheduled-executor-service name="MyScheduler" jndi-name="java:jboss/ee/concurrency/scheduler/MyScheduler" hung-task-threshold="50000" long-running-tasks="true" core-threads="4" keepalive-time="500" reject-policy="ABORT"/>
あなたは[のServletContextListener](http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContextListener.html)を使用することができますか? [例](https://www.mkyong.com/servlet/what-is-listener-servletcontextlistener-example/) – ebanouz
起動時に正常に動作し、終了するとメソッドは実行されますが、timerServiceはまだ実行されています。 timerServiceのすべてのスケジュールをクリアする方法が見つかりませんでした。 –