{"id":28485,"date":"2014-08-07T16:00:38","date_gmt":"2014-08-07T13:00:38","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/?p=28485"},"modified":"2014-08-06T16:34:11","modified_gmt":"2014-08-06T13:34:11","slug":"spring-batch-as-wildfly-module","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html","title":{"rendered":"Spring Batch as Wildfly Module"},"content":{"rendered":"<p>For a long time, the Java EE specification was lacking a Batch Processing API. Today, this is an essential necessity for enterprise applications. This was finally fixed with the <a href=\"https:\/\/jcp.org\/en\/jsr\/detail?id=352\">JSR-352<\/a> Batch Applications for the Java Platform now available in Java EE 7. The <a href=\"https:\/\/jcp.org\/en\/jsr\/detail?id=352\">JSR-352<\/a> got it\u2019s inspiration from the <a href=\"http:\/\/projects.spring.io\/spring-batch\/\">Spring Batch<\/a> counterpart. Both cover the same concepts, although the resulting API\u2019s are a bit different.<\/p>\n<p>Since the Spring team also collaborated in the <a href=\"https:\/\/jcp.org\/en\/jsr\/detail?id=352\">JSR-352<\/a>, it was only a matter of time for them to provide an implementation based on <a href=\"http:\/\/projects.spring.io\/spring-batch\/\">Spring Batch<\/a>. The latest major version of <a href=\"http:\/\/projects.spring.io\/spring-batch\/\">Spring Batch<\/a> (version 3), now supports the <a href=\"https:\/\/jcp.org\/en\/jsr\/detail?id=352\">JSR-352<\/a>.<\/p>\n<p>I\u2019m a <a href=\"http:\/\/projects.spring.io\/spring-batch\/\">Spring Batch<\/a> user for many years and I\u2019ve always enjoyed that the technology had a interesting set of built-in readers and writers. These allowed you to perform the most common operations required by batch processing. Do you need to read data from a database? You could use <code>JdbcCursorItemReader<\/code>, how about writing data in a fixed format? Use <code>FlatFileItemWriter<\/code>, and so on.<\/p>\n<p>Unfortunately, <a href=\"https:\/\/jcp.org\/en\/jsr\/detail?id=352\">JSR-352<\/a> implementations do not have the amount of readers and writers available in <a href=\"http:\/\/projects.spring.io\/spring-batch\/\">Spring Batch<\/a>. We have to remember that <a href=\"https:\/\/jcp.org\/en\/jsr\/detail?id=352\">JSR-352<\/a> is very recent and didn\u2019t have time to catch up. <a href=\"https:\/\/github.com\/jberet\">jBeret<\/a>, the <a href=\"http:\/\/wildfly.org\">Wildfly<\/a> implementation for <a href=\"https:\/\/jcp.org\/en\/jsr\/detail?id=352\">JSR-352<\/a> already provides a few custom readers and writers.<\/p>\n<h2>What\u2019s the point?<\/h2>\n<p>I was hoping that with the latest release, all the readers and writers from the original <a href=\"http:\/\/projects.spring.io\/spring-batch\/\">Spring Batch<\/a> would be available as well. This is not the case yet, since it would take a lot of work, but there are plans to make them available in future versions. This would allow us to migrate native <a href=\"http:\/\/projects.spring.io\/spring-batch\/\">Spring Batch<\/a> applications into <a href=\"https:\/\/jcp.org\/en\/jsr\/detail?id=352\">JSR-352<\/a>. We still have the issue of the implementation vendor lock-in, but it may be interesting in some cases.<\/p>\n<h2>Motivation<\/h2>\n<p>I\u2019m one of the main test contributors for the <a href=\"https:\/\/github.com\/javaee-samples\/javaee7-samples\">Java EE Samples<\/a> in the <a href=\"https:\/\/jcp.org\/en\/jsr\/detail?id=352\">JSR-352<\/a> specification. I wanted to find out if the tests I\u2019ve implemented have the same behaviour using the <a href=\"http:\/\/projects.spring.io\/spring-batch\/\">Spring Batch<\/a> implementation. How can we do that?<\/p>\n<h2>Code<\/h2>\n<p>I think this exercise is not only interesting because of the original motivation, but it\u2019s also useful to learn about modules and class loading on <a href=\"http:\/\/wildfly.org\">Wildfly<\/a>. First we need to decide how are we going to deploy the needed <a href=\"http:\/\/projects.spring.io\/spring-batch\/\">Spring Batch<\/a> dependencies. We could deploy them directly with the application, or use a <a href=\"http:\/\/wildfly.org\">Wildfly<\/a> module. Modules have the advantage to be bundled directly into the application server and can be reused by all deployed applications.<\/p>\n<h3>Adding Wildfly Module with Maven<\/h3>\n<p>With a bit of work it\u2019s possible to add the module automatically with the <a href=\"https:\/\/docs.jboss.org\/wildfly\/plugins\/maven\/latest\/\">Wildfly Maven Plugin<\/a> and the CLI (command line). Let\u2019s start to create two files that represent the CLI commands that we need to create and remove the module:<\/p>\n<p><code>wildfly-add-spring-batch.cli<\/code><\/p>\n<p><em>wildfly-add-spring-batch.cli<\/em><\/p>\n<pre class=\"brush:java;wrap-lines:false\"># Connect to Wildfly instance\r\nconnect\r\n\r\n# Create Spring Batch Module\r\n# If the module already exists, Wildfly will output a message saying that the module already exists and the script exits.\r\nmodule add \\\r\n    --name=org.springframework.batch \\\r\n    --dependencies=javax.api,javaee.api \\\r\n    --resources=${wildfly.module.classpath}<\/pre>\n<p>The module <code>--name<\/code> is important. We\u2019re going to need it to reference it in our application. The <code>--resources<\/code> is a pain, since you need to indicate a full classpath to all the required module dependencies, but we\u2019re generating the paths in the next few steps.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p><code>wildfly-remove-spring-batch.cli<\/code><\/p>\n<p><em>wildfly-remove-spring-batch.cli<\/em><\/p>\n<pre class=\"brush:java\"> # Connect to Wildfly instance\r\nconnect\r\n\r\n# Remove Oracle JDBC Driver Module\r\nmodule remove --name=org.springframework.batch<\/pre>\n<p>Note <code>wildfly.module.classpath<\/code>. This property will hold the complete classpath for the required <a href=\"http:\/\/projects.spring.io\/spring-batch\/\">Spring Batch<\/a> dependencies. We can generate it with <a href=\"http:\/\/maven.apache.org\/plugins\/maven-dependency-plugin\/\">Maven Dependency plugin<\/a>:<\/p>\n<p><em>pom-maven-dependency-plugin.xml<\/em><\/p>\n<pre class=\"brush:xml\">\r\n&lt;plugin&gt;\r\n    &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;maven-dependency-plugin&lt;\/artifactId&gt;\r\n    &lt;version&gt;${version.plugin.dependency}&lt;\/version&gt;\r\n    &lt;executions&gt;\r\n        &lt;execution&gt;\r\n            &lt;phase&gt;generate-sources&lt;\/phase&gt;\r\n            &lt;goals&gt;\r\n                &lt;goal&gt;build-classpath&lt;\/goal&gt;\r\n            &lt;\/goals&gt;\r\n            &lt;configuration&gt;\r\n                &lt;outputProperty&gt;wildfly.module.classpath&lt;\/outputProperty&gt;\r\n                &lt;pathSeparator&gt;:&lt;\/pathSeparator&gt;\r\n                &lt;excludeGroupIds&gt;javax&lt;\/excludeGroupIds&gt;\r\n                &lt;excludeScope&gt;test&lt;\/excludeScope&gt;\r\n                &lt;includeScope&gt;provided&lt;\/includeScope&gt;\r\n            &lt;\/configuration&gt;\r\n        &lt;\/execution&gt;\r\n    &lt;\/executions&gt;\r\n&lt;\/plugin&gt;<\/pre>\n<p>This is going to pick all dependencies (including transitive), exclude <code>javax<\/code> (since they are already present in <a href=\"http:\/\/wildfly.org\">Wildfly<\/a>) and exclude <code>test<\/code> scope dependencies. We need the following dependencies for <a href=\"http:\/\/projects.spring.io\/spring-batch\/\">Spring Batch<\/a>:<\/p>\n<p><em>pom-dependencies.xml<\/em><\/p>\n<pre class=\"brush:xml\">&lt;!-- Needed for Wildfly module --&gt;\r\n&lt;dependency&gt;\r\n    &lt;groupId&gt;org.springframework.batch&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;spring-batch-core&lt;\/artifactId&gt;\r\n    &lt;version&gt;3.0.0.RELEASE&lt;\/version&gt;\r\n    &lt;scope&gt;provided&lt;\/scope&gt;\r\n&lt;\/dependency&gt;\r\n\r\n&lt;dependency&gt;\r\n    &lt;groupId&gt;org.springframework&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;spring-jdbc&lt;\/artifactId&gt;\r\n    &lt;version&gt;4.0.5.RELEASE&lt;\/version&gt;\r\n    &lt;scope&gt;provided&lt;\/scope&gt;\r\n&lt;\/dependency&gt;\r\n\r\n&lt;dependency&gt;\r\n    &lt;groupId&gt;commons-dbcp&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;commons-dbcp&lt;\/artifactId&gt;\r\n    &lt;version&gt;1.4&lt;\/version&gt;\r\n    &lt;scope&gt;provided&lt;\/scope&gt;\r\n&lt;\/dependency&gt;\r\n\r\n&lt;dependency&gt;\r\n    &lt;groupId&gt;org.hsqldb&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;hsqldb&lt;\/artifactId&gt;\r\n    &lt;version&gt;2.3.2&lt;\/version&gt;\r\n    &lt;scope&gt;provided&lt;\/scope&gt;\r\n&lt;\/dependency&gt;<\/pre>\n<p>Now, we need to replace the property in the file. Let\u2019s use <a href=\"http:\/\/maven.apache.org\/plugins\/maven-resources-plugin\/\">Maven Resources plugin<\/a>:<\/p>\n<p><em>pom-maven-resources-plugin.xml<\/em><\/p>\n<pre class=\"brush:xml\">&lt;plugin&gt;\r\n    &lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;maven-resources-plugin&lt;\/artifactId&gt;\r\n    &lt;version&gt;${version.plugin.resources}&lt;\/version&gt;\r\n    &lt;executions&gt;\r\n        &lt;execution&gt;\r\n            &lt;id&gt;copy-resources&lt;\/id&gt;\r\n            &lt;phase&gt;process-resources&lt;\/phase&gt;\r\n            &lt;goals&gt;\r\n                &lt;goal&gt;copy-resources&lt;\/goal&gt;\r\n            &lt;\/goals&gt;\r\n            &lt;configuration&gt;\r\n                &lt;outputDirectory&gt;${basedir}\/target\/scripts&lt;\/outputDirectory&gt;\r\n                &lt;resources&gt;\r\n                    &lt;resource&gt;\r\n                        &lt;directory&gt;src\/main\/resources\/scripts&lt;\/directory&gt;\r\n                        &lt;filtering&gt;true&lt;\/filtering&gt;\r\n                    &lt;\/resource&gt;\r\n                &lt;\/resources&gt;\r\n            &lt;\/configuration&gt;\r\n        &lt;\/execution&gt;\r\n    &lt;\/executions&gt;\r\n&lt;\/plugin&gt;<\/pre>\n<p>This will filter the configured files and replace the property <code>wildfly.module.classpath<\/code> with the value we generated previously. This is a classpath pointing to the dependencies in your local Maven repository. Now with <a href=\"https:\/\/docs.jboss.org\/wildfly\/plugins\/maven\/latest\/\">Wildfly Maven Plugin<\/a> we can execute this script (you need to have <a href=\"http:\/\/wildfly.org\">Wildfly<\/a> running):<\/p>\n<p><em>pom-maven-wildfly-plugin.xml<\/em><\/p>\n<pre class=\"brush:xml\">&lt;plugin&gt;\r\n    &lt;groupId&gt;org.wildfly.plugins&lt;\/groupId&gt;\r\n    &lt;artifactId&gt;wildfly-maven-plugin&lt;\/artifactId&gt;\r\n    &lt;version&gt;${version.plugin.wildfly}&lt;\/version&gt;\r\n    &lt;configuration&gt;\r\n        &lt;skip&gt;false&lt;\/skip&gt;\r\n        &lt;executeCommands&gt;\r\n            &lt;batch&gt;false&lt;\/batch&gt;\r\n            &lt;scripts&gt;\r\n                &lt;!--suppress MavenModelInspection --&gt;\r\n                &lt;script&gt;target\/scripts\/${cli.file}&lt;\/script&gt;\r\n            &lt;\/scripts&gt;\r\n        &lt;\/executeCommands&gt;\r\n    &lt;\/configuration&gt;\r\n&lt;\/plugin&gt;<\/pre>\n<p>And these profiles:<\/p>\n<p><em>pom-profiles.xml<\/em><\/p>\n<pre class=\"brush:xml\">&lt;profiles&gt;\r\n    &lt;profile&gt;\r\n        &lt;id&gt;install-spring-batch&lt;\/id&gt;\r\n        &lt;properties&gt;\r\n            &lt;cli.file&gt;wildfly-add-spring-batch.cli&lt;\/cli.file&gt;\r\n        &lt;\/properties&gt;\r\n    &lt;\/profile&gt;\r\n\r\n    &lt;profile&gt;\r\n        &lt;id&gt;remove-spring-batch&lt;\/id&gt;\r\n        &lt;properties&gt;\r\n            &lt;cli.file&gt;wildfly-remove-spring-batch.cli&lt;\/cli.file&gt;\r\n        &lt;\/properties&gt;\r\n    &lt;\/profile&gt;\r\n&lt;\/profiles&gt;<\/pre>\n<p>(For the full <code>pom.xml<\/code> contents, check <a href=\"https:\/\/github.com\/radcortez\/wildfly-spring-batch\/blob\/master\/pom.xml\">here<\/a>)<\/p>\n<p>We can add the module by executing:<br \/>\n<code>mvn process-resources wildfly:execute-commands -P install-spring-batch<\/code>.<\/p>\n<p>Or remove the module by executing:<br \/>\n<code>mvn wildfly:execute-commands -P remove-spring-batch<\/code>.<\/p>\n<p>This strategy works for any module that you want to create into <a href=\"http:\/\/wildfly.org\">Wildfly<\/a>. Think about adding a JDBC driver. You usually use a module to add it into the server, but all the documentation I\u2019ve found about this is always a manual process. This works great for CI builds, so you can have everything you need to setup your environment.<\/p>\n<h3>Use Spring-Batch<\/h3>\n<p>Ok, I have my module there, but how can I instruct <a href=\"http:\/\/wildfly.org\">Wildfly<\/a> to use it instead of <a href=\"https:\/\/github.com\/jberet\">jBeret<\/a>? We need to add a the following file in <code>META-INF<\/code> folder of our application:<\/p>\n<p><code>jboss-deployment-structure.xml<\/code><\/p>\n<p><em>jboss-deployment-structure.xml<\/em><\/p>\n<pre class=\"brush:xml\"> &lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;jboss-deployment-structure&gt;\r\n    &lt;deployment&gt;\r\n        &lt;exclusions&gt;\r\n            &lt;module name=\"org.wildfly.jberet\"\/&gt;\r\n            &lt;module name=\"org.jberet.jberet-core\"\/&gt;\r\n        &lt;\/exclusions&gt;\r\n\r\n        &lt;dependencies&gt;\r\n            &lt;module name=\"org.springframework.batch\" services=\"import\" meta-inf=\"import\"\/&gt;\r\n        &lt;\/dependencies&gt;\r\n    &lt;\/deployment&gt;\r\n&lt;\/jboss-deployment-structure&gt;<\/pre>\n<p>Since the <a href=\"https:\/\/jcp.org\/en\/jsr\/detail?id=352\">JSR-352<\/a> uses a <a href=\"http:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/util\/ServiceLoader.html\">Service Loader<\/a> to load the implementation, the only possible outcome would be to load the service specified in <code>org.springframework.batch<\/code> module. Your batch code will now run with the <a href=\"http:\/\/projects.spring.io\/spring-batch\/\">Spring Batch<\/a> implementation.<\/p>\n<h2>Testing<\/h2>\n<p>The github repository code, has <a href=\"http:\/\/arquillian.org\">Arquillian<\/a> sample tests that demonstrate the behaviour. Check the <b>Resources<\/b> section below.<\/p>\n<h2>Resources<\/h2>\n<p>You can clone a full working copy from my github repository. You can find instructions there to deploy it.<\/p>\n<p><a href=\"https:\/\/github.com\/radcortez\/wildfly-spring-batch\">Wildfly \u2013 Spring Batch<\/a><\/p>\n<p>Since I may modify the code in the future, you can download the original source of this post from the <a href=\"https:\/\/github.com\/radcortez\/wildfly-spring-batch\/releases\/tag\/1.0\">release 1.0<\/a>. In alternative, clone the repo, and checkout the tag from <a href=\"https:\/\/github.com\/radcortez\/wildfly-spring-batch\/releases\/tag\/1.0\">release 1.0<\/a> with the following command: <code>git checkout 1.0<\/code>.<\/p>\n<h2>Future<\/h2>\n<p>I\u2019ve still need to apply this to the <a href=\"https:\/\/github.com\/javaee-samples\/javaee7-samples\">Java EE Samples<\/a>. It\u2019s on my TODO list.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"http:\/\/www.radcortez.com\/spring-batch-as-wildfly-module\/\">Spring Batch as Wildfly Module<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/jcg\">JCG partner<\/a> Roberto Cortez at the <a href=\"http:\/\/www.radcortez.com\/\">Roberto Cortez Java Blog<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>For a long time, the Java EE specification was lacking a Batch Processing API. Today, this is an essential necessity for enterprise applications. This was finally fixed with the JSR-352 Batch Applications for the Java Platform now available in Java EE 7. The JSR-352 got it\u2019s inspiration from the Spring Batch counterpart. Both cover the &hellip;<\/p>\n","protected":false},"author":592,"featured_media":13842,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[890,30,691],"class_list":["post-28485","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-jboss-wildfly","tag-spring","tag-spring-batch"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Spring Batch as Wildfly Module<\/title>\n<meta name=\"description\" content=\"For a long time, the Java EE specification was lacking a Batch Processing API. Today, this is an essential necessity for enterprise applications. This was\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring Batch as Wildfly Module\" \/>\n<meta property=\"og:description\" content=\"For a long time, the Java EE specification was lacking a Batch Processing API. Today, this is an essential necessity for enterprise applications. This was\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/radcortez\" \/>\n<meta property=\"article:published_time\" content=\"2014-08-07T13:00:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2013\/06\/jboss-wildfly-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Roberto Cortez\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/radcortez\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Roberto Cortez\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/08\\\/spring-batch-as-wildfly-module.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/08\\\/spring-batch-as-wildfly-module.html\"},\"author\":{\"name\":\"Roberto Cortez\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/d8791115988e922dbffae8d09223a72e\"},\"headline\":\"Spring Batch as Wildfly Module\",\"datePublished\":\"2014-08-07T13:00:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/08\\\/spring-batch-as-wildfly-module.html\"},\"wordCount\":909,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/08\\\/spring-batch-as-wildfly-module.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2013\\\/06\\\/jboss-wildfly-logo.jpg\",\"keywords\":[\"JBoss WildFly\",\"Spring\",\"Spring Batch\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/08\\\/spring-batch-as-wildfly-module.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/08\\\/spring-batch-as-wildfly-module.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/08\\\/spring-batch-as-wildfly-module.html\",\"name\":\"Spring Batch as Wildfly Module\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/08\\\/spring-batch-as-wildfly-module.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/08\\\/spring-batch-as-wildfly-module.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2013\\\/06\\\/jboss-wildfly-logo.jpg\",\"datePublished\":\"2014-08-07T13:00:38+00:00\",\"description\":\"For a long time, the Java EE specification was lacking a Batch Processing API. Today, this is an essential necessity for enterprise applications. This was\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/08\\\/spring-batch-as-wildfly-module.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/08\\\/spring-batch-as-wildfly-module.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/08\\\/spring-batch-as-wildfly-module.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2013\\\/06\\\/jboss-wildfly-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2013\\\/06\\\/jboss-wildfly-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2014\\\/08\\\/spring-batch-as-wildfly-module.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Spring Batch as Wildfly Module\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/d8791115988e922dbffae8d09223a72e\",\"name\":\"Roberto Cortez\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3b40fa2b3df6cfc7ad81ed1509ed2a17fe6a200e409fb0aa8d9e2ab72b64b684?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3b40fa2b3df6cfc7ad81ed1509ed2a17fe6a200e409fb0aa8d9e2ab72b64b684?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3b40fa2b3df6cfc7ad81ed1509ed2a17fe6a200e409fb0aa8d9e2ab72b64b684?s=96&d=mm&r=g\",\"caption\":\"Roberto Cortez\"},\"description\":\"My name is Roberto Cortez and I was born in Venezuela, but I have spent most of my life in Coimbra \u2013 Portugal, where I currently live. I am a professional Java Developer working in the software development industry, with more than 8 years of experience in business areas like Finance, Insurance and Government. I work with many Java based technologies like JavaEE, Spring, Hibernate, GWT, JBoss AS and Maven just to name a few, always relying on my favorite IDE: IntelliJ IDEA. Most recently, I became a Freelancer \\\/ Independent Contractor. My new position is making me travel around the world (an old dream) to customers, but also to attend Java conferences. The direct contact with the Java community made me want to become an active member in the community itself. For that reason, I have created the Coimbra Java User Group, started to contribute to Open Source on Github and launched my own blog (www.radcortez.com), so I can share some of the knowledge that I gained over the years.\",\"sameAs\":[\"http:\\\/\\\/www.radcortez.com\\\/\",\"https:\\\/\\\/www.facebook.com\\\/radcortez\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/radcortez\",\"https:\\\/\\\/x.com\\\/https:\\\/\\\/twitter.com\\\/radcortez\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/roberto-cortez\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Spring Batch as Wildfly Module","description":"For a long time, the Java EE specification was lacking a Batch Processing API. Today, this is an essential necessity for enterprise applications. This was","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html","og_locale":"en_US","og_type":"article","og_title":"Spring Batch as Wildfly Module","og_description":"For a long time, the Java EE specification was lacking a Batch Processing API. Today, this is an essential necessity for enterprise applications. This was","og_url":"https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_author":"https:\/\/www.facebook.com\/radcortez","article_published_time":"2014-08-07T13:00:38+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2013\/06\/jboss-wildfly-logo.jpg","type":"image\/jpeg"}],"author":"Roberto Cortez","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/radcortez","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Roberto Cortez","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html"},"author":{"name":"Roberto Cortez","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/d8791115988e922dbffae8d09223a72e"},"headline":"Spring Batch as Wildfly Module","datePublished":"2014-08-07T13:00:38+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html"},"wordCount":909,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2013\/06\/jboss-wildfly-logo.jpg","keywords":["JBoss WildFly","Spring","Spring Batch"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html","url":"https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html","name":"Spring Batch as Wildfly Module","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2013\/06\/jboss-wildfly-logo.jpg","datePublished":"2014-08-07T13:00:38+00:00","description":"For a long time, the Java EE specification was lacking a Batch Processing API. Today, this is an essential necessity for enterprise applications. This was","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2013\/06\/jboss-wildfly-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2013\/06\/jboss-wildfly-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2014\/08\/spring-batch-as-wildfly-module.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Spring Batch as Wildfly Module"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/d8791115988e922dbffae8d09223a72e","name":"Roberto Cortez","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/3b40fa2b3df6cfc7ad81ed1509ed2a17fe6a200e409fb0aa8d9e2ab72b64b684?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/3b40fa2b3df6cfc7ad81ed1509ed2a17fe6a200e409fb0aa8d9e2ab72b64b684?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3b40fa2b3df6cfc7ad81ed1509ed2a17fe6a200e409fb0aa8d9e2ab72b64b684?s=96&d=mm&r=g","caption":"Roberto Cortez"},"description":"My name is Roberto Cortez and I was born in Venezuela, but I have spent most of my life in Coimbra \u2013 Portugal, where I currently live. I am a professional Java Developer working in the software development industry, with more than 8 years of experience in business areas like Finance, Insurance and Government. I work with many Java based technologies like JavaEE, Spring, Hibernate, GWT, JBoss AS and Maven just to name a few, always relying on my favorite IDE: IntelliJ IDEA. Most recently, I became a Freelancer \/ Independent Contractor. My new position is making me travel around the world (an old dream) to customers, but also to attend Java conferences. The direct contact with the Java community made me want to become an active member in the community itself. For that reason, I have created the Coimbra Java User Group, started to contribute to Open Source on Github and launched my own blog (www.radcortez.com), so I can share some of the knowledge that I gained over the years.","sameAs":["http:\/\/www.radcortez.com\/","https:\/\/www.facebook.com\/radcortez","https:\/\/www.linkedin.com\/in\/radcortez","https:\/\/x.com\/https:\/\/twitter.com\/radcortez"],"url":"https:\/\/www.javacodegeeks.com\/author\/roberto-cortez"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/28485","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/592"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=28485"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/28485\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/13842"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=28485"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=28485"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=28485"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}