2016-10-26 2 views
2

В Spring Integration Мне нужно отправить сообщение последовательно в подпоток A (он хранит сообщение в БД), а затем в подпоток B (он использует некоторый поиск БД). Выполнение всего А и В должно выполняться на границе одной транзакции.Соответствующий выбор EIP для последовательных вызовов подтонов

Первоначально использовался Publish-Subscribe Channel с двумя подписчиками для A и B в одном потоке. Тем не менее, есть 2 недостатки

  1. там нет гарантированного порядка выполнения абонентов
  2. легко добавить task-executor атрибут канала. Таким образом, A и B будут выполняться параллельно в разных потоках и, таким образом, в разных транзакциях.

Итак, что можно использовать здесь EIP?

Я думаю о Recipient List Router, но, опять же, can't see guaranty отправки сообщения для получателей.

ответ

2

Существует order атрибут на AbstractMessageHandler, который гарантирует, как абоненты будут подписаны на PublishSubscribeChannel: http://docs.spring.io/spring-integration/reference/html/messaging-channels-section.html#channel-implementations-directchannel:

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

Если какая-либо ситуация требует, чтобы диспетчер всегда пытался вызвать первый обработчик, а затем возвращаться в одну и ту же последовательность фиксированного порядка каждый раз при возникновении ошибки, не следует предлагать стратегию балансировки нагрузки. Другими словами, диспетчер по-прежнему поддерживает логическое свойство failover, даже если балансировка нагрузки не включена. Однако без балансировки нагрузки обращение обработчиков всегда начинается с первого в соответствии с их порядком. Например, этот подход работает хорошо, когда существует четкое определение первичного, вторичного, третичного и т. Д. При использовании поддержки пространства имен атрибут «порядок» на любой конечной точке будет определять этот порядок.

Также исходный код AbstractDispatcher:

private final OrderedAwareCopyOnWriteArraySet<MessageHandler> handlers = 
     new OrderedAwareCopyOnWriteArraySet<MessageHandler>(); 

также подробнейшее описание атрибута order XML:

<xsd:attribute name="order" type="xsd:string"> 
     <xsd:annotation> 
      <xsd:documentation><![CDATA[ 
Specifies the order for invocation when this endpoint is connected as a 
subscriber to a channel. This is particularly relevant when that channel 
is using a "failover" dispatching strategy. It has no effect when this 
endpoint itself is a Polling Consumer for a channel with a queue. 

       ]]></xsd:documentation> 
     </xsd:annotation> 
    </xsd:attribute> 
+0

Ну ... это поможет, но 'PublishSubscribeChannel' соответствующий EIP в моем случае вообще? Можно ли использовать «цепочку», например? –

+0

Если вам необходимо поддерживать TX и порядок услуг, чем никакой выбор: однопоточный канал публикации-подписки –