0

在我的 Java 批处理作业(JSR-352,JBeret)中,我已经达到了我(可选)想要等待用户决定的地步。根据我的研究,JSR-352 规范没有提供“等待”的概念。所以问题是,还有哪些其他选择?

我目前的考虑:

  1. 我不希望拆分工作,因为这需要保持部件之间的连接以满足监控需求。
  2. 仅出于此目的将 JMS 引入项目似乎有些过头了。
  3. 通过 JPA 或 JDBC 轮询数据库似乎也不是一个好的解决方案。
  4. 作业启动时具体信息尚不可用,因此不能作为作业参数传递。
import javax.batch.api.Decider;
import javax.batch.runtime.StepExecution;
import javax.inject.Named;

@Named
public class AwaitingDecider implements Decider {

    @Override
    public String decide(final StepExecution[] executions) {
        String decision = // how to wait here?
        return decision;
    }
}
4

2 回答 2

1

您可以使用一些 Java 并发构造(例如CountDownLatch)来协调程序的不同部分。批处理应用程序的重要部分是拥有一个持有锁(或类似物)的共享对象,并且所有部分都访问同一个实例。请参阅相关线程:Java 批处理:jobContext transientUserData 未通过步骤,特别是与使用@JobScopedJBeret 提供的 CDI 范围相关的注释。

如果您在 EE 中运行,例如 WildFly,您还可以考虑将等待/锁定保留在具有bean-managed concurrency@Singleton的ejb 中。

于 2020-03-04T13:15:34.900 回答
0

在这种情况下,您需要停止工作以等待外部事件。这里是用户,可能是其他企业信息系统,甚至是其他公司运行的。您多久能收到回复?是秒吗?分钟?小时?天?

请注意,无论多长时间,您的批处理作业都必须等待。使用单例或锁或轮询将使用批处理机器上的资源。但更重要的是,一旦 JVM 被杀死并重新启动,你的工作会发生什么?

我认为这样的场景是那些你达到 JSR-352 的限制并想要切换到工作流引擎的场景,可能是执行 BPM 的。

https://stackoverflow.com/search?q=java+workflow+engine

于 2020-10-23T12:49:24.060 回答