在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。