Регистрация ресурсов в Dropwizard

Я не могу зарегистрировать несколько ресурсов в методе run() моего приложения Dropwizard. Когда я это делаю, я получаю следующее исключение:

Exception in thread "main" MultiException[java.lang.IllegalArgumentException: A metric named io.dropwizard.db.ManagedPooledDataSource.postgresql.active already exists, java.util.concurrent.RejectedExecutionException: org.eclipse.jetty.util.thread.NonBlockingThread@27f74733]
at org.eclipse.jetty.server.Server.doStart(Server.java:329)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at io.dropwizard.cli.ServerCommand.run(ServerCommand.java:43)
at io.dropwizard.cli.EnvironmentCommand.run(EnvironmentCommand.java:43)
at io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:76)
at io.dropwizard.cli.Cli.run(Cli.java:70)
at io.dropwizard.Application.run(Application.java:73)
at com.xxx.xxx.yyy.GobblerHTTPApplication.main(GobblerHTTPApplication.java:19)

person Amith Gopal    schedule 22.04.2015    source источник
comment
можешь добавить свой код?   -  person Manikandan    schedule 22.04.2015
comment
Также могут быть полезны такие сведения, как версия используемого вами dropwizard.   -  person Edd    schedule 27.04.2015


Ответы (2)


Кажется, вы дважды инициализируете экземпляры Postgres для каждого ресурса, который не требуется. Вы можете просто сначала инициализировать все свои магазины и т. д., а затем зарегистрировать свои ресурсы. Сделайте это примерно так: -

    /* Service manager */
    environment.lifecycle().manage(new XYZServiceManager());

    /* Adding Resources */
    environment.jersey().register(new FirstResource());
    environment.jersey().register(new SecondResource());

Надеюсь, это решит вашу проблему.

person hatellla    schedule 30.04.2015

если вы случайно запустили базы данных с помощью Hibernate, например. используя следующий фрагмент кода в основном приложении (дважды):

private final HibernateBundle<Cfg> hib1 = new HibernateBundle<Cfg>(ImmutableList.of(SomeHibernateModel.class), new SessionFactoryFactory()) {
    @Override
    public DataSourceFactory getDataSourceFactory(Cfg configuration) {
        return configuration.getDatabaseFactory();
    }
};

тогда полезно перезаписать другой метод: метод «name()». Этот метод является исходным для предоставления последней части имени вашей метрики (часть ´.postgresql.active ´). как это:

private final HibernateBundle<Cfg> hib1 = new HibernateBundle<Cfg>(ImmutableList.of(SomeHibernateModel.class), new SessionFactoryFactory()) {
    @Override
    public DataSourceFactory getDataSourceFactory(Cfg configuration) {
        return configuration.getDatabaseFactory();
    }
    @Override
    protected String name() {
        return "hibernate.accesslog";
    }

};
person helt    schedule 08.08.2015
comment
Этот подход отлично сработал для меня, спасибо за совет. - person stve; 15.10.2015
comment
@stve Помните, что --- если вы собираетесь использовать @UnitOfWork -- у вас будет сеанс только для одного из них. Эта проблема была поднята на github.com/dropwizard/dropwizard/issues/1217 и были объединены всего несколько дней назад. Так что это может быть еще не исправлено в вашей версии - person helt; 15.10.2015
comment
спасибо, что указали мне на эту проблему. Как вы указали, у меня проблемы с @UnitOfWork. К счастью, похоже, скоро выйдет версия 0.9.0. - person stve; 16.10.2015