繁体   English   中英

Dropwizard-多个端口上的资源

[英]Dropwizard - Resources on multiple ports

我有一个基于Dropwizard(v 0.7.1)的Jersey REST服务。 当前,我使用一个应用程序连接器端口(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

欣赏有人能开导。

谢谢

您的问题是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不会将自定义记录器记录到文件中

它基本上涉及实现该类,并使它对于dropwizard而言是可发现的。 之后,您所需要做的就是将yaml文件更改为指向正确的ServerFactory。

如果您不喜欢这种方法,则可以覆盖配置中的get / set方法以返回您的类。 为此,您的类必须扩展DefaultServerFactory,因为否则yaml映射将不再起作用。 您可以覆盖构建方法,尽管如此。

更新:

更详细地研究它,您将遇到第二个问题:

您的环境只有一个可以使用的球衣环境。 您将需要配置第二个Jersey环境,因为当前默认情况下,每个处理程序都将获得传递给它的相同的Jersey配置(唯一的一个)。 这就是为什么它将可用于所有http配置的原因。 因此,总而言之:

  1. 创建一个支持多种球衣配置的新环境
  2. 创建一个服务器工厂,该服务器工厂知道球衣配置属于哪个处理程序,并以该形式实例化处理程序。

我相信这两个步骤将是必需的。

在环境方面,您将必须创建自己的ServerCommand(即启动dropwizard服务器的命令)。 在EnvironmentCommand#run中查看,可以看到环境的创建位置。 这是唯一可以覆盖默认环境(据我所知)的地方,这是您需要支持多个jersey configs的操作。

老实说,看着您,我不认为这就是Dropwizard家伙的想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM