2017-01-05 3 views
2

quelqu'un peut me aider pourquoi le code Java est d'avoir problème et l'impression de toutes les données en une seule fois au lieu de prinitng chaque morceau comme code javascriptChunkedInput ne fonctionne pas en jersey

code Java:

import org.glassfish.jersey.client.ChunkedInput; 
import javax.ws.rs.client.Client; 
import javax.ws.rs.client.ClientBuilder; 
import javax.ws.rs.core.GenericType; 
import javax.ws.rs.core.Response; 

public class RunClient { 

    public static void main(String args[]) throws InterruptedException { 
     Client client = ClientBuilder.newClient(); 
//2 is to increase amount of data and 3(seconds) is for time b/w chunked output ,can be changed 
     final Response response = client.target("http://jerseyexample-ravikant.rhcloud.com/rest/jws/streaming/2/3").request() 
       .get(); 
     final ChunkedInput<String> chunkedInput = response.readEntity(new GenericType<ChunkedInput<String>>() { 
     }); 
     String chunk; 
     while ((chunk = chunkedInput.read()) != null) { 
      System.err.println("Next chunk received: "); 
      System.out.println(chunk); 
     } 


    } 
} 

JavaScript: (Ouvrir la page http://jerseyexample-ravikant.rhcloud.com/rest/jws puis appuyez sur F12 et exécuter ci-dessous dans la console comme javascript Appel non autorisé d'autres domaines)

//2 is to increase amount of data and 3(seconds) is for time b/w chunked output ,can be changed 

var xhr = new XMLHttpRequest() 
xhr.open("GET", "http://jerseyexample-ravikant.rhcloud.com/rest/jws/streaming/2/3", true) 
xhr.onprogress = function() { 
    console.log("PROGRESS:", xhr.responseText) ;console.log("\n"); 
} 
xhr.send() 

EDIT: Juste pour aider ce travaille aussi la volonté connexion java normale

 String uri = "http://jerseyexample-ravikant.rhcloud.com/rest/jws/streaming/3/1"; 
     URL url = new URL(uri); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setRequestMethod("GET"); 
     connection.setDoOutput(true); 
     BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
     String line; 
     while ((line = in.readLine()) != null) { 
      System.out.println(line); 
     } 
     in.close(); 

Mon code WebService

@Path("streaming/{param}/{sleepTime}") 
@GET 
@Produces(MediaType.TEXT_PLAIN) 
public ChunkedOutput<String> getChunkedStream(@PathParam("param") String loopcount,@PathParam("sleepTime") String sleepTime) throws Exception { 

    final ChunkedOutput<String> output = new ChunkedOutput<>(String.class); 
    final Integer val=Integer.parseInt(loopcount); 
    final Integer isleepTime=Integer.parseInt(sleepTime)*1000; 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      try { 
       StringBuffer chunk = null; 

       for (int i = 0; i < 10; i++) { 
         chunk = new StringBuffer(); 
        for (int j = 0; j < val; j++) { 
         chunk.append(" Message #" + i+ "#"+j); 
        } 
         output.write(chunk.toString()+"\n"); 
        System.out.println("write"); 
        Thread.sleep(isleepTime); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       try { 
        System.out.println("output.close();"); 
        output.close(); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 
      } 
     } 
    }).start(); 

    return output; 
} 

Répondre

2

jersey Formulaire docs:

morceaux d'écriture avec ChunkedOutput est simple, vous appelez seule méthode d'écriture() qui écrit exactement un morceau à la sortie. Avec la lecture d'entrée, c'est un peu plus compliqué. Le ChunkedInput ne sait pas comment distinguer les morceaux dans le flux d'octets à moins d'en être informé par le développeur. Afin de définir des limites de morceaux personnalisés, ChunkedInput offre la possibilité d'enregistrer un ChunkParser qui lit les morceaux du flux d'entrée et les sépare. Jersey fournit plusieurs implémentations d'analyseurs de morceaux et vous pouvez implémenter votre propre analyseur pour séparer vos fragments si vous en avez besoin. Dans notre exemple ci-dessus, l'analyseur par défaut fourni par Jersey est utilisé pour séparer les morceaux en fonction de la présence d'une séquence de caractères de délimitation. Donc, votre serveur doit séparer les morceaux avec \ r \ n, ou vous devez enregistrer un ChunkParser.

En supposant que vous avez une constante de finaliser chaque morceau, vous pouvez essayer:

Client client = ClientBuilder.newClient(); 
//2 is to increase amount of data and 3(seconds) is for time b/w chunked output ,can be changed 
     final Response response = client.target("http://jerseyexample-ravikant.rhcloud.com/rest/jws/streaming/2/3").request() 
       .get(); 
     final ChunkedInput<String> chunkedInput = response.readEntity(new GenericType<ChunkedInput<String>>() { 
     }); 
     chunkedInput.setParser(ChunkedInput.createParser(BOUNDARY)); 
     String chunk; 
     while ((chunk = chunkedInput.read()) != null) { 
      System.err.println("Next chunk received: "); 
      System.out.println(chunk); 
     } 

Alors que FRONTIERE une chaîne de chaque morceau pour la finalisation. La solution in.readLine dans votre edit va décomposer les "morceaux" par chaque nouvelle ligne, même si un morceau est constitué d'un \ n, il sera interprété comme 2 morceaux.

+0

Toujours les mêmes toutes imprimées en boucle simple, ont utilisé la valeur de BOUNDARY comme \ r \ n dans le code ci-dessus, mais ne fonctionne toujours pas Salut ont ajouté le code de méthode de service Web peut-on le voir. – gladiator

+0

Essayez de modifier output.write (chunk.toString() + "\ n"); à output.write (chunk.toString() + "\ r \ n"); – gba

+0

Merci, ça a marché – gladiator