2012-02-07 7 views
2

私はCXFRSエンドポイントを持っていますが、 "GET/files/x"などのリクエストは特定のディレクトリから "x"ファイルを返してから削除する必要があります。ファイルは別のプロセスから出力され、このルート経由ですぐに消費されます。したがって、必要に応じて、一時的にポーリングして一時的に記憶しておいても問題ありません。Camelリクエスト/返信相関

以下は私の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> 

私はコンテンツenricherパターンを検討したが、元の交換はenricher内の消費者がアクセスすることができないので、これは助けにはなりません。したがって、入力メッセージからファイル名を動的に決定することはできません。言い換えれば、以下の例ではファイル "x"は読み取られません。なぜなら、ヘッダーはファイルエンドポイントから見えないからです。

...setHeader(Exchange.FILE_NAME, "x").pollEnrich("file://dir")... 

Iはまた、以下に示す凝集戦略、ウェブサービス経路と別ファイル経路間の集約パターンを使用することを試みました。

@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; 
    } 
} 
} 

アグリゲーターパターンは「唯一の」交換のようであるため、これは機能しません。 「イン・アウト」エクスチェンジでは、メッセージがアグリゲータに到達するとすぐに、アグリゲーションが完了した後ではなく、クライアントにリプライが返されます。その後、私は以下のプロセスを書いた。

@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(); 
} 
} 

このプロセスは、コンテンツエンリッチャを動的に構成すること以外に何もしません。私はそれをするより良い方法がないと信じることは難しいと思う。特に、私はスレッド化し、常にコンポーネント/エンドポイントをコンテキストに追加/削除することに懸念しています。

誰でもこの問題の解決策を提案できますか?

+2

将来のCamelリリースでpollEnrichを改善するためのJIRAチケットがあります:https://issues.apache.org/jira/browse/CAMEL-4163 –

答えて

1

Java Beanなどのファイルを豊かにするために、java.io.Fileを使用してメッセージ本文を設定するだけです。そして、豆へのルートのメッセージを:ラクダのルートで直接行うことが容易になりますので、将来的には

public File whichFileToPick(@Header("id") String id) { 
    return new File("somedir/" + id"); 
} 

pollEnrichが強化されます。キリスト教徒は、ポーランド人のためのウールとしてカメル表現を指定できるようにするという、良いアイデアを思いついた。

関連する問題