- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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/
我是一名优秀的程序员,十分优秀!