Ich habe eine Liste von Threads, die gleichzeitig ausgeführt werden müssen. Ich habe dies zunächst mit dem Executorservice gemacht. Die Threads, die ausgeführt werden müssen, kommen aus der DB und ich lade ihre Klassennamen ab und speichere sie in der vendorDetails Liste.Herunterfahren von Threads mit managedexecutorservice nach festgelegter Zeit
for (Object vendorThread : vendorDetails) {
String thread = (String) vendorThread;
//timeout = details.getTimeout();
Runnable worker = null;
try {
Class c = Class.forName(thread);
Constructor<?> cons = c.getConstructor(SearchRequest.class, Results.class);
worker = (Runnable) cons.newInstance(searchRequest, Results);
} catch (Exception e) {
//e.printStackTrace();
}
if (worker == null) {
System.out.println("------------------------ WORKER IS NULL ---------------");
}
executor.execute(worker);
}
executor.shutdownNow();
try {
if (!executor.isTerminated()) {
executor.awaitTermination(timeout, TimeUnit.SECONDS);
}
} catch (InterruptedException ex) {
//ex.fillInStackTrace();
}
Ich möchte etwas ähnliches in ejb erreichen, damit ich ManagedExecutorService
verwende.
@EJB
private ThreadName1 threadName1 ;
@EJB
private ThreadName2 threadName2 ;
for (Object vendorThread : vendorDetails) {
System.out.println("in for loop");
String thread = (String) vendorThread;
System.out.println("thread:" + thread);
//timeout = details.getTimeout();
Runnable worker = null;
try {
if (thread.equals("threadName1")) {
System.out.println("in if");
threadName1.setReqRes(SearchRequest, Results);
worker = (Runnable) threadName1;
} else if (thread.equals("threadName2")) {
System.out.println("in spice if");
threadName2.setReqRes(SearchRequest, Results);
worker = (Runnable) threadName2;
}
System.out.println("after if");
} catch (Exception e) {
e.printStackTrace();
}
if (worker == null) {
System.out.println("------------------------ WORKER IS NULL ---------------");
}
System.out.println("before execute");
//managedExecutorService.execute(worker);
managedExecutorService.submit(worker);
System.out.println("after execute");
}
System.out.println("before shutdown");
//managedExecutorService.shutdownNow();
System.out.println("after shutdown");
try {
System.out.println("after shutdown");
/*if (!managedExecutorService.isTerminated()) {
managedExecutorService.awaitTermination(timeout, TimeUnit.SECONDS);
}*/
} catch (InterruptedException ex) {
ex.fillInStackTrace();
// ex.printStackTrace();
}
So ideal mag ich die Fäden für eine festgelegte Zeit sagen 30secs und dann wieder die Ergebnisse der jeweils Threads ihrer Ausführung abgeschlossen haben laufen. Nun ruft das Problem alle threadlifecycle-Methoden wie shutdown etc. eine Ausnahme auslöst. Wie erreiche ich das? Ich verwende die standardmäßige ManagedExecutorSerivce.