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);
}