Как динамически найти доступный порт в Spring Boot, когда настроенный порт уже используется?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как динамически найти доступный порт в Spring Boot, когда настроенный порт уже используется?

Сообщение Anonymous »

Я строю стартер пружинного загрузки и хочу, чтобы он автоматически пробовал порты последовательно (8080, 8081 и т. Д.) Когда порт по умолчанию уже используется, вместо сбоя.
Я знаю Server.port = 0 Выбирает случайный порт, но это неудобно для развития. />

Код: Выделить всё

@Bean

public ApplicationListener logWhenReadyEvent(LoggingProperties properties, Environment environment) {

return event -> {

String port = environment.getProperty("server.port", "8080");

// Log server URL

};

}

< /code>
 попытался сделать это таким образом < /h2>

@Component

public class PortFinder implements ApplicationListener {

@Override

public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {

// Try to set available port - doesn't work

}

}

< /code>
Спасибо за предложение. Мне нужно поймать BindException < /code>
добавить его в качестве боба. Мои приложения теперь автоконфигурированы для динамического изменения своих портов. Спасибо! Кредиты < /p>
 Рабокое решение < /h3>
@Bean
public WebServerFactoryCustomizer webServerFactoryCustomizer() {
return new SpringPortSolver();
}

public static class SpringPortSolver implements WebServerFactoryCustomizer {
private static final Logger logger = LoggerFactory.getLogger(SpringPortSolver.class);

@Value("${server.port:8080}")
String serverPort;

@Override
public void customize(ConfigurableWebServerFactory factory) {
int port;
try {
port = Integer.parseInt(serverPort);
} catch (NumberFormatException e) {
logger.error("Invalid server.port value: {}. Using default port 8080 instead.", serverPort);
port = 8080;
}

int originalPort = port;
int maxPortToTry = port + 100; // Limit how far we'll search to avoid infinite loops

logger.info("Attempting to find available port starting from {}", port);

while (port < maxPortToTry) {
try (ServerSocket socket = new ServerSocket()) {
// Use bind with InetSocketAddress to better handle binding issues
socket.setReuseAddress(true);
socket.bind(new InetSocketAddress("localhost", port));

int availablePort = socket.getLocalPort();
logger.info("Port {} is available. Using port {} for server.", availablePort, availablePort);
factory.setPort(availablePort);
return;
} catch (BindException e) {
logger.warn("Port {} is already in use. Trying port {} instead.", port, port + 1);
port += 1;
} catch (IOException e) {
logger.error("Failed to test port {}: {}", port, e.getMessage());
// Try next port anyway
port += 1;
}
}

// If we've exhausted all ports in our range, use a random port
logger.warn("Unable to find available port in range {}-{}. Using random port instead.", originalPort, maxPortToTry);
factory.setPort(0);
}
}
log


Подробнее здесь: https://stackoverflow.com/questions/796 ... igured-por
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»