Dropwizard注册两个类/客户端

时间:2017-07-04 07:00:16

标签: java jersey dropwizard

我有两个客户端具有不同的配置我正在创建(超时,线程池等等),并希望在两个客户端上利用Dropwizard的指标。

        final JerseyClientBuilder jerseyClientBuilder = new JerseyClientBuilder(environment)
            .using(configuration.getJerseyClientConfiguration());

        final Client config1Client = jerseyClientBuilder.build("config1Client");
        environment.jersey().register(config1Client);

        final Client config2Client = jerseyClientBuilder.build("config2Client");
        environment.jersey().register(config2Client);

然而,我正在

org.glassfish.jersey.internal.Errors: The following warnings have been detected: 
HINT: Cannot create new registration for component type class org.glassfish.jersey.client.JerseyClient: 
Existing previous registration found for the type.

只显示一个客户的指标。

如何跟踪两个客户的指标,或者在单个dropwizard应用中拥有2个客户端并不常见?

2 个答案:

答案 0 :(得分:1)

没关系,原来我是个白痴(试图在ClientBuilder上保存一些资源)。

我用原始代码做错了2件事: 1.您不需要注册Jersey客户端,只需要资源就足够了...不知怎的,我错过了我的代码中的资源部分,只是直接尝试注册客户端 2.您需要显式构建每个JerseyClientBuilder,然后构建单独配置的客户端,然后dropwizard将按每个JerseyClientBuilder的指标获取

最后,我只需将代码更改为以下内容:

    final Client config1Client = new JerseyClientBuilder(environment)
        .using(configuration.getJerseyClientConfiguration()).build("config1Client");


    final Client config2Client = new JerseyClientBuilder(environment)
        .using(configuration.getJerseyClientConfiguration()).build("config2Client");

卫生署。

答案 1 :(得分:0)

environment.jersey().register()有一个Adds the given object as a Jersey singleton component的javadoc列表,这意味着注册的对象成为了jersey依赖注入框架的一部分。具体来说,此方法用于向泽西上下文添加资源类,但是可以通过这种方式添加具有Jersey查找的注释或类型的任何对象。此外,由于它们是单身人士,因此每个具体类型只能有一个(这就是为什么你从泽西岛获得“以前的注册”错误)。

我想你想让两个Jersey客户端通过REST / HTTP连接到两个不同的外部服务。由于您的服务需要与其他人交谈以执行 工作,因此您希望在执行“工作”或业务逻辑的任何地方都可以访问客户端。

例如,this guide会创建一个资源类,该类需要客户端与外部http服务进行货币转换。我不是说这是一个很好的例子(只是dropwizard external client example的顶级谷歌结果)。事实上,我认为构建应用程序并不好。我创建了几个内部对象,它们从资源类中隐藏了如何获取货币信息,如业务对象(BO)或数据访问对象(DAO)等。

对于您的情况,您可能需要这样的东西(将它们视为构造函数调用)。 JC =泽西客户端,R =资源对象,BO =业务逻辑对象

JC1()
JC2()
B1(JC1)
B2(JC2)
R1(B1)
R2(B2)
R3(B1, B2)
environment.jersey().register(R1)
environment.jersey().register(R2)
environment.jersey().register(R3)

official Dropwizard docs有点帮助。他们至少解释了如何创建一个球衣客户端;他们没有解释如何构建您的应用程序。

如果您正在使用dropwizard 中的Jersey客户端构建器,则应自动注册您创建的每个客户端以记录度量标准。确保您使用dropwizard-client工件和包io.dropwizard.client中的客户端构建器。 (看起来你是因为你有using(config)方法。)