变压器中的异常处理

时间:2018-09-06 10:46:08

标签: spring-integration

当转换器遇到异常时,我们面临一个问题。

下面是场景:

我们有一个具有以下配置的路由器和变压器

<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(),并再次满足条件并调用转换器(使用{{ 1}})。重复进行某些迭代。然后通过input-channel="channel_2"记录异常。

以下是查询:

  1. 为什么路由器在变压器中遇到异常时又被再次调用?
  2. 是错误还是正常行为?
  3. 如何解决这个问题?

如果需要更多详细信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

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调用说明。您需要从IDE调试Spring代码以弄清楚MVC级别上发生了什么