2017-01-05 4 views
2

Kann mir jemand helfen, warum der Java-Code mit Ausgabe und Drucken aller Daten in einem Rutsch statt prinitng jedes Chunk als Javascript-CodeChunkedInput arbeiten nicht in Jersey

Java-Code:

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: (Seite öffnet http://jerseyexample-ravikant.rhcloud.com/rest/jws und dann F12 drücken und unten in der Konsole läuft, wie Javascript, nicht von anderer Domain erlaubt nennen)

//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: Nur um Hilfe es funktioniert auch normale Java-Verbindung

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

Mein WebService-Code

@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; 
} 

Antwort

2

Formular Trikot Text & Tabellen:

Schreiben Stücke mit ChunkedOutput ist einfach, nur Methode write() aufrufen, die schreibt genau ein Stück zum Ausgang. Bei der Eingabe ist es etwas komplizierter. Der ChunkedInput kann nicht unterscheiden, wie Blöcke im Byte-Stream zu unterscheiden sind, es sei denn, der Entwickler teilt dies mit. Um benutzerdefinierte Chunks-Grenzen zu definieren, bietet der ChunkedInput die Möglichkeit, einen ChunkParser zu registrieren, der Chunks aus dem Eingabestream liest und sie trennt. Jersey bietet mehrere Chunk Parser-Implementierungen und Sie können Ihren eigenen Parser implementieren, um Ihre Chunks zu separieren, wenn Sie es brauchen. In unserem obigen Beispiel wird der Standardparser verwendet, der von Jersey zur Verfügung gestellt wird, der Chunks basierend auf der Anwesenheit einer abgrenzenden Zeichenfolge trennt.

So muss Ihr Server Chunks mit \ r \ n trennen, oder Sie müssen einen ChunkParser registrieren.

Angenommen, Sie eine Konstante haben Fertigstellung jeder Chunk Sie könnten versuchen:

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

Während GRENZ eine Finalisierung Zeichenfolge für jeden Brocken ist. Die in.readLine-Lösung in Ihrer Bearbeitung wird "Chunks" nach jeder neuen Zeile aufteilen, selbst wenn ein Chunk aus \ n besteht, wird es als 2 Chunks interpretiert.

+0

Immer noch die gleichen alle in einer einzigen Schleife gedruckt, haben Wert der Grenze als \ r \ n in oben genannten Code verwendet, aber immer noch nicht funktioniert Hallo habe Web-Service-Methode Code hinzugefügt können Sie es sehen. – gladiator

+0

Versuchen Sie, output.write zu ändern (chunk.toString() + "\ n"); to output.write (chunk.toString() + "\ r \ n"); – gba

+0

Danke, es hat funktioniert – gladiator

Verwandte Themen