Интеграция Spring: категории, позволяющие избежать потерянных сообщений

Если канал Spring Integration определен с исполнителем задачи, пул потоков будет использоваться для обработки сообщений по мере их поступления. Если компонент конечной точки активатора службы или преобразователя получает сообщения из этого внутреннего канала, будет ли создан пул компонентов конечной точки, по одному на каждый поток? Если это не поведение по умолчанию, какая конфигурация требуется для этого?

Это важно по двум причинам:

  1. Чтобы активатор / преобразователь службы, получающий сообщения, не был узким местом.

  2. Чтобы гарантировать, что компонент конечной точки обрабатывает сообщения в том же потоке, что и внутренний канал, чтобы они были частью одной транзакции. Если это так и канал сохраняется с использованием JMS, сообщения не будут потеряны. В противном случае, если конечная точка запускается в отдельной транзакции, тот факт, что сообщения сохраняются на канале, не поможет, если произойдет сбой JVM после того, как сообщение было передано компоненту конечной точки.

Спасибо


person user1052610    schedule 23.02.2014    source источник


Ответы (1)


Нет; есть один экземпляр каждой конечной точки, независимо от потоковой передачи во входном канале.

  1. Вы избегаете «узких мест» за счет тщательного проектирования службы, как правило, без сохранения состояния.
  2. Непонятно, что вы имеете в виду; если канал поддерживается JMS, каждый поток на выходной стороне может получить свою собственную транзакцию, и сообщения будут откатываться в очередь в случае сбоя службы. Это полностью отличается от простого канала исполнителя (для которого транзакции никогда не могут работать, и наличие отдельного экземпляра тоже не поможет).

Возможно, если вы сможете описать конкретный вариант использования / конфигурацию, кто-нибудь сможет дать несколько предложений.

person Gary Russell    schedule 23.02.2014
comment
Вот пример, поясняющий мой вопрос: - person user1052610; 24.02.2014
comment
Вот пример, поясняющий мой вопрос: внутренний канал определяется исполнителем задачи. Сообщения помещаются в канал адаптером входящего канала, который опрашивает базу данных. Затем трансформатор получает сообщения из внутреннего канала. Насколько я понимаю, внутренний канал (исполнитель) не будет частью какой-либо предыдущей транзакции, но он начнет новую транзакцию, которая будет включать преобразователь. В этом случае, даже если произойдет сбой после того, как канал передал сообщение преобразователю, сообщение не будет потеряно. Это верно? - person user1052610; 24.02.2014
comment
Чтобы прояснить вышесказанное, когда я говорю, что сообщение будет сохранено и не потеряно, я имею в виду канал исполнителя, поддерживаемый jms (‹jms: channel ... /›) - person user1052610; 24.02.2014
comment
Опять же, вы путаете канал исполнителя с каналом с поддержкой jms. Канал исполнителя просто переключается на другой поток; семантика транзакций зависит от того, что находится ниже по течению канала (@Transactional методы, транзакционный шлюз и т. д.). С каналом с поддержкой JMS его можно настроить для использования транзакций, и транзакция начинается с извлечения сообщения из очереди, и оно не будет потеряно в случае сбоя. - person Gary Russell; 24.02.2014
comment
Большое спасибо. Итак, ‹int-jms: channel task-executor = ... confirm = transhibited /› запустит новую транзакцию, которая будет включать конечные точки нисходящего потока (сервисный фильтр, преобразователь и т. Д.). Если произойдет системный сбой, даже после того, как сообщение будет передано конечной точке, сообщение не будет потеряно, потому что провайдер JMS (если так настроен) сохранил его. - person user1052610; 24.02.2014