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