2017-07-06 13 views
0

私は交換を集約したいと思います。そして、ある特定のサイズ(例えば20KB)のヒットを交換すると、その交換をクローズとしてマークしたいと思います。集約のメッセージサイズに基づく集計方法

私はエクスチェンジのサイズをチェックする初歩的な実装をしていますが、それが18KBの場合は私の述語から真を返します。しかし、メッセージが4KBで現時点で17KBであれば、それは大きすぎる21KBのときに集約することを意味します。

これを解決する方法はありますか?集計戦略で何かをして結合を拒否し、集約するために新しいExchangeを開始することはできますか?

実際のサイズを確認するために別のプロセスを実行してメッセージの末尾のメッセージを削除してサイズに合わせることができたと考えていましたが、削除されたメッセージごとに戻します...しかし、私は常に実行する可能性が高いルーチンを補償している。

ご協力いただきありがとうございます。

答えて

0

私は17 + 4> 20の状況があるときにそれを完全とマークするために使用できる熱心な完全なオプションがあると思います。そして、それは17を完了し、でドキュメントを参照してください。4.

と新しいグループを開始します:https://github.com/apache/camel/blob/master/camel-core/src/main/docs/eips/aggregate-eip.adoc

そして、あなたはまた、おそらく `PreCompleteAggregationStrategy」を使用し、その17 + 4にtrueを返す必要があるだろう>それ以外の場合は、最初にまとめてグループ化して21になります。しかし、熱心な完了チェックオプションとこのインターフェースを使用することで、必要に応じて行うことができます。

https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/processor/aggregate/PreCompletionAwareAggregationStrategy.java

+0

ありがとうございます。私はそれを見てみましょう。私はCamelを使ってからしばらくしていることを認めなければなりません。実際のEIPの問題を解決するためにCamelを使用して戻ってきてうれしいです。私は2.11日から何が新しくなったのかを確認する必要があります。 – user2871054

+0

これで、Precompletionインターフェイスが実装されました。 'public boolean preComplete(Exchange oldExchange、Exchange newExchange){ \t \t \t String oldBody = oldExchange.getIn()。getBody(String.class); \t \t \t文字列newBody = newExchange.getIn()。getBody(String.class); \t \t \t \t \t \t return(oldBody + newBody).length()>(10 * 2000)?正誤 ; \t \t} 'それだけで動作します。新しい交換機が古い交換機を20kにする場合、それは集約された交換機を完了し、新しいものを作成する。 eagercompleteを使う必要があるかどうかわからないこの例では、強制的に集約を完了させるためにSTOPを送信する場合に使用することを示唆しています。 – user2871054

関連する問題