4
我正在使用dropwizard 0.7.1版。它被配置爲使用「隨機」(短暫?)端口(server.applicationConnectors.port = 0)。我想知道啓動後真正使用的端口,但是我找不到任何信息如何做到這一點。如何以編程方式在Dropwizard中獲取應用程序端口
我正在使用dropwizard 0.7.1版。它被配置爲使用「隨機」(短暫?)端口(server.applicationConnectors.port = 0)。我想知道啓動後真正使用的端口,但是我找不到任何信息如何做到這一點。如何以編程方式在Dropwizard中獲取應用程序端口
您可以從生命週期偵聽器獲取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()
}
}
}
});
}
我發現這種方法在Dropwizard中同時適用於Simple和Default服務器配置。
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);
}