Как программно получить порт приложения в Dropwizard

Я использую dropwizard версии 0.7.1. Он настроен на использование «случайного» (эфемерного?) порта (server.applicationConnectors.port=0). Я хочу узнать, какой порт действительно используется после запуска, но я не могу найти никакой информации, как это сделать.


person tomekK    schedule 28.08.2014    source источник


Ответы (2)


Вы можете получить обратный вызов serverStarted от прослушивателя жизненного цикла, чтобы понять это.

@Override
public void run(ExampleConfiguration configuration, Environment environment) throws Exception {
  environment.lifecycle().addServerLifecycleListener(new ServerLifecycleListener() {
    @Override
    public void serverStarted(Server server) {
      for (Connector connector : server.getConnectors()) {
        if (connector instanceof ServerConnector) {
          ServerConnector serverConnector = (ServerConnector) connector;
          System.out.println(serverConnector.getName() + " " + serverConnector.getLocalPort());
          // Do something useful with serverConnector.getLocalPort()
        }
      }
    }
  });
}
person condit    schedule 28.08.2014
comment
Начиная с Dropwizard 1.1.0, ServerLifecycleListener предоставляет удобный метод getLocalPort(), см. эту фиксацию . - person Philip Potter; 20.11.2020

Я считаю, что этот подход хорошо сработал для меня как с простой конфигурацией сервера, так и с конфигурацией сервера по умолчанию в Dropwizard.

public void run(ExampleConfiguration configuration, Environment environment) throws Exception {

    Stream<ConnectorFactory> connectors = configuration.getServerFactory() instanceof DefaultServerFactory
            ? ((DefaultServerFactory)configuration.getServerFactory()).getApplicationConnectors().stream()
            : Stream.of((SimpleServerFactory)configuration.getServerFactory()).map(SimpleServerFactory::getConnector);

    int port = connectors.filter(connector -> connector.getClass().isAssignableFrom(HttpConnectorFactory.class))
            .map(connector -> (HttpConnectorFactory) connector)
            .mapToInt(HttpConnectorFactory::getPort)
            .findFirst()
            .orElseThrow(IllegalStateException::new);
}
person Michael Barnwell    schedule 29.01.2018
comment
Работает :), а также я не понял решения @condit для получения локального порта. Не нашел никакого метода для вызова getLocalPort(). - person siddhusingh; 12.03.2018