2016-07-29 44 views
2

Ich habe Probleme mit ManagedScheduledExecutorService. Wenn ich meine Anwendung deaktiviere oder deimplementiere, wird der Scheduler noch ausgeführt. Es stoppt nur, wenn ich den Anwendungsserver neu starte.Geplant weiterhin ausgeführt nach Deaktivieren oder Deimplementierung meiner Anwendung

Ich verwende JEE, Application Server Wildfly 9 und Java8.

Der folgende Code unten:

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 Scheduler Konfiguration:

<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

können Sie [ServletContextListener] (http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContextListener.html)? [Beispiel] (https://www.mkyong.com/servlet/what-is-listener-servletcontextlistener-example/) – ebanouz

+0

es funktioniert normal, wenn Sie starten und wenn es endet die Methoden ausgeführt werden, aber TimerService noch läuft. Ich habe keine Möglichkeit gefunden, alle Zeitpläne von timerService zu löschen. –

Antwort

3

fand ich die Lösung, auf den Link https://issues.jboss.org/browse/WFLY-3683.

Ich erstellte eine Liste der geplanten Tasks und Abbrechen auf der Destroy-Methode.

Der richtige Code unten:

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; 

} 
}