9
votes

Comment diffuser une entrée sans fin avec JAX-RS

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();
            }
        }
    };
}


5 commentaires

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


3 Réponses :


0
votes

Juste une supposition sauvage: xxx


2 commentaires

Comme expliqué ci-dessus, introuvable sera lu entièrement dans la mémoire première et alors 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.



2
votes

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.

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é.

Rougez tout ce que vous pouvez, comme ceci: xxx


0 commentaires

2
votes

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();
    }
}


0 commentaires