Как повторить попытку создания сервера сокетов с помощью Spring-интеграции? - PullRequest
0 голосов
/ 15 октября 2018

Ниже приведена конфигурация моего сокет-сервера.Я хочу определить резервный / аварийный порт.

Как я могу повторить попытку создания бина сокета (например, с резервным портом), если текущий порт уже используется?

Если порт аварийного переключениятакже уже используется: как я могу повторить попытку создания сокета до тех пор, пока это не удастся (например, через 5 минут)?

    @Bean
    public TcpConnectionFactoryFactoryBean factory() {
        TcpConnectionFactoryFactoryBean f = new TcpConnectionFactoryFactoryBean();
        f.setType("server");
        f.setPort(port); //I want to retry and switch that port
        f.setUsingNio(true);
        f.setSingleUse(false);
        f.setDeserializer(deserializer);
        f.setSerializer(serializer);
        return f;
    }

    @Bean
    public TcpInboundGateway server(
            TcpConnectionFactoryFactoryBean factory,
            MessageChannel serverChannel) throws Exception {
        TcpInboundGateway g = new TcpInboundGateway();
        g.setConnectionFactory(factory.getObject());
        g.setRequestChannel(serverChannel);
        return g;
    }

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Надежнее прослушивать порт 0, чтобы операционная система выбирала доступный порт.

0 голосов
/ 15 октября 2018

Spring предоставляет служебный класс SocketUtils, который предоставляет несколько методов для работы с сокетами.

Один из полезных для вас может быть SocketUtils.html # findAvailableTcpPort , который принимаетвходные параметры, minPort и maxPort, и вернут вам доступный порт TCP в диапазоне [minPort, maxPort] .Вы можете вызвать этот метод для своих портов, и если они являются последовательными, вы можете просто использовать тот, который возвращает метод.В случае, если порты не являются последовательными, вам нужно будет сопоставить возвращаемый порт с вашим.

@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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...