2015-05-28 2 views
4

Мне интересно, какой правильный способ использовать serviceActivators в SI Java Dsl для обработки ошибок. У меня есть такой Spring Integration XML конфигурация:ErrorHandling in Spring Интеграция с Java Dsl

<jms:message-driven-channel-adapter id="messageIn" auto-startup="false" 
            container="messageNotificationJms" channel="messageChannel" 
            error-channel="customErrorChannel"/> 

<channel id="messageChannel"/> 

<chain input-channel="messageChannel"> 
    <!-- some logic and service-activator --> 
</chain> 

<channel id="customErrorChannelTpm"/> 

<chain input-channel="customErrorChannel" output-channel="nullChannel"> 
    <service-activator ref="errorService" method="stopEndpoints" /> 
</chain> 

Но теперь я пытаюсь использовать SI Java DSL настроить этот контекст, поэтому я создаю такую ​​конфигурацию

@Configuration 
@EnableIntegration 
public class SIConfig { 

    @Autowired 
    AbstractMessageListenerContainer messageNotificationJms; 

    @Autowired 
    ErrorService errorService; 

    @Bean 
    public MessageChannel messageChannel() { 
     return MessageChannels.direct("messageChannel").get(); 
    } 

    @Bean 
    public MessageChannel customErrorChannel() { 
     return MessageChannels.direct("customErrorChannel").get(); 
    } 

    @Bean 
    public JmsMessageDrivenChannelAdapter messageIn() { 
     return Jms.messageDriverChannelAdapter(messageNotificationJms) 
       .id("messageIn") 
       .autoStartup(false) 
       .outputChannel(messageChannel()) 
       .errorChannel(customErrorChannel()) 
       .get(); 
    } 


    @Bean 
    public IntegrationFlow customErrorFlow() { 
     return IntegrationFlows.from(customErrorChannel()) 
      //.handle() ????????????????????????? 
     .get(); 
    } 

    @Bean 
    public IntegrationFlow messageFlow() { 
     //some logic 
    } 

} 

в качестве параметров методы ручки Я попытался использовать лямбда-выражения, подобные этому

.handle(message -> errorService.stopEndpoints(message)) 

но произошла ошибка компиляции из-за типов параметров и типа возврата.

У меня есть один неочевидный вариант без ошибок компиляции, но я не уверен, что он будет корректно работать в среде. Правильно ли это:

.<ErrorMessage>handle((payload, headers) -> { 
    errorService.stopEndpoints(payload); 
    return null; 
}) 

Кроме того, мой класс ErrorHandler.

@Component 
public class ErrorService implements ErrorHandler { 

    @Override 
    public void handleError(Throwable t) { 
     stopEndpoints(t); 
    } 

    public void stopEndpoints(ErrorMessage errorMessage) { 
     Throwable throwable = errorMessage.getPayload(); 
     stopEndpoints(throwable); 

    } 

    private void stopEndpoints(Throwable t) { 
     //stoppingEndpoints 
    } 

} 

EDIT: Я использую Spring Framework 4.1.6, Spring Integration 4.1.3 и SI Java DSL 1.0.1

ответ

3

Вы можете использовать handle(String beanName, String methodName) вариант:

handle("errorService", "stopEndpoints"); 

или

handle("errorService", "handleError"); 

Во втором случае каркас позаботится о разворачивании полезной нагрузки.

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