【问题标题】:Java EE 7 batch API (JSR-352): it's possible to stop a single step and not all the job?Java EE 7 批处理 API (JSR-352):可以停止单个步骤而不是所有工作吗?
【发布时间】:2020-02-25 14:12:54
【问题描述】:

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

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

<?xml version="1.0" encoding="UTF-8"?>
<job id="xml2json" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd" version="1.0">
    <flow id="flow">
        <step id="step1" next="step2">
            <batchlet ref="xmlRead">
            </batchlet>
        </step>
        <step id="step2">
            <batchlet ref="notificationBatchlet">
            </batchlet>        
        </step>
    </flow>
</job>

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

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

        if (shouldStop) {
            log.warn("xmlRead - job stopped by user");
            return FAILED.toString();
        }

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

知道如何为这个场景建模吗?

【问题讨论】:

  • 停止后为什么返回失败?
  • 这只是一个测试,也与 COMPLETED 结果是一样的

标签: java java-ee-7 jsr352 jberet jbatch


【解决方案1】:

您可以在第一步中包含一个过渡元素列表,而不是next 属性,以根据退出状态(批处理的返回值)指导作业的执行流程。类似于以下内容:

<step id = "step1">
  <batchlet ref="xmlRead"/>

  <next on = "flag1" to = "step2"/>
  <stop on = "flag2"/>
  <fail on = "flag3"/>
</step>

Step2 可以从其他一些常见的应用程序组件中观察相同的条件以决定要做什么,或者您可以将条件保存为作业执行数据(请参阅somehow related discussion

我刚刚创建了一个示例批处理应用程序batchlet-singleton.war 来演示批处理、单例会话 bean 和条件转换的使用。

【讨论】:

  • 我的要求是停止批处理之外的作业(xmlRead 或 notificationBatchlet)。如果我在 xmlRead Batchlet 中实现停止方法,则整个作业都会失败,不仅是一个步骤,因此任何下一步都不起作用,并且不会执行第二步。如何解决这个问题?
  • 没有办法让外部客户端发出命令来停止单个步骤而不停止整个作业。您对“停止步骤”的定义似乎更像是正常工作流程的一部分:在特定条件下,停止批处理中的任何工作并继续执行步骤 2。因此,当前的过渡机制应该已经适用于您的情况。 1st 的批处理状态将为 COMPLETED,其退出状态可以是您的应用定义的任何值。
  • 好的,但是这个关于如何在内部“重定向”流的条件应该从工作外部控制。因此,在这一点上,一个可行的解决方案可能是从作业外部设置上下文中的变量,因此在步骤中我可以对此做出反应?
  • batchlet 类可以定期检查共享对象中的条件,该条件可以保存在作业上下文或步骤上下文中,也可以注入 JBeret 的@JobScoped@StepScoped 作用域。有关详细信息,请参阅上面答案部分中的链接“相关讨论”。
  • 在我看来,不仅可以向批处理作业发送停止信号,还可以向其他信号发送停止信号。在这样的自定义信号下,可以停止一个步骤 - 批处理本身可能会继续运行。这可能类似于您可以使用 kill 发送到进程的信号。但为此需要增强 JSR。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多