Java 如何捕获TcpInboundGateway上的套接字异常?
我正在使用Java 如何捕获TcpInboundGateway上的套接字异常?,java,spring,sockets,spring-integration,Java,Spring,Sockets,Spring Integration,我正在使用spring集成中的TcpInboundGateway作为socket客户端 在TcpInboundGateway.doOnMessage()中,流通过套接字连接发送。如果发生异常,例如由于套接字关闭,则只有一个spring错误日志“发送回复失败” 但我想明确地处理这些套接字错误。如何在所需的类中捕获这些错误?我们可能应该更改它以传播异常,但这将是一个行为更改,因此我们可能只需要在4.2中执行,除非我们将其作为一个选项 实际上,经过进一步审查,;这是无法适应的-您必须通过处理异常 发送
spring集成中的TcpInboundGateway
作为socket
客户端
在TcpInboundGateway.doOnMessage()
中,流通过套接字连接发送。如果发生异常,例如由于套接字关闭,则只有一个spring错误日志“发送回复失败”
但我想明确地处理这些套接字错误。如何在所需的类中捕获这些错误?我们可能应该更改它以传播异常,但这将是一个行为更改,因此我们可能只需要在4.2中执行,除非我们将其作为一个选项
实际上,经过进一步审查,;这是无法适应的-您必须通过处理异常
发送是在入站线程上执行的,而不是您的发送线程
我们可以增强异常事件以包括失败的出站消息
编辑:
或者,使用一对而不是入站网关
这样,发送是在发送回复的线程上执行的,您可以捕获异常。使用自定义的TcpInboundGateway
扩展原始线程,并覆盖doOnMessage
以放入try catch
?不幸的是,您不能这样做,因为这是一个私有方法。您必须覆盖onMessage()
。但即使这样也不行,因为您需要访问连接
来查找连接,因此您也必须覆盖TcpSender
方法;此异常发生在入站线程上,而不是应答线程上。因此,您必须使用异常事件机制来获取错误通知。我建议您可以在没有错误的情况下使私有布尔doOnMessage()
返回true
(因此在连接之后。发送(回复)
-我想知道为什么现在不是这样),并在异常时使返回false
。目前它总是返回false!然后将其设置为受保护的,这样我们就可以覆盖它,在内部调用super.DoOnMessage()
并计算布尔值。如果为false,则表示将回复返回到套接字时出现了某种错误,并且可以进行相应的处理?如果您可以返回一个SimpleEntryAs,则会更好。正如我所说,这对您没有帮助,因为doOnMessage
是在接收消息的入站线程上调用的,不是在发送回复的线程上-这是一个基本的框架设计,很难更改。解决方案是侦听异常事件。我打开了一个将消息添加到事件中的窗口。这通常是正确的,但我尝试了以下操作:打开客户端套接字>向套接字发送数据>从另一端终止套接字>尝试通过套接字发送回复。结果:doOnMessage()
将计算连接==null
,记录错误并返回false
。但这正是我想抓住的情况。我明白了,是的,我们也应该在这种情况下生成一个事件。允许您进行子类化并没有多大意义,因为它在网关中的私有线程上运行,所以无论如何您都必须将其转移,而事件机制应该足以实现这一点。