| = Application Composer Advanced Usage |
| :jbake-date: 2016-03-16 |
| :jbake-type: page |
| :jbake-status: published |
| :jbake-tomeepdf: |
| |
| 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. |
| |
| [source,java] |
| ---- |
| // 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(); |
| beans.addManagedClass(BatchEEBeanManagerInitializer.Init.class); |
| |
| final EjbModule ejbModule = new EjbModule(ejbJar); |
| ejbModule.setModuleId("batchee-shared-components"); |
| ejbModule.setBeans(beans); |
| 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; |
| this.properties = 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 { |
| ApplicationComposers.run(MyBatch.class, args); |
| } |
| } |
| ---- |