2017-02-23 8 views
0

http://localhost:8089/mock/successでホストされているREST Webサービスからの応答を取得し、Camelを使用して応答をファイルに書き込もうとしています。ここで私はsame-camelを使用してファイルにWebサービスの応答を書き込む方法は?

from("direct:start") 
    .to("http://localhost:8089/mock/success") 
    .to("file://D:/tmp/restoutput"); 

のためにJavaで書かれてきたルートは、ここで私はすべての例外を得ることはありませんが、何もファイルに追加されていない私は、このroute-

CamelContext ctx = new DefaultCamelContext(); 
RouteBuilder routebuilder = new RestToFileRoute(); 
System.out.println("invokeRestToFileRoute() started."); 
try { 
    ctx.addRoutes(routebuilder); 
    ctx.start(); 
    Thread.sleep(1000); 
    ctx.stop(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

を呼び出しています方法ですです。私はCamelにとってかなり新しいので、問題を推測することはできません。誰もこれで私を助けることができますか?

提案に基づいてタイマーを使用すると、ファイルへの書き込み中にNULLポインタ例外が発生します。ここに変更されたコードがあります。

from("timer://simpleTimer?repeatCount=1") 
    .to("http://localhost:8089/mock/success") 
    .process(exchange -> {System.out.println("Message: " + exchange.getOut().getBody(String.class));}) // Output: "Message: null" 
    .to("file://D:/tmp/restoutput"); 
+0

@clausと同様に、あなたのルートはどのように引き起こされると思われますか?ダイレクトスタートはメモリ内のキューに過ぎません。何かを置く必要があります。簡単にするために、ファイルをピックアップし、ルートで破棄して続行するだけです。または、タイマーを使用します。 –

+0

@SoucianceEqdamRashti:私はタイマーを使用できません。 'direct:start'に関しては、私はドキュメントを誤解しました。 – Abhishek

+0

最初の.to()の後ろにログステートメントを追加し、ファイルに書き込む前に本文とヘッダーに含まれる内容を確認してください。タイマーが機能しないということはどういう意味ですか?それは誘発されませんか? –

答えて

1

直接エンドポイントはProducerTemplateです。 Camelのドキュメンテーションを見てください。

+0

私は 'ProducerTemplate'を使ってレスポンスを得ることができます。しかし、私はまだタイマーを使用することができません。私はコードを追加しています。何が間違っているのを見てくださいできますか? – Abhishek

+0

httpを呼び出してファイルに保存するだけの場合は、ルートをお勧めしません。 ProducerTemplateを使用してHTTPを呼び出し、ファイルを保存するために同じ操作を行います。プロデューサーテンプレートを使用して、本体としてHTTP応答から本文をファイルエンドポイントに送信することができます。 –

+0

私はあなたが何を言おうとしているのか分かりませんでした。ありがとう。 – Abhishek

1

ドキュメントによると、httpコンポーネントの応答は交換のアウト部分に格納されています。あなたのファイルが空である理由は、イン・パーツを書いているからです。

あなたは、イン部分に出て、体をコピーするには、このような何かを試みることができる:

.setBody(simple("${out.body}")) 
.to("file://D:/tmp/restoutput"); 

IはJavaのDSLに書き込みルートに慣れていないが、私は「場合、それはそのようになるはずです間違いないhttp://camel.apache.org/timer

を呼び出すには:あなたが直接エンドポイントにメッセージを送信するか、またはあなただけの、そのエンドポイントを一度呼び出したい場合、あなたは一度だけ実行するためにタイマーを使用し、そのrepeatCount=1を設定することができます必要

+0

どうすれば使用できますか? – Abhishek

0

最終的にすべての回答の助けを借りて動作させました。以下に、最終的な作業コードを示します。しかし、これをファイルに書き込みませんProducerTemplate-

ProducerTemplate template = new DefaultCamelContext().createProducerTemplate(); 
Exchange exchange = template.request("http://localhost:8089/mock/success", exchangeObjcet -> {}); 
String response = exchange.getOut().getBody(String.class) 

秒1を使用してRoutes-

from("timer://simpleTimer?repeatCount=1") 
    .to("http://localhost:8089/mock/success") 
    .process(exchange -> { 
      String response = exchange.getIn().getBody(String.class); 
      exchange.getOut().setBody(msg); 
    }) 
    .to("file://D:/tmp/?fileName=restoutput"); // This was missing earlier 
  • 使用

    1. 。これは、javaの標準ファイルapiを使用して簡単に行うことができます。

  • +0

    私はまだあなたが外の交換を設定する理由を理解していません。あなたはあなたのライフサイクルを通して交換を利用することができます。 –

    +0

    私はノブなので、私は推測する!ヒント@SoucianceEqdamRashtiのおかげで – Abhishek

    関連する問題