gpt4 book ai didi

java - Dropwizard quartz 作业不适用于 Guicey

转载 作者:行者123 更新时间:2023-11-30 02:13:59 25 4
gpt4 key购买 nike

我正在使用 dropwizard 1.0.5、dropwizard-guicey 4.0.1 ( https://github.com/xvik/dropwizard-guicey )、spinscalequartz 实现 3.0.0 ( https://github.com/spinscale/dropwizard-jobs )。

我希望能够将我的依赖项注入(inject)到quartz/spinscale 创建的作业实例中。为此,我尝试加载以下库 https://github.com/spinscale/dropwizard-jobs/tree/master/dropwizard-jobs-guice

问题是,当创建 Guice dropwizard 作业包时,Guice 注入(inject)器尚未初始化,因此我得到一个 NPE。

示例:MyApplication.java

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

// Initialize Guice for dependency injection

GuiceBundle guiceBundle = GuiceBundle.builder()
.bindConfigurationInterfaces()
.enableAutoConfig(getClass().getPackage().getName())
.modules(new MyModule(bootstrap.getMetricRegistry()))
.build();
bootstrap.addBundle(guiceBundle);

bootstrap.addBundle(new GuiceJobsBundle(guiceBundle.getInjector()));

异常(exception):

Exception in thread "main" java.lang.NullPointerException: Guice not initialized
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:226)

为了解决这个问题,我尝试创建我自己的 GuiceJobsBundle 版本,它接受 GuiceBundle 并且直到 bundle.run( ) 被调用。但我还是得到了 NPE。

我的应用程序

  @Override
public void initialize(Bootstrap<MyConfiguration> bootstrap) {
// Substitute environment variable references in the configuration file
bootstrap.setConfigurationSourceProvider(new SubstitutingSourceProvider(
bootstrap.getConfigurationSourceProvider(),
new EnvironmentVariableSubstitutor(false, true)
));

// Initialize Guice for dependency injection

GuiceBundle guiceBundle = GuiceBundle.builder()
.bindConfigurationInterfaces()
.enableAutoConfig(getClass().getPackage().getName())
.modules(new MyModule(bootstrap.getMetricRegistry()))
.build();
bootstrap.addBundle(guiceBundle);

bootstrap.addBundle(new GuiceyJobsBundle(guiceBundle));
}

GuiceyJobsBundle

public class GuiceyJobsBundle extends JobsBundle {

private GuiceBundle guiceBundle;

public GuiceyJobsBundle(GuiceBundle guiceBundle) {
this.guiceBundle = guiceBundle;
}

@Override
public void run(Environment environment) {
JobManager jobManager = new GuiceJobManager(guiceBundle.getInjector());
environment.lifecycle().manage(jobManager);
}
}

何时调用包的 run() 方法?有人找到了可行的解决方案吗?

最佳答案

你对最后一个修复几乎是正确的,你只是忘记绑定(bind)配置jobManager.configure(configuration)(这就是抛出NPE的原因)。

但是您完全可以在没有捆绑的情况下进行集成。我发现您已经使用了类路径扫描,因此只需将这些扩展放在某处即可:

@Singleton
public class JobsManager extends GuiceJobManager {

@Inject
public JobsManager(Injector injector, JobsAppConfiguration configuration) {
super(injector);
configure(configuration);
}
}

这将被识别为 Manged bean 并将启动/停止quartz上下文。它在内部搜索已注册的 guice bindngs 中的作业(使用 dropwizard-jobs 逻辑)。

public class JobsInstaller implements FeatureInstaller<Job>, TypeInstaller<Job> {

private final Reporter reporter = new Reporter(JobsInstaller.class, "jobs =");

@Override
public boolean matches(Class<?> type) {
return FeatureUtils.is(type, Job.class);
}

@Override
public void install(Environment environment, Class<Job> type) {
// here we can also look for class annotations and show more info in console
// (omitted for simplicity)
reporter.line("(%s)", type.getName());
}

@Override
public void report() {
reporter.report();
}
}

此安装程序只是将所有作业绑定(bind)到 guice 上下文,以便 JobsManager 可以安装它们(只是为了避免手 Action 业绑定(bind))。

我将竞争示例添加到 guicey-examples 存储库中:https://github.com/xvik/dropwizard-guicey-examples/tree/master/dropwizard-jobs

关于java - Dropwizard quartz 作业不适用于 Guicey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49204103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com