我正在尝试为 Dropwizard 创建一个计划作业,该作业每分钟运行一次并查询数据库中的值。

为此,我需要在 initialize() 阶段注册一些 DAO 和服务,如下所示:

@Override
public void initialize(final Bootstrap<KMDServiceConfiguration> bootstrap) {

    //JDBI
    final DBIFactory factory = new DBIFactory();
    final DateTimeArgumentFactory dateTimeFactory = new DateTimeArgumentFactory();
    final DBI jdbi = factory
            .build(environment, config.getDataSourceFactory(), "kmd");
    jdbi.registerArgumentFactory(dateTimeFactory);

    //DAOs
    final UserDao userDao = jdbi.onDemand(UserDao.class);
    final NotificationDao notificationDao = jdbi.onDemand(NotificationDao.class);

    //Domain services
    final UserService userService = new UserServiceImpl(userDao);
    final NotificationService notificationService = new NotificationServiceImpl(notificationDao);

    final MessageService messageService = new MessageServiceImpl(userService, notificationService);


    final Job worker= new MessageWorker(messageService);
    bootstrap.addBundle(new JobsBundle(worker));

JDBI 需要 Dropwizard environment 和配置对象。

是否可以在此阶段访问这些以便正确设置我的依赖项?

最佳答案

您应该能够从 DW Application 类中的“run”方法初始化作业,该类可以访问配置和环境属性。我已经整理了一个简单的 project 来展示这一点,但这是 run 方法的样子:

@Override
public void run(SOQ49638642Configuration configuration, Environment environment) throws Exception {

    final DBI dbi = (new DBIFactory()).build(environment, configuration.getDataSourceFactory(), "kmd");

    final SOQ49638642Job soq49638642Job = new SOQ49638642Job(new SOQ49638642Service(dbi.onDemand(SOQ49638642Dao.class)));

    final JobsBundle jobsBundle = new JobsBundle(soq49638642Job);

    jobsBundle.run(configuration, environment);
}

据我所知,不可能在“初始化”阶段获得这些对象。您还可以查看 DW 的 Guice 集成,例如 dropwizard-guicey,它为 DW 中的捆绑包和模块的 DI 提供了很好的机制。

10-07 19:43
查看更多