2016-08-12 3 views
2

У меня есть следующая конфигурация Spring Integration, которая позволяет мне вызвать метод шлюза из MVC Controller и позволить контроллеру вернуться, тогда как поток интеграции будет продолжаться сам по себе в отдельном потоке, который не блокирует контроллер ,Обработка ошибок в потоке интеграции интеграции async

Однако я не могу понять, как заставить обработчик ошибок работать для этого потока async. У моего шлюза определен канал ошибок, но по некоторым причинам мои исключения не достигают. Вместо этого я вижу, что вызывается LoggingHandler.

@Bean 
IntegrationFlow mainInteractiveFlow() { 
    return IntegrationFlows.from(
      MessageChannels.executor("input", executor)) 
      .split() 
      .channel(MessageChannels.executor(executor)) 
      .transform(transformer) 
      .handle(genericMessageHandler, "validate") 
      .handle(genericMessageHandler, "checkSubscription") 
      .handle(interactiveMessageService, "handle") 
      .<Task, String>route(p -> p.getKind().name(), 
        m -> m.channelMapping(TaskKind.ABC.name(), "attachInteractiveChannel")) 
      .get(); 
} 

@Bean 
IntegrationFlow attachInteractiveChannelFlow() { 
    return IntegrationFlows.from(
      MessageChannels.direct("attachInteractiveChannel")) 
      .handle(issueRouterService) 
      .get(); 
} 

@Bean 
IntegrationFlow interactiveExceptionChannelFlow() { 
    return IntegrationFlows.from(interactiveExceptionChannel()) 
      .handle(errorHandler, "handleErrorMessage") 
      .get(); 
} 

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

Gateway:

@MessagingGateway(errorChannel = "interactiveExceptionChannel") 
public interface InteractiveSlackGW { 

    @Gateway(requestChannel = "input") 
    void interactiveMessage(Collection<Request> messages); 

} 

Что я должен сделать для того, чтобы увидеть мои исключения происходит в потоке интеграции асинхронном обрабатывается мой обработчик ошибок?

ответ

2

Шлюз с возвратом void не ожидает ответа, так что в заголовки сообщений нет канала ответа/ошибки. При запуске в вызывающем потоке исключение отправляется вызывающему; с асинхронным потоком исключение перейдет к умолчанию errorChannel (к которому подключен адаптер журнала).

Для этого сценария вам необходимо добавить заголовок, чтобы установить заголовок errorChannel на ваш канал ошибок.

Мы должны изучить это автоматически, но этого не происходит в настоящее время.

Для этого я открыл JIRA Issue.

+0

О, это все объясняет. Спасибо, Гэри. –

+0

Рассмотрите что-то вроде '@GatewayHeader (name =" errorChannel ", expression =" @ interactiveExceptionChannel ")'. Я думаю, что именно этот будет выполняться под Spring Integration 5.0. –

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