在Spring集成中,如何捕获不同的exception?

在Spring集成中,我有一个简单的tcp客户端管道:一个网关,一个tcp出站网关,一个服务激活器和一个错误通道。 在tcp-connection-factory中有一个简单的拦截器。 错误通道非常简单,我用这个filter实现了tcp-connection-event-inbound-channel-adapter:

  • org.springframework.integration.ip.tcp.connection.TcpConnectionExceptionEvent。

所以我的error handling程序非常简单,看起来像这样:

public class TcpErrorHandler { public void onException(){ System.out.println("Exception!!! "); } } 

它工作,因为当我有一个Socket关闭exception(服务器端我关闭连接),应用程序写“exception!!!” 到了控制台,但另一方面,当我有连接超时exception时,它不起作用。 我的问题是:如何为我获得所有最相关的例外:

  • 运行时套接字关闭exception
  • 连接超时exception
  • 其他例外

有没有捕捉机制?

这是来自我的bean配置的snipet:

                     

这是我的error handling程序:

 public class TcpErrorHandler { @Autowired private ApplicationContext appContext; public void onException(TcpConnectionExceptionEvent event){ MainService mainService = appContext.getBean(MainService.class); mainService.setSuccess(3); System.out.println("Exception!!! "); System.out.println(event.getCause().getMessage()); } } 

拦截器在这里:

 public class CustomInterceptor extends TcpConnectionInterceptorSupport{ public CustomInterceptor () { System.out.println("catched_constructor1"); } public CustomInterceptor (ApplicationEventPublisher applicationEventPublisher) { super(applicationEventPublisher); System.out.println("catched_constructor"); } @Override public boolean onMessage(Message message) { System.out.println("catched_message"); return super.onMessage(message); } @Override public void send(Message message){ System.out.println("catched_send"); MessageHeaders mh = message.getHeaders(); try { super.send(message); } catch (Exception e) { System.out.println("catched_send_exception"); } } @Override public void close() { String id = getConnectionId(); System.out.println("catched_closed" + id); super.close(); } } 

而我的“来电者”:

 success = gateway.send("fooooooo"); 

实际上将带有TcpConnectionExceptionEvent (在您的情况下)的Message作为payload发送到channel

因此,您的订户(您的TcpErrorHandler )可以接受TcpConnectionExceptionEvent作为方法参数。

在该方法中,您可以执行进一步的逻辑,例如从IntegrationEvent提取原始Exception

使用TcpConnectionSupport.publishConnectionExceptionEvent时, IP模块中有几个位置。

如果你说你没有抓住time out exception ,那么如果你分享这个问题的日志就会很棒。 我想知道我们不try...catch哪个地方try...catch SocketTimeoutException ……

UPDATE

   

 public class TcpErrorHandler { public void onException(TcpConnectionExceptionEvent event) { System.out.println("Exception!!! "); event.getCause(); .... } } 

这应该工作。

UPDATE2

根据你的代码:

 try { super.send(message); } catch (Exception e) { System.out.println("catched_send_exception"); } 

难道你不认为在那里窒息一个例外是不好的吗?

从另一方面:当您确定应该调用tcpErrorHandler时,您是否介意为org.springframework.integration类别切换DEBUG日志记录级别并在此处共享日志?

从另一侧尝试 ,根本没有event-types 。 我的意思是让我们看看,如果它处理任何IpIntegrationEvent

您可以定义提供给入站适配器的错误通道。 这是一个例子:

    

现在,此错误通道将捕获向下游引发的所有exception。 然后,您可以使用此错误通道将服务激活器定义为输入:

   

此激活器引用定义error handling逻辑的bean。