2016-07-12 10 views
2

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.

Antwort

0

Ich weiß nicht, ob dies die richtige Lösung ist. Aber ich mache das jetzt als Workaround. Hinzufügen zu einer Zukunft Liste alle Aufgaben, die übermittelt werden. Dann warten Sie auf die festgelegte Zeit und löschen Sie alle laufenden Aufgaben. Ich bin mir sicher, dass es eine elegantere Lösung gibt.

    ArrayList<Future> taskList = new ArrayList<>();   
        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); 
         taskList.add(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); 
         }*/ 
       System.out.println("before sleep"); 
       long startTimeLogon = System.currentTimeMillis(); 
       boolean allComplete; 
       int trueCount = 0; 
       while (true) { 
        System.out.println("true count " + trueCount++); 
        if ((System.currentTimeMillis() - startTimeLogon) >= timeout * 1000) { 
         break; 
        } 
        allComplete = true; 
        for (Future f : taskList) {      
         if (!f.isDone()) { 
          allComplete=false; 
         } 
        } 
        if(allComplete) 
         break; 
        Thread.sleep(250); 
       } 
       System.out.println("after sleep"); 
       for (Future f : taskList) { 
        if (!f.isDone()) { 
         f.cancel(true); 
        } 
       } 
       System.out.println("after cancel"); 

        } catch (InterruptedException ex) { 
         ex.fillInStackTrace(); 
         // ex.printStackTrace(); 
        }