问题标签 [jbatch]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
445 浏览

java - Java 批处理:如何以编程方式确定您正在运行哪个分区?

JSR-352批处理中,我想使用分区。我可以通过配置来定义分区的数量,或者实现一个PartitionMapper来做到这一点。

然后,有JobContextStepContext可注入 为我的处理提供上下文信息。但是,没有PartitionContext或类似的东西可以维护并提供有关我正在运行的分区的详细信息。

因此问题是:

如何告诉块的每个分区实例它在哪个分区中运行,以便它ItemReader只能读取属于该特定分区的那些项目?

如果我不这样做,每个分区将对相同的数据执行相同的工作,而不是将输入数据集拆分为n不同的分区。

我知道我可以在分区计划的属性中存储一些 ID,然后我可以使用这些 ID 在步骤的配置中设置另一个属性,例如<property name="partitionId" value="#{partitionPlan['partitionId']}" />. 但这似乎过于复杂和脆弱,因为我必须从分区计划中知道属性的名称,并且必须记住在每个步骤中始终将另一个属性设置为该值。

难道没有另一种干净的标准方法来为步骤提供分区信息吗?

或者,我应该如何按分区拆分工作并将其分配给ItemReader同一分区块中的不同实例?

更新:

jberet 似乎具有org.jberet.cdi.PartitionScoped CDI 范围,但它不是 JSR 标准的一部分。

0 投票
1 回答
709 浏览

java - 具有可重试和可跳过异常的 jsr 352 批处理可能会多次处理项目

我有一个用 JSR-352 实现的批处理(在 wildfly 上使用 jberet)。

我有一个项目计数为 15 的块,java.lang.Exception并被配置为可重试和可跳过的异常。

当有很多异常时,大多数项目将被多次处理。在这种极端情况下,所有项目都会在 writer 中引发异常:

  • 前 15 项已阅读
  • 第一项发生异常
  • 块被回滚并配置为 item-count = 1
  • 第一项已读
  • 再次出现异常,项目被跳过
  • 继续其他14项,每一项都可能出现异常,每一项都被跳过
  • 在前 15 个项目之后,块返回 item-count = 15
  • 阅读第 16-30 项
  • 再次出现异常
  • 阅读器回滚到最新的检查点

此时仍然没有检查点,因为还没有成功处理过的项目。因此,读者再次从第一项开始。所有 30 个项目都以 item-count = 1 处理,等等。

如果有很多这样的失败,批处理将一次又一次地处理所有项目。

我认为还需要为跳过的项目设置检查点,因为不应再次处理跳过的项目。

我认为这是规范中的一个错误,所以我已经在那里打开了一个问题:https ://github.com/WASdev/standards.jsr352.batch-spec/issues/15 或者我错了并且误解了实现?

这是如何在 Spring Batch 中实现的?

0 投票
1 回答
29 浏览

java - 如何在 jsr352 中配置可重试/可跳过的异常

我想编写一些通用的批处理侦听器来注销我的应用程序中配置的所有批处理的一些有用信息。为此,我想从批处理配置中获取配置的可跳过/可重试异常。但是我没有找到任何 API。有没有办法独立于 jsr352 实现来检索此配置?

0 投票
1 回答
55 浏览

jms - 从 Jms 消息接收创建作业

使用wildfly 15并且仅使用JavaEE(无spring)我需要使用Jms队列中的消息,以便为每条消息按顺序使用Jbatch创建一个新作业,而不会出现作业重叠。

例如:

JMS 队列:--> msgC --> msgB --> msgA

批处理

  • 收到 msgC,创建 JobC,运行 jobC
  • 等待 JobC 结束,观察 JMS 队列,接收 msgB,创建 JobB,运行 JobB
  • 等待 JobB 结束,观察 JMS 队列,接收 msgA,创建 JobA,运行 JobB

有可能做到这一点吗?

0 投票
4 回答
572 浏览

jakarta-ee - JEE Batch Job Specification with many optional Steps

Is there a way to achieve the following logic with JSR 352 Batch API? I have a series of Steps that each need to be executed based on a different condition known when starting the job. ConditionsEntity is provided by an external system.

My first attempt fails because of: com.ibm.jbatch.container.exception.BatchContainerRuntimeException: A decision cannot precede another decision. I'm adding the FAILING Code here

UPDATE I have implemented the following suggested solution with a passThroughStep. It's working correctly, but I would still love to be able to avoid all this code duplication.

The Decider

My Test

0 投票
1 回答
279 浏览

java - JBeret 和 JSR352,关于重启和持久数据的一些说明

我目前正在使用JBeret作为JSR 352规范的批处理实现。

首要问题

我正在尝试复制处理器失败的块作业并存储重新启动位置,以便我可以从最后一个成功的索引重新启动。

这是阅读器

这是处理器

作家_

现在我希望如果作业失败,它会设置JOB_EXECUTIONRESTART_POSITION列添加到从checkpointInfo返回的索引,但这不会发生。

因此,当我尝试从最后一个 id 重新启动作业时,检查点始终为空。

如何存储检查点以便从open方法中检索它?

第二期

在应用程序测试中,我经常看到从 stepContext 对象设置持久性用户数据(另见我的编写器实现)。这个的真正用途是什么?我真的可以用保存的数据做什么?

我还猜想,在处理数千条记录时,这种做法可能会导致严重的内存开销。

有什么提示吗?

0 投票
1 回答
38 浏览

java - Jberet,在 batchlet 上手动设置 writecount

我想知道是否可以在批处理上手动设置writecount属性,以便在STEP_EXECUTION.WRITECOUNT字段的表上记录结果。

这是我的伪代码

0 投票
1 回答
413 浏览

java - Java EE 7 批处理 API (JSR-352):可以停止单个步骤而不是所有工作吗?

注意:JSR-352,Java EE,wildfly 17.0.1,没有 spring

我在 xml 中定义了以下工作:

我的要求是处理作业停止,我可以在 xmlRead 中覆盖 stop() (第一步)。

问题是我还需要确保始终执行第二步,但是从我的测试来看,如果我在第一批 XmlRead 中运行以下代码:

最后,作业的退出状态将为 FAILED(正确!),但永远不会执行第二步。

知道如何模拟这种情况吗?

0 投票
1 回答
50 浏览

jsr352 - Jsr 352 - 无论状态如何都强制步骤

我正在使用 jsr 352 的 jberet 实现。

我的目的是提供最后一步,在该步骤中我发送一封包含批次信息状态的电子邮件。

因此,即使上一步(可以是 batchlet 或块)因意外错误而终止,我也必须完成最后一步并报告发生的情况。

做到这一点的最佳方法是什么?也许使用一些听众?