Google Guice 独立批次中的 JSR-352
-
21-12-2019 - |
题
我正在尝试做一个 使用 javax.batch 1.0 与 Java SE 7 和 Guice 进行批处理.
阅读有关 JSR-352 的 JavaEE 7 文档,他们显然设置了要在 Glassfish 中执行的代码,但我发现没有提及如何在外部运行它。
现在 我的问题是关于 JobContext 接口,它应该通过 CDI 自动注入:如何用 Guice 制作它?尝试类似的事情:
@Provides
@Inject
JobContext providesJobContext(Provider<JobContext> provider) {
return provider.get()
}
在概念上是错误的,它会导致 StackOverflowError (所以我在这里:>)。真的有必要吗?示例注入它以访问 Job 属性。也许我可以通过
jobOperator.getParameters(<executionID>)
?
谢谢。
我从未使用过 Weld(据我所知,它会在 Java SE 上提供 CDI),因此唯一的替代方案是 Spring Batch。
解决方案
接口说明
首先,明确“作业属性”和“作业参数”。
“作业参数”是 特性 传递给 JobOperator#start(String,Properties)
和 JobOperator#restart(long,Properties)
.
“工作属性”可通过 JobContext#getProperties()
是的孩子 /工作/属性 元素。
例如。该作业在返回的对象中有两个属性: JobContext#getProperties()
<job>
<properties>
<property name="initialAmount" value="100" />
<property name="bonusAmount" value="#{jobParameters['bonusAmount']}?:100;" />
</properties>
</job>
因此,作业参数只是作业属性定义的一种可能的值源。
就访问参数而言, JobOperator.getParameters(long executionId)
, ,这可能对您没有多大帮助,因为获取当前执行 id 的最自然方法是来自您注入时遇到问题的同一上下文。
与吉斯一起SE
听起来您指的是 JSR 352 参考实现(批处理, ,包含在 Glassfish 中)。
确实,我们没有对 Guice 依赖注入的 SE 给予太多的考虑,而且我还不是一个足够的专家,不知道这是否有助于提及。
通过 Weld,在 Glassfish 中我们实际上使用了这样的技术来允许批处理运行时填充批处理定义的注入点。
public class BatchProducerBean {
...
@Produces
@Dependent
public JobContext getJobContext() {
...
return JobContextImpl;
}
}
我很高兴听到更多有关 Guice 与 jbatch 集成的信息。您可以在家中跟进项目源代码(还没有真正的 Wiki) 在 GitHub 上
其他提示
Weld是JSR-299的参考实现,它在Javaee 6中带来了CDI。 此参考实现包含在GlassFish中,因此您可以有效地使用它。
来自Oracle的示例在这里:
@Named
public class SimpleItemReader
extends AbstractItemReader {
@Inject
private JobContext jobContext;
...
}
.
quote:
我从未使用焊接
这里的实施无关紧要,因为它只是实现了JSR的规范。