2017-10-08 5 views
3

J'utilise botte de printemps avec Jersey rest apiAsyncResponse et Java 8 question de flux parallèle

@POST 
@Path("test") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public void test(final List<String> requests, @Suspended final AsyncResponse asyncResponse) { 

    List<String> resplist = new ArrayList(); 
    requests.parallelStream().forEach(req -> { 

     String resp = //some process to get (Always return string) 
     resplist.add(resp); 
    }); 

    asyncResponse.resume(resplist); 

} 

Si je parallelStream parfois la liste qui est récupéré sur le côté client ne retourne pas tous les éléments.

Disons que je passe 30 retourne 29, mais parfois il fait revenir 30 (demande est toujours le même)

Mais si j'utilise cours d'eau normale avec forEach seulement, il me renvoie toujours 30 éléments.

Est-ce une sorte de bug? Puis-je pas utiliser parallelStream dans le repos api

MISE À JOUR

Comme répondu par Eugene ce fut la question parce que lors de l'utilisation flux parallèle plusieurs threads ont été l'ajout enregistrement dans arraylist qui ne ThreadSafe

solution Utilisez collection Synch

Collection<String> resplist = Collections.synchronizedCollection(new ArrayList<String>()); 

Répondre

3

Pour autant que je peux vous voir comptez sur si de-effets ici dans la partie:

.forEach(req -> { 

      String resp = //some process to get (Always return string) 
      resplist.add(resp); 
      }); 

Vous fraie plusieurs threads pour ajouter des éléments à une collection non-thread-safe tels que ArrayList.

Vous devriez plutôt les recueillir via .collect(Collectors.toList())

+0

Vous êtes sur place. Merci d'avoir répondu. – Makky