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的所有时间表。 –