2017-01-26 1 views
2

Désolé pour le titre prêtant à confusion, ce que j'essaie de suivre est le nombre de fois qu'une méthode qui est exécutée de manière asynchrone a levé une exception, récupérer les résultats qui ont été exécutés avec succès dans une variable de classe. Je pense que ma mise en œuvre est tout à fait éteinte, est-ce qu'une List of CompletableFutures serait plus appropriée ici qu'une CompletableFuture of List?Java 8 - Comment suivre le nombre d'exceptions invoquées dans un flux parallèle asynchrone en utilisant CompletableFuture

public class testClass { 

    private List<Integer> resultNumbers; 

    public void testMethod() { 

     int exceptions = 0; 
     try { 
      methodWithFuture(); 
     catch (InterruptedException | ExecutionException e) { 
      exceptions++; 
     } 
     System.out.println("Number of times the addNumber method threw an exception=" + exceptions); 
    } 

    public void methodWithFuture() throws InterruptedException, ExecutionException { 

     List<Integer> numbersList = Arrays.asList(new Integer[] { 1, 2, 3 }) 
     CompletableFuture<List<Integer>> futuresList = CompletableFuture.supplyAsync(() -> 
      numbersList.parallelStream().map(number -> addNumber(number))).collect(Collectors.toList()), 
      new ForkJoinPool(3)); 

     resultNumbers.addAll(futuresList.get()); 
    } 
} 
+1

recherche donc à votre code actuel vous ne jamais à obtenir 1 exception au plus – Ash

Répondre

1

Donc en regardant votre code, vous obtiendrez seulement 1 exception. Un meilleur appel CompletableFuture pour chaque appel à addNumber. Ensuite, vérifiez si c'est exceptionnel.

public void testMethod(){ 

    int exceptions = 0; 

    List<Integer> numbersList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13); 
    List<CompletableFuture<Integer>> cfList = new ArrayList<>(); 

    for(int number : numbersList){ 
     CompletableFuture<Integer> cf = methodWithFuture(number); 
     cfList.add(cf); 
    } 

    CompletableFuture<Void> allOfCF = CompletableFuture.allOf(cfList.toArray(new CompletableFuture[0]));  
    try {allOf.get();} catch (InterruptedException | ExecutionException ignored) {} 

    int sum = 0; 
    for(CompletableFuture<Integer> cf : cfList){ 
     if(cf.isCompletedExceptionally()){ 
      exceptions ++; 
     } else { 
      sum += cf.get(); 
     } 
    } 

    System.out.println("Number of times the addNumber method threw an exception=" + exceptions); 
    System.out.println("SUM " + sum); 
} 


public CompletableFuture<Integer> methodWithFuture(int number) { 
    return CompletableFuture.supplyAsync(() -> addNumber(number)); 
} 

Ici, j'ai soumis chaque appel à addNumber de manière asynchrone et attendu de les rejoindre tous après leur achèvement en utilisant allOf