2016-11-08 2 views
1

фона:Spring Integration DSL JmsMessageDrivenChannelAdapter бесконечный повтор после обработки обработчика ошибок

У нас есть Spring Integration адаптер написанный в Spring XML конфигурации, как показано ниже. Он отлично работает во всех сценариях w.r.to обработки ошибок. Все дело в обработке ошибок - это записать сообщение об ошибке в очередь. Теперь нам нужно скрыть эту конфигурацию xml до DSL, мы изменили ее, используя приведенный ниже код.

Проблема:

Всякий раз, когда происходит ошибка внутри цепочки «inputChannel», мы хотели обработки ошибок, чтобы сделать некоторые проверки и записать ошибку на ошибку очереди и не повторите Payload. Spring XML делает именно то, что необходимо, но когда мы меняем его на DSL после размещения сообщения об ошибке в очереди ошибок, полезная нагрузка записывается обратно во входную очередь, и сообщение об ошибке из очереди исчезает, и это происходит в цикле, который никогда не заканчивается ,

Анализ мы сделали:

Там нет ошибки происходит после того, как сообщение об ошибке записывается в очередь и ошибок DSL адаптер конфигурации не имеет ничего как такового в процессе.

Любая помощь/направление для решения этого очень ценится.

Рабочей Spring XML адаптер:

<int-jms:message-driven-channel-adapter 
     channel="inputChannel" container="jmsContainer" extract-payload="true" /> 


<beans:bean id="jmsContainer"  class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <beans:property name="connectionFactory" ref="connectionFactory" /> 
    <beans:property name="destinationName" value="Queue.test" /> 
    <beans:property name="errorHandler" ref="errorHandler" /> 
</beans:bean> 

Проблемные адаптер DSL:

private JmsMessageDrivenChannelAdapter MessageDrivenChannelAdapter(
     String destinationName, String key) throws Exception { 
    JmsMessageDrivenChannelAdapter channelAdapter = Jms 
      .messageDriverChannelAdapter(connectionFactory) 
      .outputChannel(inputChannel) 
      .configureListenerContainer(
        c -> c.errorHandler(errorHandler)) 
      .destination(destinationName) 
      .setHeaderMapper(new HeaderMapper(getChannelHeaders(key))) 
      .get(); 
    return channelAdapter; 
} 

ответ

1

Есть несколько вопросов:

  1. Вы не показываете, как вы используете, что MessageDrivenChannelAdapter() ,

  2. Вы должны поделиться журналами DEBUG, чтобы продемонстрировать, как сообщения должны путешествовать, а какие нет.

Если бы я тебя, я бы преобразовать это XML в этой Java DSL:

@Bean 
public DefaultMessageListenerContainer jmsContainer() { 
    DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(); 
    container.setConnectionFactory(jmsConnectionFactory()); 
    container.setDestinationName("Queue.test"); 
    container.setErrorHandler(errorHandler); 
    return container; 
} 

@Bean 
public IntegrationFlow myJmsFlow() { 
    return IntegrationFlows.from(
      Jms.messageDrivenChannelAdapter(jmsContainer()) 
        .extractPayload(true)) 
      .channel(inputChannel) 
      .get(); 
} 

Главное есть jmsContainer боб, как в вашем XML-конфигурации.

И обратите внимание, как я использую Jms.messageDrivenChannelAdapter() - от IntegrationFlows.from() и без get() звонок.

Если вы собираетесь использовать этот метод MessageDrivenChannelAdapter(), он должен быть public и @Bean, в противном случае все Внутренности IntegrationComponentSpec не будет работать, потому что они потеряли после .get() вызова.

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