2015-06-17 3 views
1

Я получаю данные из нескольких источников в разных потоках. Планирование передачи данных на один канал, а затем отдельный поток будет обрабатывать данные с этого канала. Мой контекст следующий:Весна Интеграция асинхронной обработки с использованием диспетчера

<task:executor id="singleThreadedExecutor" pool-size="1" /> 
<int:channel id="entryChannel"> 
    <int:dispatcher task-executor="singleThreadedExecutor"/> 
</int:channel> 

<int:header-enricher input-channel="entryChannel" output-channel="processDataChannel"> 
    <int:error-channel ref="exceptionHandlerChannel" overwrite="true" /> 
    <int:header name="systemtime" expression="T(java.lang.System).currentTimeMillis()" /> 
    <int:header name="nanotime" expression="T(java.lang.System).nanoTime()" /> 
</int:header-enricher> 

Я хотел обработать данные, как только он поступит. У меня есть проблемы, когда данные поступают намного быстрее, чем время обработки данных, в отдельный поток. Из документации, вызывающей Отправить на записьКаталог должен немедленно вернуться. Имеет ли диспетчер внутренний механизм очередей для обеспечения передачи данных на канал? Как мы можем гарантировать, что данные будут переданы, как только они поступят? Хотите узнать о лучшей практике в тех случаях, когда нам нужно обрабатывать данные в отдельном потоке, как только он поступит, в SI?

ответ

0

Сам исполнитель задач выполняет задачи (которые вызывают подписанную конечную точку) в очереди, поэтому да, вызывающий абонент немедленно выходит (пока в очереди есть место, которое всегда соответствует вашей конфигурации).

0

Прежде всего, ваш вопрос здесь:

<task:executor id="singleThreadedExecutor" pool-size="1" /> 

Независимо от отправителей только один Thread способен получать сообщения от entryChannel. И это происходит только тогда, когда он свободен и готов делать то, о чем вы просите. Но в вашем случае он занят обработкой первого сообщения, затем второго и так далее. Один за другим и только один за раз, потому что это один поток.

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

Что касается второго вопроса: Back Pressure.

Смежные вопросы