0

我正在尝试使用 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。

4

2 回答 2

2

API解释

首先,明确“作业属性”和“作业参数”之间的关系。

“作业参数”是 传递给和 的属性JobOperator#start(String,Properties)JobOperator#restart(long,Properties)

可访问的“作业属性”JobContext#getProperties()/job/properties元素的子元素。

例如,该作业在返回的对象中有两个属性:JobContext#getProperties()

<job>
   <properties>
    <property name="initialAmount" value="100" />
    <property name="bonusAmount" value="#{jobParameters['bonusAmount']}?:100;" />
   </properties>
</job>

因此,作业参数只是作业属性定义的一种可能的值来源。

就访问参数而言JobOperator.getParameters(long executionId),这可能对您没有多大帮助,因为获取当前执行 ID 的最自然方法是来自您在注入时遇到问题的同一上下文。

SE with Guice

听起来您指的是 JSR 352 参考实现(jbatch,包含在 Glassfish 中)。

确实,我们并没有对带有 Guice 依赖注入的 SE 给予太多考虑,而且我还不足以知道这是否有助于提及。

使用 Weld,在 Glassfish 中,我们实际上使用了这样的技术来允许批处理运行时填充批处理定义的注入点。

public class BatchProducerBean {
...
@Produces
@Dependent
public JobContext getJobContext() {
    ...
        return JobContextImpl;
    }
}

我很高兴听到更多关于 Guice 与 jbatch 集成的信息。您可以在家中跟进GitHub 上的项目源代码(还没有真正的 Wiki)

于 2014-12-17T17:43:35.060 回答
1

Weld 是 JSR-299 的参考实现,它在 JavaEE 6 中引入了 CDI。此参考实现包含在 Glassfish 中,因此您可以有效地使用它。

来自 Oracle 的示例在这里找到:

@Named
public class SimpleItemReader
       extends AbstractItemReader {

       @Inject
       private JobContext jobContext; 
       ...
}

引用:

我从没用过焊接

这里的实现无关紧要,因为它只是实现了 JSR 的规范。

于 2014-01-16T21:23:31.263 回答