Spring Batch作为Wildfly模块

长期以来,Java EE规范缺少批处理API。 今天,这对于企业应用程序来说是必不可少的。 这是最后固定与JSR-352批处理应用程序的Java平台现在的Java EE提供7 JSR-352得到了它的的灵感Spring Batch的对手。 两者涵盖相同的概念,尽管生成的API有所不同。

由于Spring团队也参与了JSR-352的合作,因此他们提供基于Spring Batch的实现只是时间问题。 Spring Batch的最新主版本(版本3)现在支持JSR-352 。

我是Spring Batch的用户很多年了,我一直很喜欢该技术具有一组有趣的内置读写器。 这些使您可以执行批处理所需的最常见操作。 您需要从数据库读取数据吗? 您可以使用JdbcCursorItemReader ,如何以固定格式写入数据? 使用FlatFileItemWriter ,依此类推。

不幸的是, JSR-352实现没有Spring Batch中可用的读写器数量。 我们必须记住, JSR-352是非常新的,没有时间跟上。 jBeret ( JSR-352的Wildfly实现)已经提供了一些自定义的读取器和写入器。

重点是什么?

我希望在最新版本中,也可以使用原始Spring Batch中的所有读者和作家。 目前还不是这样,因为需要大量工作,但是已经计划在将来的版本中提供它们。 这将使我们能够将本地Spring Batch应用程序迁移到JSR-352中 。 我们仍然存在实现供应商锁定的问题,但是在某些情况下这可能很有趣。

动机

我是JSR-352规范中的Java EE示例的主要测试贡献者之一。 我想弄清楚使用Spring Batch实现,我实现的测试是否具有相同的行为。 我们该怎么做?

我认为该练习不仅因为原始动机而有趣,而且对于了解Wildfly上的模块和类加载也很有用。 首先,我们需要决定如何部署所需的Spring Batch依赖项。 我们可以直接在应用程序中部署它们,也可以使用Wildfly模块。 模块的优点是可以直接捆绑到应用程序服务器中,并且可以被所有已部署的应用程序重用。

使用Maven添加Wildfly模块

通过一些工作,可以使用Wildfly Maven插件和CLI(命令行)自动添加模块。 让我们开始创建两个文件,它们代表创建和删除模块所需的CLI命令:

wildfly-add-spring-batch.cli

wildfly-add-spring-batch.cli

# Connect to Wildfly instance
connect# Create Spring Batch Module
# If the module already exists, Wildfly will output a message saying that the module already exists and the script exits.
module add \--name=org.springframework.batch \--dependencies=javax.api,javaee.api \--resources=${wildfly.module.classpath}

模块--name很重要。 我们将需要它在我们的应用程序中引用它。 --resources--resources ,因为您需要为所有必需的模块依赖项指定完整的类路径,但是在接下来的几步中,我们将生成路径。

wildfly-remove-spring-batch.cli

wildfly-remove-spring-batch.cli

# Connect to Wildfly instance
connect# Remove Oracle JDBC Driver Module
module remove --name=org.springframework.batch

注意wildfly.module.classpath 。 该属性将保存所需的Spring Batch依赖项的完整类路径。 我们可以使用Maven Dependency插件生成它:

pom-maven-dependency-plugin.xml

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><version>${version.plugin.dependency}</version><executions><execution><phase>generate-sources</phase><goals><goal>build-classpath</goal></goals><configuration><outputProperty>wildfly.module.classpath</outputProperty><pathSeparator>:</pathSeparator><excludeGroupIds>javax</excludeGroupIds><excludeScope>test</excludeScope><includeScope>provided</includeScope></configuration></execution></executions>
</plugin>

这将选择所有依赖项(包括传递性),排除javax (因为它们已经存在于Wildfly中 )并排除test范围依赖项。 对于Spring Batch,我们需要以下依赖项:

pom-dependencies.xml

<!-- Needed for Wildfly module -->
<dependency><groupId>org.springframework.batch</groupId><artifactId>spring-batch-core</artifactId><version>3.0.0.RELEASE</version><scope>provided</scope>
</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>4.0.5.RELEASE</version><scope>provided</scope>
</dependency><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version><scope>provided</scope>
</dependency><dependency><groupId>org.hsqldb</groupId><artifactId>hsqldb</artifactId><version>2.3.2</version><scope>provided</scope>
</dependency>

现在,我们需要替换文件中的属性。 让我们使用Maven资源插件 :

pom-maven-resources-plugin.xml

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>${version.plugin.resources}</version><executions><execution><id>copy-resources</id><phase>process-resources</phase><goals><goal>copy-resources</goal></goals><configuration><outputDirectory>${basedir}/target/scripts</outputDirectory><resources><resource><directory>src/main/resources/scripts</directory><filtering>true</filtering></resource></resources></configuration></execution></executions>
</plugin>

这将过滤配置的文件,并将属性wildfly.module.classpath替换为我们先前生成的值。 这是一个指向本地Maven存储库中依赖项的类路径。 现在,使用Wildfly Maven插件,我们可以执行以下脚本(您需要运行Wildfly ):

pom-maven-wildfly-plugin.xml

<plugin><groupId>org.wildfly.plugins</groupId><artifactId>wildfly-maven-plugin</artifactId><version>${version.plugin.wildfly}</version><configuration><skip>false</skip><executeCommands><batch>false</batch><scripts><!--suppress MavenModelInspection --><script>target/scripts/${cli.file}</script></scripts></executeCommands></configuration>
</plugin>

这些配置文件:

pom-profiles.xml

<profiles><profile><id>install-spring-batch</id><properties><cli.file>wildfly-add-spring-batch.cli</cli.file></properties></profile><profile><id>remove-spring-batch</id><properties><cli.file>wildfly-remove-spring-batch.cli</cli.file></properties></profile>
</profiles>

(有关pom.xml的完整内容,请pom.xml 此处 )

我们可以通过执行以下命令添加模块:
mvn process-resources wildfly:execute-commands -P install-spring-batch

或通过执行以下命令删除模块:
mvn wildfly:execute-commands -P remove-spring-batch

该策略适用于要在Wildfly中创建的任何模块。 考虑添加JDBC驱动程序。 通常,您使用模块将其添加到服务器中,但是我发现的所有文档始终都是手动过程。 这对于CI构建非常有用,因此您可以拥有设置环境所需的一切。

使用Spring-Batch

好的,我的模块在那里,但是如何指示Wildfly代替jBeret使用它呢? 我们需要在应用程序的META-INF文件夹中添加以下文件:

jboss-deployment-structure.xml

jboss-deployment-structure.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure><deployment><exclusions><module name="org.wildfly.jberet"/><module name="org.jberet.jberet-core"/></exclusions><dependencies><module name="org.springframework.batch" services="import" meta-inf="import"/></dependencies></deployment>
</jboss-deployment-structure>

由于JSR-352使用服务加载程序加载实现,因此唯一可能的结果是加载org.springframework.batch模块中指定的服务。 您的批处理代码现在将与Spring Batch实现一起运行。

测试中

github存储库代码中有Arquillian示例测试来演示行为。 检查下面的参考资料部分。

资源资源

您可以从我的github存储库中克隆完整的工作副本。 您可以在此处找到说明进行部署。

野蝇–Spring批

由于我将来可能会修改代码,因此您可以从1.0版中下载本文的原始源。 或者,克隆存储库,并使用以下命令从发行版1.0中检出标记: git checkout 1.0

未来

我仍然需要将此应用于Java EE示例 。 在我的待办事项清单上。

翻译自: https://www.javacodegeeks.com/2014/08/spring-batch-as-wildfly-module.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springCloud Eureka 注册中心原理及配置理解(一)

Eureka 原理与步骤原理&#xff1a;服务提供方启动后将注册到 注册中心&#xff0c;提供IP, 名字&#xff0c;什么服务等信息&#xff0c;服务调用方作为客户端注册到注册中心后&#xff0c;拉取注册中心的服务列表&#xff0c;在通过负载均衡调用对应的服务提供方。注册中心可…

react系列教程

这个系列将从基础语法讲起&#xff0c;把react全家桶都讲到&#xff0c;然后到具体的使用&#xff0c;最后完成后&#xff0c;会写一个完整的demo。 前置要求&#xff1a; 基本的CSS&#xff0c;JS要熟练。 部分ES6语法需要了解。可以参考下面提到的阮一峰老师的《ECMAScript …

解决DataGridView绑定List后不能排序的问题

阅读全文并下载例子 &#xff1a;http://www.sufeinet.com/forum.php?modviewthread&tid190 以前不都是用table直接绑定DataGridView的&#xff0c;没有出现过不能排序的问题&#xff0c;初试List结果发现不管怎么样都不能实现排序的功能&#xff0c;有朋友说 DataGridVie…

maven编译的时候排除junit测试类

maven编译的时候排除junit测试类 maven项目中使用junit进行单元测试&#xff0c;在进行编译的时候&#xff0c;可以通过2种方式排除test测试类的编译。 有2种方式 &#xff1a; 使用命令的时候带上参数 mvn install -Dmaven.test.skiptrue 在pom.xml里面配置<plugins><…

生成器设计模式的应用

嗨&#xff0c;您好&#xff01; 今天&#xff0c;我将分享我制作的全新设计模式系列的第一个。 构建器设计模式是开发严肃的应用程序时非常有用且通用的模式。 在这篇文章中&#xff0c;我将提供一个很小的构建器模式框架&#xff0c;因此您随时可以回到这里并使用它。 助记…

知识整理2019清北学堂提高储备D5

今天主讲图论。 前言&#xff1a;图的定义&#xff1a;图G是一个有序二元组(V,E)&#xff0c;其中V称为顶集(Vertices Set)&#xff0c;E称为边集(Edges set)&#xff0c;E与V不相交。它们亦可写成V(G)和E(G)。 一、图的存储&#xff1a; 1、邻接矩阵&#xff1a; 2、邻接表&am…

IIFE(立即执行函数表达式)

我们经常会看到这样的写法&#xff1a; ;(fuction () {// do something })() 这就是一个简单的IIFE&#xff08;立即执行函数表达式&#xff0c;immediately-invoked function expression&#xff09;了。 这样的写法有什么好处呢&#xff1f;来简单分析一下。 1. 开头的分…

中文(英译) 爱情一句话哲理

⊙ 宁可失败在你喜欢的事情上&#xff0c;也不要成功在你所憎恶的事情上。 To lost in something you love is better than to win in something you hate.   ⊙ 幸福&#xff0c;不是长生不老&#xff0c;不是大鱼大肉&#xff0c;不是权倾朝野。幸福是每一个微小的生活愿望…

CSS之文字溢出处理

1.单行文本之三剑客<p>刘诗诗&#xff0c;原名刘诗施&#xff0c;1987年3月10日出生于北京市&#xff0c;中国内地影视女演员、影视出品人。</p>p{border: 1px solid red;width: 400px;height: 40px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis…

JavaFX技巧5:可观察

即使在整个NSA监视的这段时间&#xff0c;实现JavaFX控件时也要牢记可观察性&#xff0c;这仍然是一个好主意。 与Swing相比&#xff0c;这在JavaFX中很容易实现。 旧时光 来自Swing&#xff0c;我习惯于花费大量精力和时间来使自定义控件变得可观察。 通常需要添加方法来添加…

this到底指向哪里

this指向调用它的对象 首先要明确&#xff0c;this指向调用方&#xff0c;谁调用&#xff0c;this指向谁。 直接调用 举个栗子&#xff1a; var test window ; function testThis () {var test inner;this.test test change;console.log(this.test) } testThis(); // te…

GA,RC,Alpha,Beta,Final等软件版本名词释义

对应上图的表格如下&#xff1a; 名词&#xff01;说明Alphaα是希腊字母的第一个&#xff0c;表示最早的版本&#xff0c;内部测试版&#xff0c;一般不向外部发布&#xff0c;bug会比较多&#xff0c;功能也不全&#xff0c;一般只有测试人员使用。Betaβ是希腊字母的第二个&…

HawtIO在JBoss EAP上(第二部分)

我刚刚发布了一篇关于在JBoss Wildfly 8.1上运行HawtIO的条目 。 从那篇文章中&#xff0c;您将了解HawtIO多么出色 &#xff0c;以及它必须具备的所有 出色 插件&#xff0c;才能从单个仪表板管理基于JVM的技术……好吧…… hawt ……。 但是&#xff0c;出于上一篇文章中概述…

Linux命令行中执行多个命令

[rootlocalhost /]# date;date;date 2019年 05月 03日 星期五 09:08:37 CST 2019年 05月 03日 星期五 09:08:37 CST 2019年 05月 03日 星期五 09:08:37 CST [rootlocalhost /]# date&& data&&date 2019年 05月 03日 星期五 09:09:03 CST -bash: data: 未找到命…

JS设计模式(13)状态模式

什么是状态模式&#xff1f; 定义&#xff1a;将事物内部的每个状态分别封装成类&#xff0c;内部状态改变会产生不同行为。 主要解决&#xff1a;对象的行为依赖于它的状态&#xff08;属性&#xff09;&#xff0c;并且可以根据它的状态改变而改变它的相关行为。 何时使用…

Save info in Hidden Field

Hidden fields are used to store data at the page level protected System.Web.UI.HtmlControls.HtmlInputHidden Hidden1; //to assign a value to Hidden field Hidden1.Value"Create hidden fields"; //to retrieve a value string strHidden1.Value; 转载于:ht…

课堂测试

package 测试;import java.util.Scanner;class ScoreInformation {private String stunumber;private String name;private double mathematicsscore;private double englishiscore;private double networkscore;private double databasescore;private double softwarescore;…

Mule ESB,ActiveMQ和DLQ

在本文中&#xff0c;我将展示一个简单的Mule ESB流程&#xff0c;以了解实际中使用的Active MQ 的DLQ功能 。 我假设您有一个正在运行的Apache ActiveMQ实例&#xff08;如果没有&#xff0c;则可以在此处下载一个版本&#xff09;。 在此示例中&#xff0c;我使用了Mule ESB…

JS设计模式(2)策略模式

什么是策略模式&#xff1f; 定义&#xff1a;根据不同参数可以命中不同的策略 主要解决&#xff1a;在有多种算法相似的情况下&#xff0c;使用 if...else 所带来的复杂和难以维护。 何时使用&#xff1a;有许多种情况&#xff0c;而区分它们的只是他们直接的行为。 如何解…

C#中使用多线程访问Winform问题解决方案

我们在做winform应用的时候&#xff0c;大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题&#xff0c;下面我将详细的介绍。 首先来看传统方法&#xff1a; public partial class Form1 : Form{public Form1(){InitializeCompon…