Апачский верблюд - делает накопитель ' flush'

Я эффективно хочу поток или completionSize, но для всех скоплений в накопителе. Как глобальный completionSize.

В основном я хочу удостовериться, что каждое сообщение, которое появляется в партию, соединено, и затем имейте все скопления в том накопителе, полном сразу, когда последний был прочитан.

e.g. 1000 messages arrive (the length is not known beforehand)

     aggregate on correlation id into bins
        A 300
        B 400
        C 300   (size of the bins is not known before hand)

     I want the aggregator not to complete until the 1000th exchange is aggregated
     thereupon I want all of the aggregations in the aggregator to complete at once

CompleteSize обращается к каждому скоплению, а не накопителю в целом, к сожалению. Таким образом, если я установил CompleteSize (1000), он никогда не будет просто заканчиваться, так как каждое скопление должно превысить 1000, прежде чем это будет 'полно'

Я мог обойти его, создав единственный объект Карты, но это отчасти обходит корреляцию в aggregator2, который я предпочел бы использовать идеально

так да, или глобальный полный размер или смывание, там способ сделать это разумно?

2
nl ja de

2 ответы

один выбор состоит в том, чтобы просто добавить некоторую логику, чтобы держать глобальный прилавок и установить Обмен. AGGREGATION_COMPLETE_ALL_GROUPS заголовок однажды его достигнутый...

Доступный с Кэмела 2.9... Можно вручную закончить соединенные обмены всего тока, послав в сообщении, содержащем Обмен заголовка. Набор AGGREGATION_COMPLETE_ALL_GROUPS к истинному. Сообщение считают сообщением сигнала только, заголовки/содержание сообщения не будут обработаны иначе.

3
добавлено
как вы предпочли бы, чтобы это работало?
добавлено автор Ben ODay, источник
Я вижу ваш пункт...
добавлено автор Ben ODay, источник
добавлено автор Ben ODay, источник
Спасибо that' s большой, я вижу его в докторах теперь, когда вы указали на него, но я никогда не замечал его, читая прежде.
добавлено автор user1743310, источник
It' s большой ответ, но я can' t верят they' ve осуществил его этот путь... it' s настолько грязный и изменяет логику маршрута так ужасно, если я кодовый холодильник маршрут к помещенному в руку в чистом сообщении с заголовком, когда близкое условие соблюдают, it' s серьезно ужасный. Но прекрасный ответ, спасибо.
добавлено автор user1743310, источник
не имеют волшебное сообщение это doesn' t потребляется? - просто разрешение ' сигнал message' не быть убитыми вы могли добавить заголовок на последнем сообщении и вызвать завершение, и это едва изменит поток данных в маршрут. должным быть изменить ваш поток данных, чтобы изменить конфигурацию накопителя кажется логически неловкими, но намного лучшими вариантами, в порядке совершенства: 1) лучше всего был бы, имеют флаг на накопителе как completeAllGroupsTogether 2), имеют дополнительное возвращение "complete_all" от CompletionPredicate 3), выставляют метод, чтобы призвать поток в параметре CompletionPredicate (не grt)
добавлено автор user1743310, источник

Я предлагаю смотреть на накопитель Верблюда eip доктор http://camel.apache.org/aggregator2, и читайте о различных условиях завершения. И также что специальное сообщение, которое Бен отсылает к вам, может послать в сигнал закончить все совокупности в полете.

Если вы потребляете от пакетного потребителя http://camel.apache.org/batch-consumer.html тогда можно использовать специальное завершение, что complets, когда партия сделана. Например, если вы файлы погрузки или ряды от таблицы базы данных JPA и т.д. Тогда, когда все сообщения от пакетного потребителя были обработаны тогда, накопитель может сигнализировать о завершении для всех этих соединенных сообщений, используя completionFromBatchConsumer выбор.

Также, если у вас есть копия Верблюда в книге Действия, затем прочитайте главу 8, раздел 8.2, как все о совокупном EIP, покрытом намного большим количеством деталей.

0
добавлено
Этот вид работ, но кажется, что CamelBatchSize установлен неправильно в ' 1' по умолчанию на файле (партия) после того, как это разделяется, таким образом, трахая Обмен. BATCH_SIZE к количеству отчетов в файле вручную, это работает. Было бы хорошо, если бы разделение соединилось с пакетным размером, и это будет потреблять правильную сумму. Так этот doesn' t wquite работают из коробки. I' ll переходят 8.2 более подробно, когда я получаю шанс
добавлено автор user1743310, источник