Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何捕获TcpInboundGateway上的套接字异常?_Java_Spring_Sockets_Spring Integration - Fatal编程技术网

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
。但这正是我想抓住的情况。我明白了,是的,我们也应该在这种情况下生成一个事件。允许您进行子类化并没有多大意义,因为它在网关中的私有线程上运行,所以无论如何您都必须将其转移,而事件机制应该足以实现这一点。