2017-07-16 1 views
1

Je recherche un exemple qui pourrait convenir à mon cas d'utilisation, mais je n'en ai trouvé aucun jusqu'à présent. Je suis en train d'écrire un WebService Akka qui devrait traiter un énorme corps de requête en texte brut envoyant chaque ligne à la file d'attente des messages entrants d'un acteur.Lire le corps de la requête avec Akka-Http et envoyer chaque ligne à la file d'attente des messages sur un acteur

Est-ce que l'un d'entre vous pourrait écrire du code ici ou simplement me diriger vers une page d'exemple?

J'ai aucune idée d'où commencer: le gros problème pour moi les streams en général (dans mon cas, je veux utiliser la bibliothèque de streaming Akka)

+0

Veuillez définir "énorme". La requête est-elle trop importante pour être conservée en mémoire en même temps? –

+0

Pas si énorme, en fait ... vous m'avez fait réaliser que la taille du fichier peut être contrôlée par l'expéditeur, donc il pourrait être envoyé en morceaux au cas où il est énorme – Max

Répondre

2

Pour obtenir le corps de demande, vous pouvez utiliser la extractRequestEntity directive pour créer votre itinéraire. Une fois que vous avez le flux d'entité, vous pouvez simplement envoyer chaque ligne de texte à la Actor:

import akka.stream.scaladsl.Framing.delimiter 
import akka.util.ByteString 
import akka.actor.ActorRef 
import akka.http.scaladsl.server.Directives.{extractRequestEntity, onComplete} 

val maxLineLength = 256 

val streamSplitter = delimiter(ByteString("\n"), maxLineLength) 

val actorRef : ActorRef = ??? //not specified in question 

val route : Route = 
    extractRequestEntity { entity => 

    onComplete { 
     entity 
     .dataBytes 
     .via(streamSplitter) 
     .map(_.utf8String) 
     .runForeach(line => actorRef ! line) 
    } { _ => 
     complete("all lines sent to actor") 
    } 
    } 

La question ne précise pas si la réponse dépend des résultats du traitement Acteur de sorte que l'exemple ci-dessus simplement envoie les lignes à l'acteur, puis complète la requête avec une réponse contenant un message simple. Le route peut maintenant form the basis of a server

+0

Je l'essaie, mais je reçois un erreur de compilation sur akka-http v10.0.9: la valeur via n'est pas un membre de akka.http.scaladsl.model.RequestEntity. – Max

+0

@Max mis à jour en conséquence. –