Java 如何使用spring集成重试套接字服务器创建?

Java 如何使用spring集成重试套接字服务器创建?,java,spring,sockets,spring-boot,spring-integration,Java,Spring,Sockets,Spring Boot,Spring Integration,下面是我的套接字服务器配置。我想定义一个回退/故障转移端口 如果当前端口已经在使用中,我如何重试套接字bean创建(例如使用备用端口) 如果故障转移端口也已在使用中:如何重试套接字创建,直到成功为止(例如5分钟) Spring提供了一个名为SocketUtils的实用程序类,它公开了一些使用套接字的方法 一个对您有用的方法是输入参数,minPort和maxPort,并返回a范围[minPort,maxPort]内的可用tcp端口。您可以为您的端口调用此方法,如果它们是连续的,您可以只使用该方法返

下面是我的套接字服务器配置。我想定义一个回退/故障转移端口

如果当前端口已经在使用中,我如何重试套接字bean创建(例如使用备用端口)

如果故障转移端口也已在使用中:如何重试套接字创建,直到成功为止(例如5分钟)


Spring提供了一个名为
SocketUtils
的实用程序类,它公开了一些使用套接字的方法

一个对您有用的方法是输入参数,
minPort
maxPort
,并返回a范围[minPort,maxPort]内的可用tcp端口。您可以为您的端口调用此方法,如果它们是连续的,您可以只使用该方法返回的端口。如果端口不连续,则需要将返回的端口与您的端口匹配

@Bean
public TcpConnectionFactoryFactoryBean factory(LengthHeaderDeserializer deserializer) throws Exception {
    CompletableFuture.runAsync(() -> waitForSocket(port)).get(5, TimeUnit.MINUTES);

    TcpConnectionFactoryFactoryBean fact = new TcpConnectionFactoryFactoryBean();
    ....
}

private void waitForSocket(int port) {
    do {
        try {
            SocketUtils.findAvailableTcpPort(port, port);
            return;
        } catch (Exception e) {
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e1) {
                return;
            }
        }
    } while (true);
}

监听端口0更可靠,以便操作系统选择一个可用端口。

因此,分配一个随机端口对您有用吗?不,我想要一个主端口和一个故障切换端口。只有这两个是有效的。我想重试这两个,直到其中一个成功。好的,spring尝试打开该端口上的套接字,然后直接关闭它。测试可用性。在创建
TcpConnectionFactoryFactoryBean
之前,我可能会使用它来等待空闲端口。我刚刚添加了一个示例,说明如何使用
SocketUtils
解决它,只是为了完整性。@membersound很棒。虽然这在一般情况下可能是正确的,但我必须使用我无法控制的固定端口号。因此,我没有机会使用不同的/选择的系统。
@Bean
public TcpConnectionFactoryFactoryBean factory(LengthHeaderDeserializer deserializer) throws Exception {
    CompletableFuture.runAsync(() -> waitForSocket(port)).get(5, TimeUnit.MINUTES);

    TcpConnectionFactoryFactoryBean fact = new TcpConnectionFactoryFactoryBean();
    ....
}

private void waitForSocket(int port) {
    do {
        try {
            SocketUtils.findAvailableTcpPort(port, port);
            return;
        } catch (Exception e) {
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e1) {
                return;
            }
        }
    } while (true);
}