1

この種の問題の最新の例を見つけようとしましたが、残念ながら見つかりませんでした。次のように動作するキャメルを使用して 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 でカスタム レスポンスをすぐに返し、ルートでリクエストを非同期に処理するにはどうすればよいですか?

4

1 に答える 1