我正在尝试使用带有Java SE 7和Guice 的javax.batch 1.0进行批处理。
阅读关于JSR-352的JavaEE 7文档,他们显然设置了要在Glassfish中执行的代码,我没有提到如何在外面运行它。
现在我的问题是关于JobContext接口,它应该通过CDI自动注入:如何使用Guice进行创建?尝试类似的事情:
@Provides
@Inject
JobContext providesJobContext(Provider<JobContext> provider) {
return provider.get()
}
在概念上是错误的,它导致StackOverflowError(所以我在这里:&gt;)。 真的有必要吗?示例将其注入以访问“作业”属性。我可以通过
与他们联系jobOperator.getParameters(<executionID>)
谢谢。
我从未使用过Weld(根据我的理解,它会在Java SE上提供CDI),所以唯一的选择就是Spring Batch。
答案 0 :(得分:2)
首先,澄清&#34;工作属性&#34;和&#34;工作参数&#34;。
&#34;工作参数&#34;是传递给JobOperator#start(String,Properties)
和JobOperator#restart(long,Properties)
的属性。
&#34;工作属性&#34;可通过JobContext#getProperties()
访问的是 / job / properties 元素的子元素。
E.g。此作业在返回的对象中有两个属性:JobContext#getProperties()
<job>
<properties>
<property name="initialAmount" value="100" />
<property name="bonusAmount" value="#{jobParameters['bonusAmount']}?:100;" />
</properties>
</job>
因此,作业参数只是作业属性定义的一个可能的值来源。
就访问参数JobOperator.getParameters(long executionId)
而言,这可能对您没有多大帮助,因为获取当前执行ID的最自然方式来自于您在注入时遇到问题的相同环境
听起来你指的是JSR 352参考实现( jbatch ,包含在Glassfish中)。
确实,我们没有考虑使用Guice依赖注入来深入思考SE,而且我还不足以知道这是否有助于提及。
使用Weld,在Glassfish中我们实际上使用这样的技术来允许批处理运行时填充批处理定义的注入点。
public class BatchProducerBean {
...
@Produces
@Dependent
public JobContext getJobContext() {
...
return JobContextImpl;
}
}
我很高兴听到有关Guice与jbatch整合的更多信息。你可以在家里跟进项目来源(还没有真正的Wiki)on GitHub
答案 1 :(得分:1)
Weld是JSR-299的参考实现,它在JavaEE 6中引入了CDI。 此参考实现包含在Glassfish中,因此您可以有效地使用它。
Oracle的示例找到here:
@Named
public class SimpleItemReader
extends AbstractItemReader {
@Inject
private JobContext jobContext;
...
}
引用:
我从未使用过Weld
这里的实现并不重要,因为它只是实现了JSR的规范。