Java TcpConnectionFactoryFactoryBean:同时使用SslContextSupport和SocketFactorySupport

Java TcpConnectionFactoryFactoryBean:同时使用SslContextSupport和SocketFactorySupport,java,spring,spring-integration,Java,Spring,Spring Integration,我正在使用TCPConnectionFactoryBean(用于客户端、非NIO连接),并希望通过两种方式修改SSL套接字连接: 1/仅使用TLS1.2协议 我通过调用TcpConnectionFactoryFactoryBean.setSslContextSupport()并提供一个带有TLSv1.2协议集的DefaultTcpSSLContextSupport对象来实现这一点 及 2/设置套接字连接超时 我通过调用TcpConnectionFactoryFactoryBean.setSock

我正在使用TCPConnectionFactoryBean(用于客户端、非NIO连接),并希望通过两种方式修改SSL套接字连接:

1/仅使用TLS1.2协议 我通过调用TcpConnectionFactoryFactoryBean.setSslContextSupport()并提供一个带有TLSv1.2协议集的DefaultTcpSSLContextSupport对象来实现这一点

2/设置套接字连接超时 我通过调用TcpConnectionFactoryFactoryBean.setSocketFactorySupport()并提供TcpSocketFactorySupport的自定义子类来实现这一点,该子类创建套接字,然后在连接调用中应用超时。这项技术已被记录在案


我有两个独立的工作,但不能让他们一起工作。查看TcpConnectionFactoryFactoryBean代码,很明显,获取SocketFactorySupport()方法将只选择一个。因此,我认为我的做法是错误的。有人能提供一些指导吗

我想我已经将它合并到一个SocketFactorySupport类中,该类子类为DefaultTcpNetSSLSocketFactorySupport,然后与TcpConnectionFactoryFactoryBean.setSocketFactorySupport()调用一起使用。我的子类如下所示,将DefaultTcpSSLContextSupport(带有协议集)和timeout传递给构造函数:

public class MySSLSocketFactorySupport extends DefaultTcpNetSSLSocketFactorySupport {

    private final int connectTimeout;

    public MySSLSocketFactorySupport(TcpSSLContextSupport sslContextSupport, int connectTimeout) {
        super(sslContextSupport);
        this.connectTimeout = connectTimeout;
    }

    @Override
    public ServerSocketFactory getServerSocketFactory() {
        throw new UnsupportedOperationException("This does not support server sockets");
    }

    @Override
    public SocketFactory getSocketFactory() {
        return new PostilionSocketFactory();
    }

    private class PostilionSocketFactory extends SocketFactory {

        private final SocketFactory delegate = MySSLSocketFactorySupport.super.getSocketFactory();

        @Override
        public Socket createSocket() throws IOException {
            return delegate.createSocket();
        }

        @Override
        public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
            Socket socket = this.delegate.createSocket();
            socket.connect(new InetSocketAddress(host, port), connectTimeout);
            return socket;
        }

        @Override
        public Socket createSocket(InetAddress host, int port) throws IOException {
            Socket socket = this.delegate.createSocket();
            socket.connect(new InetSocketAddress(host, port), connectTimeout);
            return socket;
        }

        @Override
        public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
            Socket socket = this.delegate.createSocket();
            socket.bind(new InetSocketAddress(localHost, localPort));
            socket.connect(new InetSocketAddress(host, port), connectTimeout);
            return socket;
        }

        @Override
        public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
            Socket socket = this.delegate.createSocket();
            socket.bind(new InetSocketAddress(localAddress, localPort));
            socket.connect(new InetSocketAddress(address, port), connectTimeout);
            return socket;
        }

    }

}

因此,您的解决方案是正确的。提供自定义的
TcpSocketFactorySupport
时,必须在该支持中提供
SslContext