Обработка исключений в трансформаторе - PullRequest
0 голосов
/ 06 сентября 2018

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

Ниже приведен сценарий:

У нас есть маршрутизатор и преобразователь со следующей конфигурацией

<bean id="commonMapper"
    class="com.example.commonMapper"></bean>

<int:router input-channel="channelA" ref="commonMapper"
    method="methodA" />

<int:transformer input-channel="channel_2"
    ref="commonMapper" method="methodB"
    output-channel="channelC"></int:transformer>

CommonMapper.java:

public String methodA(SomeBean someBean) {
    if (<some business condition example someBean.getXValue()>) {
      return "channel_1";
    } else if(<some condition>) {
        return "channel_2";  // Assuming it enters this condition, based on this the above transformer with input-channel="channel_2" gets called
    }else if (<some condition>) {
      return "channel_3";
    } else {
      return "channel_4";
    }
}

public SomeBean methodB(Message<SomeBean> message)
          throws Exception{
    SomeBean someBean = message.getPayload();
    someBean.setY(10/0); // Purposely introducing an exception
}

При отладке приложения мы обнаружили, что всякий раз, когда в methodB() встречается исключение, элемент управления возвращается к эталонному методу маршрутизатора, т.е. methodA(), и снова удовлетворяет условиюи вызывает преобразователь (с input-channel="channel_2").Это повторяется для определенной итерации.И тогда исключение регистрируется через AnnotationMethodHandlerExceptionResolver -> resolveException.

Ниже приведены запросы:

  1. Почему маршрутизатор вызывается снова, когда он встречает исключение в преобразователе?
  2. Это ошибка или нормальное поведение?
  3. Как решить эту проблему?

Пожалуйста, дайте мне знать, если вам нужно больше подробностей вокруг него.

1 Ответ

0 голосов
/ 06 сентября 2018

Поток Spring Integration - это простой цепной вызов методов Java. Итак, просто посмотрите на это, как вы называете что-то вроде: foo() -> bar() -> baz(). Таким образом, когда в последнем случае возникает исключение без try...catch в стеке вызовов, элемент управления возвращается к foo() и, если есть какая-то логика повторения, он снова вызовет тот же поток.

Я не уверен, какой у вас AnnotationMethodHandlerExceptionResolver, но похоже, что вы говорите об этом:

Deprecated. 
as of Spring 3.2, in favor of ExceptionHandlerExceptionResolver

@Deprecated
public class AnnotationMethodHandlerExceptionResolver
extends AbstractHandlerExceptionResolver

Implementation of the HandlerExceptionResolver interface that handles exceptions through the ExceptionHandler annotation.

This exception resolver is enabled by default in the DispatcherServlet.

Это означает, что вы используете довольно старую Spring. Я не думаю, что это связано, но ваша вершина стека вызовов - Spring MVC. Вам нужно посмотреть, что происходит с повторной попыткой.

И отвечая на все ваши вопросы сразу: да, это нормальное поведение - см. Объяснение вызова Java выше. Вам нужно отладить Spring-код из IDE, чтобы выяснить, что происходит на уровне MVC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...