Я строю стартер пружинного загрузки и хочу, чтобы он автоматически пробовал порты последовательно (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);
}
}
Я строю стартер пружинного загрузки и хочу, чтобы он автоматически пробовал порты последовательно (8080, 8081 и т. Д.) Когда порт по умолчанию уже используется, вместо сбоя. Я знаю Server.port = 0 Выбирает случайный порт, но это неудобно для развития. /> [code] @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); } } [/code] log
Я строю стартер пружинного загрузки и хочу, чтобы он автоматически пробовал порты последовательно (8080, 8081 и т. Д.) Когда порт по умолчанию уже используется, вместо сбоя.
Я знаю Server.port = 0 Выбирает случайный порт, но это неудобно для...
В .NET 9 я создал проект веб-приложения Blazor по умолчанию и добавил концентратор SignalR, который используется для отправки уведомлений между клиентами.
Когда один сеанс увеличивает значение / counter, все сеансы уведомляются об этом и обновляют...
В .NET 9 я создал проект веб-приложения Blazor по умолчанию и добавил концентратор SignalR, который используется для отправки уведомлений между клиентами.
Когда один сеанс увеличивает значение / counter, все сеансы уведомляются об этом и обновляют...
Я пытаюсь автоматически обновить приложение Android с помощью URL-адреса, но получаю сообщение об ошибке: java.lang.IllegalArgumentException: не удалось найти настроенный корень, содержащий /file:/storage/emulated/0/Download
Я следую этому ответу...
Я пытаюсь автоматически обновить приложение Android с помощью URL-адреса, но получаю сообщение об ошибке: java.lang.IllegalArgumentException: не удалось найти настроенный корень, содержащий /file:/storage/emulated/0/Download
Я следую этому ответу...