2016-06-21 18 views
2

Я хочу выполнить событие, когда определенный набор событий выполнил свою задачу. Spring Integration: событие вызова, когда определенные группы событий успешно выполнили свою задачу.

например

я следующие пулы событие

<int-jpa:inbound-channel-adapter id="eventForUpdateProject" channel="updateProjectRequest" entity-manager="entityManagerFactory" 
jpa-query="SELECT p FROM Project p WHERE p.sysProject.id IS NOT NULL AND p.sysProject.sysupdate != p.updatedAt"> 
    <int:poller fixed-rate="2000" > 
     <int:transactional propagation="REQUIRED" transaction-manager="transactionManager"/> 
    </int:poller> 
</int-jpa:inbound-channel-adapter> 

Он активирует три службы.

<int:service-activator input-channel="updateProjectRequest" ref="S1"></int:service-activator> 
<int:service-activator input-channel="updateProjectRequest" ref="S2"></int:service-activator> 
<int:service-activator input-channel="updateProjectRequest" ref="S3"></int:service-activator> 

Теперь я хочу вызвать четвертое событие, как только все эти события выполнили свои задачи. Любая идея Как это возможно.

ответ

1

Существует несколько уловок для такой задачи.

  1. <aggregator>, когда все эти ваши услуги отправить свой результат по какой-то корреляции. Групповой выпуск на <aggregator> выполняется только тогда, когда release-strategy выполнил требования.

  2. <publish-subscribe-channel> без каких-либо executor и со всеми вашими услугами в качестве подписчиков. Плюс к тому, что ваш четвертый. Похоже, это ваш случай, хотя вы не показываете конфигурацию updateProjectRequest. Без исполнителя все подписчики получают одно и то же сообщение один за другим: второй абонент выполняет свою задачу только тогда, когда первый закончен. Поэтому ваше «четвертое событие» будет инициировано только после всех предыдущих.

  3. <recipient-list-router> с аналогичной семантикой, как и предыдущий подход, но на нескольких последовательных каналах.

Я бы сказал, что первый из них лучше, потому что вы можете использовать один и тот же <publish-subscribe-channel>, но уже с executor и все ваши услуги будут выполняться параллельно. Даже если вам нечего возвращать из этих сервисов, вы можете эмулировать агрегацию и корреляцию с парой активаторов службы на одной и той же синхронизации <recipient-list-router>, где первый из них является вашим реальным сервисом, а второй предназначен для отправки некоторого искусственного сообщения для агрегирования. Все эти <recipient-list-router> s должны быть подписаны на async <publish-subscribe-channel>.

+0

Информация, которую вы предоставили, мне очень помогла, но есть еще некоторое замешательство, я не могу понять понятие «корреляции» в «агрегаторе». Не могли бы вы немного объяснить это. –

+0

Подробнее об этом в Справочном руководстве http://docs.spring.io/spring-integration/docs/4.3.0.RELEASE/reference/html/messaging-routing-chapter.html#aggregator –

+0

Спасибо. Это помогло. –