0

私は Apache Camel を使用するのが初めてです。ファイルの移動を手伝ってくれませんか?私はそのようなルートを持っています:

from("file:data?noop=true?move={{package.success}}&moveFailed={{package.failed}}")
                .split(ExpressionBuilder.beanExpression(new InvoiceIteratorFactory(), "createIterator"))
                .streaming()
                .process(new ValidatorProcessor())
                .choice()
                .when(new Predicate() {
                    @Override
                    public boolean matches(Exchange exchange) {
                        ..;
                    }
                })
                .to("jpa://...?consumer.transacted=true")
                .otherwise()
                .aggregate(header(PropertyNameConstants.AGGREGATOR_HEADER), new ErrorsAggregationStrategy())
                .completionPredicate(new Predicate() {
                    @Override
                    public boolean matches(Exchange exchange) {
                     ...;
                    }
                })
                .to("smtps://smtp.gmail.com?username={{remote.e-mail}}&password={{remote.password}}");

したがって、エラーのあるファイルは「失敗」ディレクトリに移動し、エラーのないファイルは「成功」ディレクトリに移動する必要があります。必要なメッセージを集約した後 (エラーのあるファイルの解析中に) 例外を生成しようとしたため、ファイルをディレクトリに移動するのに「失敗」しましたが、例外があったとしても、すべてのファイルがディレクトリに「成功」​​しました。

アグリゲーターの前に例外をスローすると、ファイルは「失敗した」ディレクトリに移動しましたが、最後の「to」(メールの送信) は機能しません。

4

1 に答える 1

0

Camel in Action のコピーをお持ちの場合は、アグリゲーター EIP に関する第 8 章を読んで、それがどのように機能するかを理解することをお勧めします。また、それがステートフル EIP であるという事実を理解することをお勧めします。これにより、Exchange のハンドオフが行われ、コンシューマーが完了します。そして、アグリゲーターから出てくる集約された交換は、元の消費された交換とは独立して実行されます。

また、構成されたメッセージ プロセッサの eip を確認し、スプリッターのみのバージョンを使用することもできます。

于 2014-05-14T19:19:05.713 に答える