J'ai un sans fin InputStream code> avec certaines données, que je souhaite revenir en réponse à un
Obtenir la demande HTTP code>. Je veux que mon client Web / API soit lu sans fin. Comment puis-je le faire avec Jax-Rs? J'essaye ceci:
@GET
@Path("/stream")
@Produces(MediaType.TEXT_PLAIN)
public StreamingOutput stream() {
final InputStream input = // get it
return new StreamingOutput() {
@Override
public void write(OutputStream out) throws IOException {
while (true) {
out.write(input.read());
out.flush();
}
}
};
}
3 Réponses :
Juste une supposition sauvage:
Comme expliqué ci-dessus, introuvable code> sera lu entièrement dans la mémoire première b> et alors b> livré au client. Ce n'est pas ce que je cherche
Essayer d'utiliser une réponse était une supposition lointaine, je pensais que cela chasserait de cette façon.
Donc, vous avez des problèmes de rinçage, vous pouvez essayer d'obtenir le servleResponse comme indique la spécification:
L'annotation @Context peut être utilisée pour indiquer une dépendance sur un Ressource définie par servled. Une implémentation basée sur des servlets doit prendre en charge Injection des types de servlet suivants: servleConfig, ServleContext, httpservletRequest et httpservletresponse. P>
Un httpServletResponse injecté permet à une méthode de ressource de commettre la Réponse http avant de retourner. Une implémentation doit vérifier la statut engagé et ne traite que la valeur de retour si la réponse est pas encore engagé. P> BlockQuote>
Rougez tout ce que vous pouvez, comme ceci: p>
xxx pré> p>
Utilisez simplement le streamingoutput de JAX-RS
@Path("/numbers") public class NumbersResource { @GET public Response streamExample(){ StreamingOutput stream = new StreamingOutput() { @Override public void write(OutputStream out) throws IOException, WebApplicationException { Writer writer = new BufferedWriter(new OutputStreamWriter(out)); for (int i = 0; i < 10000000 ; i++){ writer.write(i + " "); } writer.flush(); } }; return Response.ok(stream).build(); } }
Je ne l'ai utilisé que pour les fichiers finis, mais peut-être que vous pourriez essayer de produire médiatype.Application_OceTet_stream
essayé ça, aucun effet :(
Quelle implémentation JAX-RS utilisez-vous?
J'utilise Jersey 1.17.1
Il y a un bel exemple maintenant à dzone.com/articles/jax-rs-streaming-response