我有一个基于Jersey REST服务的Dropwizard(v 0.7.1)。目前我使用一个应用程序连接器端口(8810),我有两个资源(比如" / path1"," / path2")。
我将能够分别以http:\\ localhost:8810 \ path1和http:\\ localhost:8810 \ path2的形式访问这些资源。我们想要实现的是每个资源都有一个单独的端口。 (例如http:\\ localhost:8810 \ path1和http:\\ localhost:8820 \ path2)。我调整了yaml文件以具有以下配置,当我启动应用程序时,两个端口都可以使用这两个资源,并且不确定如何配置这些资源以使用特定端口,或者甚至可以使用Dropwizard?
server:
applicationConnectors:
-
type: http
port: 8810
-
type: http
port: 8820
感谢有人可以启发。
由于
答案 0 :(得分:4)
你的问题是DefaultServerFactory将所有applicationConntectors添加到同一个Handler,参见DefaultServerFactory #build:
@Override
public Server build(Environment environment) {
printBanner(environment.getName());
final ThreadPool threadPool = createThreadPool(environment.metrics());
final Server server = buildServer(environment.lifecycle(), threadPool);
LOGGER.info("Registering jersey handler with root path prefix: {}", applicationContextPath);
environment.getApplicationContext().setContextPath(applicationContextPath);
final Handler applicationHandler = createAppServlet(server,
environment.jersey(),
environment.getObjectMapper(),
environment.getValidator(),
environment.getApplicationContext(),
environment.getJerseyServletContainer(),
environment.metrics());
LOGGER.info("Registering admin handler with root path prefix: {}", adminContextPath);
environment.getAdminContext().setContextPath(adminContextPath);
final Handler adminHandler = createAdminServlet(server,
environment.getAdminContext(),
environment.metrics(),
environment.healthChecks());
final RoutingHandler routingHandler = buildRoutingHandler(environment.metrics(),
server,
applicationHandler,
adminHandler);
server.setHandler(addStatsHandler(addRequestLog(server, routingHandler, environment.getName())));
return server;
}
您需要做的是实现自己的ServerFactory。
您可以扩展DefaultServerFactory并覆盖构建方法,以便按照您希望的方式设置连接器。 据推测,您可能希望添加一些更多的配置来指示发生了什么,因为就您的yaml而言,将资源映射到特定连接器是不可能的。 dropwizard怎么会知道这件事。
要覆盖dropwizard的行为(添加新的ServerFactory),您可以看到我写的关于添加日志记录的帖子:Dropwizard doesn't log custom loggers to file
它基本上涉及实现类并使其可以被dropwizard发现。之后,您需要做的就是将yaml文件更改为指向正确的ServerFactory。
如果您不喜欢这种方法,可以在配置上覆盖get / set方法以返回您的课程。为此,您的类必须扩展DefaultServerFactory,否则yaml映射将不再起作用。无论如何,您都可以覆盖构建方法。
更新
更详细地看一下,你会遇到第二个问题:
您的环境只有一个可以使用的平针织环境。 您将需要配置第二个球衣环境,因为默认情况下,每个Handler将获得传递给它的相同Jersey配置(唯一存在的配置)。这就是为什么它可用于您的所有http配置。总结如下:
我相信这两个步骤是必需的。
就环境而言,您必须创建自己的ServerCommand(即启动dropwizard服务器的命令)。 查看EnvironmentCommand#run,您可以看到环境的创建位置。这是唯一可以覆盖默认环境的地方(据我所知),这是你需要做的,以支持多个球衣配置。
老实说,看着这个,我不相信这就是那些dropwizard家伙的想法。