blob: 50390cc55a61d5992bc5a6a1be201e070bebf603 [file] [log] [blame]
= ApplicationComposer with JBatch
:jbake-date: 2016-03-16
:jbake-type: page
:jbake-status: published
ApplicationComposer can be a way to run a JBatch not needing any HTTP connector.
Here is an example making batch integration easy - note you can extract the generic part in a library very easily:
TIP: if you didn't check yet BatchEE provides some standalone utilities for JBatch but the idea of this page can be reused for a lot of applications.
// helper class reusable for any batch
abstract class BatchApplication {
private static final DateTimeFormatter DATE = DateTimeFormatter.ofPattern("YYYYMMddHHmmss");
protected Report runBatch(final String batchName, final Properties config) {
final JobOperator operator = BatchRuntime.getJobOperator();
final long id = operator.start(batchName, config);
Batches.waitForEnd(operator, id);
return new Report(operator.getJobExecution(id), operator.getParameters(id));
@Module // we enforce BatchEE to be initialized as an EJB context to get JNDI for JTA init, needed for TomEE 1
public EjbModule ensureBatchEESetupIsDoneInTheRightContext() {
final EjbJar ejbJar = new EjbJar().enterpriseBean(new SingletonBean(BatchEEBeanManagerInitializer.class));
final Beans beans = new Beans();
final EjbModule ejbModule = new EjbModule(ejbJar);
return ejbModule;
public static class Report {
private final JobExecution execution;
private final Properties properties;
public Report(final JobExecution execution, final Properties properties) {
this.execution = execution; = properties;
public JobExecution getExecution() {
return execution;
public Properties getProperties() {
return properties;
@Classes(cdi = true, value = { MyFilter.class, MoveFile.class, InputFile.class, MyReader.class, LoggingListener.class })
public class MyBatch extends BatchApplication {
private final Properties config;
public Mybatch(final String[] args) { // main args
this.config = new Properties() {{ // create the batch config
setProperty("input-directory", args[0]);
public Report execute(final String inputDirectory) {
return runBatch("sunstone", config);
public static void main(final String[] args) throws Exception {, args);