2016-03-31 31 views
1

Ich habe einen langen laufenden Prozess in Camel, der durch eine HTTP-Anfrage ausgelöst wird. Ich würde gerne Status-Updates in den Outputstream schreiben, aber ich bekomme die Antwort auf der Client-Seite nicht.Camel Jetty Component in Outputstream schreiben

Ich habe versucht, mit der folgenden:

Kamel-Route:

<from uri="jetty:http://localhost:12345/myservice"/> 
<process ref="test" /> 

Der Prozessor-Test:

public void process(Exchange arg0) throws Exception { 
    System.out.println("TestProcessor"); 
    HttpServletResponse response = (HttpServletResponse) arg0.getIn().getHeader(Exchange.HTTP_SERVLET_RESPONSE); 

    OutputStreamWriter wr = new OutputStreamWriter(response.getOutputStream()); 
    BufferedWriter w = new BufferedWriter(wr); 
    for(int x = 0; x < 10; x++){ 
     w.write("Zeile: " + x + "\n"); 
     w.newLine(); 
    } 
//  arg0.getIn().setBody("This might also be a response"); 
} 

und Berufung Code:

final HttpURLConnection conn = (HttpURLConnection) url.openConnection();   
      conn.setDoOutput(true); 
      conn.setInstanceFollowRedirects(false); 
      conn.setRequestMethod("GET"); 
      conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
      conn.setRequestProperty("charset", "utf-8"); 
      conn.setRequestProperty("Content-Length", Integer.toString(postDataLength)); 
      conn.setUseCaches(false); 
      new Thread(new Runnable(){ 

       @Override 
       public void run() { 
        try { 
         if(!urlParameters.isEmpty()){ 
          try(DataOutputStream wr = new DataOutputStream(conn.getOutputStream())) { 
           wr.write(postData); 
           wr.close(); 
          } 
         } 
         InputStream s = conn.getInputStream(); 
         System.out.println("got InputStream"); 
         InputStreamReader is = new InputStreamReader(s); 
         BufferedReader br = new BufferedReader(is); 
         String line; 
         while((line = br.readLine()) != null){ 
          System.out.println("ReadLine: " + line); 
         } 

         conn.disconnect(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 

      }).start(); 

Aber ich bekomme nur eine Antwort, wenn ich setze den Körper im Prozessor (die kommentierte Zeile). Gibt es eine Möglichkeit, die Verbindung in Kamel zu halten und weiter zu schreiben?

Antwort

0

sollten Sie verwenden die out Nachricht eine Antwort mit der HTTP-Komponente senden:

arg0.getOut().setBody("This might also be a response"); 

Die HTTP-Komponente verwenden, um ein HttpBinding ein HttpServletRequest zu einem Exchange, und den entgegengesetzten zu konvertieren, füllen Sie ein HttpServletResponse von einem Exchange . Sie können die Standardimplementierung here sehen oder Ihre eigenen bereitstellen.