Как я могу определить шлюз интеграции с отказоустойчивой пружиной?

Я новичок в Spring Integration. У меня есть канал, подключенный к очереди JMS. Затем у меня есть определенный шлюз, в котором этот канал настроен как канал запроса по умолчанию.

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

Однако у меня есть дополнительное требование, чтобы была определена очередь переключения при отказе: если по какой-то причине первичный недоступен, будет предпринята попытка отправки в очередь переключения при отказе / вторичную очередь.

Я не нахожу примеров такой конфигурации.

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

try {
  primaryGateway.sendMessage(message);
} catch (Exception e) {
  secondaryGateway.sendMessage(message);
}

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

Кроме того, у меня возникла проблема при попытке определить вторичную фабрику соединений. Я не уверен, как указать компонентам очереди (или их каналам), какую фабрику соединений использовать. Если я не использовал идентификатор по умолчанию "connectionFactory", он жаловался.

Вот ключевые части моей конфигурации с одной определенной очередью / каналом / шлюзом:

<bean id="mqConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
  <property name="transportType" value="1"/>
  <property name="hostName" value="${lsm.primary.sch.outbound.host}"/>
  <property name="port" value="${lsm.primary.sch.outbound.port}"/>
  <property name="queueManager" value="${lsm.primary.sch.outbound.manager}"/>
  <property name="channel" value="${lsm.primary.sch.outbound.channel}"/>
</bean>

<bean id="connectionFactory"
  class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
  <property name="targetConnectionFactory" ref="mqConnectionFactory" />
  <property name="username" value="blah" />
  <property name="password" value="blah" />
</bean>

<bean id="lsmScheduleActualOutboundQueue" class="com.ibm.mq.jms.MQQueue">
  <property name="baseQueueManagerName" value="${lsm.primary.sch.outbound.manager}"/>
  <property name="baseQueueName" value="${lsm.primary.sch.outbound.queue}"/>
</bean>

<int:channel id="lsmScheduleActualOutboundChannel" />

<jms:outbound-channel-adapter id="jmsOutboundAdapter" 
  channel="lsmScheduleActualOutboundChannel" 
  destination="lsmScheduleActualOutboundQueue" />


<int:gateway id="lsmScheduleActualOutboundGateway" 
  service-interface="com.myapp.service.LSMScheduleActualsGateway"
  default-request-channel="lsmScheduleActualOutboundChannel" 
  default-request-timeout="1000" />

person Steve    schedule 11.07.2013    source источник


Ответы (1)


Исходящий адаптер не сможет переключиться, но вы можете подключить два исходящих адаптера к lsmScheduleActualOutboundChannel; по умолчанию платформа выполняет циклический перебор запросов, но вы можете изменить это поведение, настроив <dispatcher/> канала с помощью load-balancer="none"; это отправит сообщение второму адаптеру, если первый выйдет из строя.

См. Справочное руководство Direct Channel 'Documentation и Конфигурация для получения дополнительной информации.

Адаптер канала имеет атрибут connection-factory; если не указан, по умолчанию используется connectionFactory.

person Gary Russell    schedule 11.07.2013
comment
Идеально! Я подумал, что будет более простое (более элегантное) решение, чем то, что я пытался. Я только что протестировал аварийное переключение, и он отлично сработал. Большое спасибо! - person Steve; 11.07.2013
comment
Круто - вы также можете взглянуть на добавление Circuit Breaker Advice к первому адаптеру. Таким образом, когда он не работает, вместо того, чтобы пробовать его для каждого сообщения, вы можете вместо этого пробовать его время от времени. static.springsource.org/ весенняя интеграция / ссылка / html / - person Gary Russell; 11.07.2013