この種の問題の最新の例を見つけようとしましたが、残念ながら見つかりませんでした。次のように動作するキャメルを使用して Web サービスを実装しようとしています。
- Camel は、GET または POST (api/startsearch) を介して Rest-Endpoint から入力を受け取ります。
- Bean は入力を処理し、チケット ID を生成します
- 同じ Bean が HTTP-202 またはリダイレクト URL (api/result?ticket-id=jf3298u23) を含む redirect-Status-Code でクライアントに応答します。
- bean は入力を activemq start-queue にも渡します。ここで、Camel ルートはすべての長時間処理を実行します。
- ルートが終了すると、結果はリダイレクト URL (/result?ticket-id=jf3298u23) で利用できるようになります。処理がまだ終了していない場合は、HTTP-299-processing のようなカスタム ステータス コードで応答する必要があります。
したがって、私のルートは次のようになります。
rest().path(apiPath).produces("application/json")
.get(searchEndpoint)
.to("bean:requestHandler?method=processNewSearch") // generate ticket-id and reply with 202 or 3xx
.route().inOnly("activemq:queue:start").endRest() // put the incoming message into the start-queue where the processing starts
.get(resultEndpoint).to("bean:requestHandler?method=returnResult"); // return 299 when processing not done or 200 + result
from("activemq:queue:start")
.setHeader("recipients").method(new ExtractRecipients(), "extractRecipients")
.to("activemq:queue:recipientlist");
... etc, etc... until:
from("activemq:queue:output")
.to("bean:requestHandler?method=saveFinishedSearch");
Bean 自体には 3 つのメソッドがあります。
public void processNewSearch(Exchange exchange) {
//generate ticket and stuff and finally set Header and body of the response
exchange.getOut().setHeader(Exchange.HTTP_RESPONSE_CODE, 202);
exchange.getOut().setBody(redirectUrl);
}
public void returnResult(Exchange exchange) {
//handle ticket related stuff, if valid fetch result and create http response:
exchange.getOut().setHeader(Exchange.HTTP_RESPONSE_CODE, 200);
exchange.getOut().setBody(searchResult);
return;
}
public void saveFinishedSearch(Exchange exchange) {
// get search Results from the final Message that was processing asynchronously in the background and save it
finishedSearches.put(ticket, body);
}
これは、手動で設定した応答コードとメッセージで返信する適切な方法ではないと確信していますが、それを行う別の方法が見つかりませんでした.
したがって、現在の問題は、メッセージ全体が処理されるまでキャメルが待機することです。したがって、によって生成された応答は.to("bean:requestHandler?method=processNewSearch")
、開始キューに入れられるだけなので何もしません。
camel でカスタム レスポンスをすぐに返し、ルートでリクエストを非同期に処理するにはどうすればよいですか?