2016-07-29 15 views
2

У меня возникли проблемы с ManagedScheduledExecutorService. Если я отключу или отключу свое приложение, планировщик все еще работает. Он останавливается только при перезапуске сервера приложений.Запланированный запуск после отключения или отмены моего приложения

Я использую JEE, Application Server 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"/> 
+0

вы можете использовать [контекста сервлета] (http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContextListener.html)? [example] (https://www.mkyong.com/servlet/what-is-listener-servletcontextlistener-example/) – ebanouz

+0

он работает нормально, когда вы начинаете, и когда он заканчивается, методы выполняются, но timerService все еще работает. Я не нашел способ очистить все расписания timerService. –

ответ

3

Я нашел решение, по ссылке https://issues.jboss.org/browse/WFLY-3683.

Я создал список запланированных задач и отменил метод уничтожения.

Правильный код ниже:

package br.com.ciss.cissmart.client.core; 

import java.time.LocalDateTime; 
import java.time.ZoneId; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Date; 
import java.util.Iterator; 
import java.util.List; 
import java.util.concurrent.ScheduledFuture; 

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; 

private List<ScheduledFuture<?>> scheduledTasks; 

/** 
* Método executado no start do servidor. 
* 
* @param o 
*    - {@link javax.servlet.ServletContext} - Contendo as configurações da aplicação 
*/ 
public void init(@Observes @Initialized(ApplicationScoped.class) Object o) { 

    this.scheduledTasks = Collections.synchronizedList(new ArrayList<ScheduledFuture<?>>()); 

    ScheduledFuture task = 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; 
     } 

    }); 

    scheduledTasks.add(task); 

} 

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) { 

    // Cancel any scheduled tasks, ensuring that the map is locked. 
    synchronized (this.scheduledTasks) { 
     Iterator<ScheduledFuture<?>> i = this.scheduledTasks.iterator(); 

     while (i.hasNext()) { 
      ScheduledFuture<?> future = i.next(); 
      // Cancel the task. 
      future.cancel(true); 
     } 
    } 
    this.scheduledTasks.clear(); 
    this.scheduledTasks = null; 

} 
}