在我的Java批处理作业(JSR-352,JBeret(中,我已经达到了(可选(等待用户决定的程度。根据我的研究,JSR-352规范没有提供"等待"的概念。所以问题是,还有什么其他选择?
我目前的考虑:
- 我宁愿不拆分作业,因为这需要维护部件之间的连接以满足监控需求
- 仅为此目的在项目中引入JMS似乎有些过头了
- 通过JPA或JDBC轮询数据库似乎也不是一个好的解决方案
- 作业启动时,特定信息尚不可用,因此无法将其作为作业参数传递
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;
}
}
您可以使用一些java并发结构,如CountDownLatch来协调程序的不同部分。批处理应用程序的重要部分是拥有一个共享对象,该对象持有锁(或类似的锁(,并且所有部分都在访问同一个实例。请参阅相关线程:Java batch:jobContext transientUserData未通过步骤,特别是与使用JBeret提供的@JobScoped
CDI作用域有关的注释。
如果您在EE中运行,例如WildFly,您还可以考虑在具有bean管理并发的@Singleton
ejb中保持等待/锁定。
在这种情况下,您需要停止作业以等待外部事件。这里是用户,它可以是其他企业信息系统,甚至可以是从其他公司运行的。你多久才能得到回复?是秒吗?分钟小时?天?
请注意,无论需要多长时间,您的批处理作业都必须等待。使用singleton、lock或polling将使用批处理机上的资源。但更重要的是,一旦JVM被终止并重新启动,您的工作会发生什么?
我认为这样的场景是那些达到JSR-352的极限并希望切换到工作流引擎的场景,可能是一个执行BPM的引擎。
https://stackoverflow.com/search?q=java+工作流+引擎