spring集成中处理低级套接字错误的最佳实践?

spring集成中处理低级套接字错误的最佳实践?,spring,exception-handling,spring-integration,tcp-ip,socketexception,Spring,Exception Handling,Spring Integration,Tcp Ip,Socketexception,大家好,我在这里再次询问spring integration的tcp ip相关问题 假设我有一个动态配置的tcp ip连接工厂: <int-ip:tcp-connection-factory id="chatRoomTcpIpClientFactory" type="client" host="${host}" port="${port}" single-use="false" using-nio="false" so-keep-alive=

大家好,我在这里再次询问spring integration的tcp ip相关问题

假设我有一个动态配置的tcp ip连接工厂:

<int-ip:tcp-connection-factory id="chatRoomTcpIpClientFactory"
    type="client"
    host="${host}"
    port="${port}"
    single-use="false"
    using-nio="false"
    so-keep-alive="false"
    so-timeout="${timeout}"
    serializer="${seri-deseri}"
    deserializer="${seri-deseri}"/>
假设我的业务逻辑严重依赖于tcp ip连接,并且程序希望对此特定套接字连接错误进行一些错误处理。(例如,将错误写入redis缓存,使用其他ip/端口重新连接等。)

我一直在寻找解决方案,现在我知道“errorChannel”不会在这种低级异常上触发。这同样适用于tcp连接事件入站通道适配器

在谷歌搜索了一段时间后,工厂bean或链接工厂支持的TcpConnectionInterceptorSupport中的“建议”似乎是一条出路。。。但我还是很困惑。tcp连接失败是很常见的。有没有更简单的方法来处理连接异常


编辑:我深入研究了源代码,现在我在我的方法周围添加了一个try-catch。现在可以了。至于tcp连接事件入站通道适配器,它仍然不工作。似乎套接字创建异常未发布

当服务尝试通过套接字发送消息时,TcpSendingMessageHandler会拾取异常


编辑2: 在堆栈跟踪之后:

2015-08-14 10:31:53.694 ERROR 2531 --- [nio-8080-exec-1] o.s.i.ip.tcp.TcpSendingMessageHandler    : Error creating connection

java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at java.net.Socket.connect(Socket.java:538)
at java.net.Socket.<init>(Socket.java:434)
at java.net.Socket.<init>(Socket.java:211)
at javax.net.DefaultSocketFactory.createSocket(SocketFactory.java:271)
at org.springframework.integration.ip.tcp.connection.TcpNetClientConnectionFactory.createSocket(TcpNetClientConnectionFactory.java:76)
at org.springframework.integration.ip.tcp.connection.TcpNetClientConnectionFactory.buildNewConnection(TcpNetClientConnectionFactory.java:49)
at org.springframework.integration.ip.tcp.connection.AbstractClientConnectionFactory.obtainNewConnection(AbstractClientConnectionFactory.java:114)
at org.springframework.integration.ip.tcp.connection.AbstractClientConnectionFactory.obtainConnection(AbstractClientConnectionFactory.java:77)
at org.springframework.integration.ip.tcp.connection.AbstractClientConnectionFactory.getConnection(AbstractClientConnectionFactory.java:67)
at org.springframework.integration.ip.tcp.connection.AbstractClientConnectionFactory.getConnection(AbstractClientConnectionFactory.java:31)
at org.springframework.integration.ip.tcp.TcpSendingMessageHandler.obtainConnection(TcpSendingMessageHandler.java:72)
at org.springframework.integration.ip.tcp.TcpSendingMessageHandler.doWrite(TcpSendingMessageHandler.java:144)
at org.springframework.integration.ip.tcp.TcpSendingMessageHandler.handleMessageInternal(TcpSendingMessageHandler.java:120)
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78)
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116)
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:101)
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:97)
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:287)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:245)
at (My service call)
2015-08-14 10:31:53.694错误2531---[nio-8080-exec-1]o.s.i.ip.tcp.TcpSendingMessageHandler:创建连接时出错
java.net.ConnectException:连接被拒绝
位于java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
位于java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
位于java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
位于java.net.socksocketimpl.connect(socksocketimpl.java:392)
位于java.net.Socket.connect(Socket.java:589)
位于java.net.Socket.connect(Socket.java:538)
位于java.net.Socket。(Socket.java:434)
位于java.net.Socket。(Socket.java:211)
位于javax.net.DefaultSocketFactory.createSocket(SocketFactory.java:271)
位于org.springframework.integration.ip.tcp.connection.TcpNetClientConnectionFactory.createSocket(TcpNetClientConnectionFactory.java:76)
位于org.springframework.integration.ip.tcp.connection.TcpNetClientConnectionFactory.buildNewConnection(TcpNetClientConnectionFactory.java:49)
位于org.springframework.integration.ip.tcp.connection.AbstractClientConnectionFactory.ActainNewConnection(AbstractClientConnectionFactory.java:114)
位于org.springframework.integration.ip.tcp.connection.AbstractClientConnectionFactory.ActainConnection(AbstractClientConnectionFactory.java:77)
位于org.springframework.integration.ip.tcp.connection.AbstractClientConnectionFactory.getConnection(AbstractClientConnectionFactory.java:67)
位于org.springframework.integration.ip.tcp.connection.AbstractClientConnectionFactory.getConnection(AbstractClientConnectionFactory.java:31)
位于org.springframework.integration.ip.tcp.TcpSendingMessageHandler.getainconnection(TcpSendingMessageHandler.java:72)
位于org.springframework.integration.ip.tcp.TcpSendingMessageHandler.doWrite(TcpSendingMessageHandler.java:144)
位于org.springframework.integration.ip.tcp.TcpSendingMessageHandler.handleMessageInternal(TcpSendingMessageHandler.java:120)
位于org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78)
位于org.springframework.integration.dispatcher.AbstractDispatcher.tryoOptimizedDispatch(AbstractDispatcher.java:116)
位于org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:101)
位于org.springframework.integration.dispatcher.UnicastingDispatcher.dispatcher(UnicastingDispatcher.java:97)
位于org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77)
位于org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:287)
位于org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:245)
在(我的服务电话)
这里,在TcpNetClientConnectionFactory.buildNewConnecton()中

其内容如下:

protected TcpConnectionSupport buildNewConnection() throws IOException, SocketException, Exception {
    Socket socket = createSocket(this.getHost(), this.getPort());  //<--- Where exception is thrown
    setSocketAttributes(socket);
    TcpConnectionSupport connection = new TcpNetConnection(socket, false, this.isLookupHost(),
            this.getApplicationEventPublisher(), this.getComponentName());
    connection = wrapConnection(connection);
    initializeConnection(connection, socket);
    this.getTaskExecutor().execute(connection);
    this.harvestClosedConnections();
    return connection;
}
受保护的TcpConnectionSupport buildNewConnection()引发IOException、SocketException、Exception{

Socket Socket=createSocket(this.getHost(),this.getPort());//请查看
TcpConnectionEvent
层次结构,尤其是
TcpConnectionExceptionEvent
。并调查
TcpConnection
实现发出它的位置


请在中查找有关此问题的更多信息。

当套接字关闭时,会触发事件
tcpcConnectionFailedEvent
(它扩展了
org.springframework.integration.ip.tcp.connection.IpIntegrationEvent

以下是如何使用它:

  @EventListener
  public void handleEvent(TcpConnectionFailedEvent event) {
    // handle the event
  }

此外,在这种情况下(客户端套接字连接错误),异常将被抛出给调用方,因此正常的
错误通道处理将起作用。嗨,Gary,我已经用各种方式尝试了错误通道…(通过获取错误通道bean在xml文件和POJO中声明)两者都不起作用。控制台打印出错误通道已订阅,但在发生connectionException时从未调用它…感谢您的回复!请检查我的编辑…错误通道和tcp连接异常事件在此处均不起作用。。。
protected TcpConnection obtainConnection(Message<?> message) {
    TcpConnection connection = null;
    Assert.notNull(this.clientConnectionFactory, "'clientConnectionFactory' cannot be null");
    try {
        connection = this.clientConnectionFactory.getConnection();
    }
    catch (Exception e) {
        logger.error("Error creating connection", e);
        throw new MessageHandlingException(message, "Failed to obtain a connection", e);
    }
    return connection;
}
  @EventListener
  public void handleEvent(TcpConnectionFailedEvent event) {
    // handle the event
  }