「GET /files/x」などのリクエストが特定のディレクトリからファイル「x」を返し、それを削除する必要がある CXFRS エンドポイントがあります。ファイルは別のプロセスから出力され、このルートを介してすばやく消費されます。したがって、必要に応じて、それらをポーリングして一時的にメモリに保持することは許容されます。
以下は私のWebサービスです。
@Component
@Path("/")
public class WebService {
@GET
@Path("files/{id}")
public String getFile(@PathParam("id") String id) {
return null;
}
}
以下は不完全なルートです。
<route>
<from uri="cxfrs://bean:webService"/>
<choice>
<when>
<simple>${in.headers.operationName} == 'getFile'</simple>
<setHeader headerName="correlationId">
<simple>mandatoryBodyAs(java.lang.String)</simple>
</setHeader>
???
</when>
<choice>
</route>
コンテンツ エンリッチャー パターンを調査しましたが、コンシューマーはエンリッチャー内で元の交換にアクセスできないため、これは役に立ちません。したがって、入力メッセージからファイル名を動的に決定することはできません。つまり、以下の例では、ヘッダーがファイル エンドポイントで認識されないため、ファイル "x" は読み取られません。
...setHeader(Exchange.FILE_NAME, "x").pollEnrich("file://dir")...
また、Web サービス ルートと別のファイル ルートの間でアグリゲーター パターンを使用しようとしました。以下に示すアグリゲーション戦略を使用します。
@Component
public class Aggregator implements AggregationStrategy {
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
if (oldExchange == null) {
return newExchange;
} else {
oldExchange.getOut().setBody(newExchange.getIn().getBody());
return oldExchange;
}
}
}
アグリゲーターのパターンは「in only」交換用のように見えるため、これは機能しません。「in out」交換では、集約が完了した後ではなく、メッセージが集約器に到達するとすぐに応答がクライアントに返されます。その後、以下のプロセスを書き始めました。
@Component
public class FileEnricher implements Processor {
@Value("${folder}")
private String folder;
public void process(Exchange exchange) throws Exception {
Endpoint endpoint = exchange.getContext().getEndpoint(String.format(
"file://%s?fileName=%s",
folder,
exchange.getIn().getHeader("correlationId")
));
PollingConsumer consumer = endpoint.createPollingConsumer();
PollEnricher enricher = new PollEnricher(consumer);
enricher.setTimeout(10000);
consumer.start();
enricher.process(exchange);
enricher.shutdown();
consumer.stop();
}
}
このプロセスは、コンテンツ エンリッチャーを動的に構成できるようにするだけです。それを行うためのより良い方法がないと信じるのは難しいと思います. 特に、スレッド化と、コンテキスト内のコンポーネント/エンドポイントの追加/削除が常に懸念されています。
誰でもこの問題のより良い解決策を提案できますか?