spring batch_Spring Batch作为Wildfly模块

spring batch

长期以来,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

spring batch

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

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

相关文章

h3c 链路聚合测试_良无磐石固,虚名复何益?- 链路聚合协议互通测试

一、描述链路聚合是将多条链路聚合在一起形成一个汇聚组&#xff0c;以实现负荷在各成员链路中的分担&#xff0c;同时也提供了更高的连接可靠性。Cisco的链路聚合有几种方式&#xff1a;手工、LACP(包括active和passive两种)、PAgP(Port-aggregation Protocol)&#xff0c;其中…

Spring@懒惰注释

介绍&#xff1a; 默认情况下&#xff0c; Spring框架在应用程序启动时加载并热切初始化所有bean。 在我们的应用程序中&#xff0c;我们可能有一些非常消耗资源的bean。 我们宁愿根据需要加载此类bean。 我们可以使用Spring Lazy批注实现此目的 。 在本教程中&#xff0c;我们…

变压器符号_行输出变压器的结构、符号及电路分析

行输出变压器又称逆程变压器、回扫变压器&#xff0c;俗称行输出&#xff0c;它是电视机、显示器中的一个重要变压器。1.行输出变压器结构行输出变压器的全部绕组和高压整流管均密封在其中&#xff0c;底部引出各个绕组的引脚&#xff0c;高压输出采用高压引线直接送至显像管的…

西南医院微服务咋查得到_#全国最好医院排行榜#发布:成都这4家牛了!四川31个专科排全国前十(总榜)...

病急不能乱投医&#xff01;近日&#xff0c;一年一度、令人期待的——复旦版《2018年度中国医院排行榜&#xff08;总榜&#xff09;》全新揭晓了~这份榜单不仅是是中国医院学科建设的一个标杆也是大众疑难杂症寻找好医院的重要参考四川4家医院入百强&#xff01;华西全国第二…

jit 和 jvm_关于JVM和JIT的一点点

jit 和 jvm如您所知&#xff0c;JVM&#xff08;Java Virtusal Machine&#xff09;使Java能够遵循“一次写入&#xff0c;随处运行”的范例。 JVM的核心包括以下组件&#xff1a; 堆 叠放 PermGen和方法区域 JIT编译器 代码缓存 堆是在应用程序代码开发阶段为您使用的每…

voxelnet_ue4商城资源Voxel Sandbox Toolkit体素沙盒工具箱

Unreal Engine虚幻游戏引擎素材资源 Unreal Engine Marketplace –Voxel Sandbox Toolkit体素沙盒工具箱体素沙盒工具箱是一个新的改进版本的体素生成从2016年适应4.22的需要。它用不同类型的立方体、树和拾取网格生成无限世界。因为额外的代码实现比以前的版本快得多。理想的创…

Pub / Sub本地模拟器

发布/订阅是GCP提供的不错的工具。 它非常方便&#xff0c;可以帮助您解决应用程序可能面临的消息传递难题。 实际上&#xff0c;如果您使用GCP&#xff0c;则可以使用托管消息解决方案。 如预期的那样&#xff0c;使用实际的发布/订阅解决方案需要一定的配额&#xff0c;因此…

mysql 写入随机字中文符_MySQL产生随机字符

MySQL产生随机字符UUID简介UUID含义是通用唯一识别码 (Universally Unique Identifier)&#xff0c;这是一个软件建构的标准&#xff0c;也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份…

mysql建表时外检怎么创建_MySQL创建表时加入的约束以及外键约束的的意义

1&#xff0c;创建表时加入的约束a) 非空约束&#xff0c;not nullb) 唯一约束&#xff0c;uniquec) 主键约束&#xff0c;primary keyd) 外键约束&#xff0c;foreign key1&#xff0c;非空约束&#xff0c;针对某个字段设置其值不为空&#xff0c;如&#xff1a;学生的姓名不…

minecraft_MineCraft和堆外内存

minecraft总览 MineCraft是一个很好的例子&#xff0c;说明何时使用堆外内存确实可以提供帮助。 关键要求是&#xff1a; 保留的数据大部分是一个简单的数据结构&#xff08;在Minecraft的情况下&#xff0c;其很多字节[]&#xff09; 堆外内存的使用可以隐藏在抽象中。 考试…

win2008 mysql_mysql5.7.17在win2008R2的64位系统安装与配置实例

脚本之家已经给大家讲解过MYSQL其他版本在各种环境中的安装过程&#xff0c;大家可以参阅正文下面的相关文章&#xff0c;今天一起来学习下mysql5.7.17的实例安装教学&#xff0c;配置上稍微不同&#xff0c;希望能够帮助到你。安装MySql操作系统&#xff1a;Windows Server 20…

结构性错误

团队成员在使用以下代码时遇到了麻烦&#xff1a; void extractData(String targetUri) { Path tempFile createTempFilePath(); extractDataToPathAndUpload(tempFile, targetUri); cleanUp(tempFile); } void extractDataToPathAndUpload(Path tempFile, String targetUr…

mysql小计_使用SQL实现小计,合计以及排序_MySQL

bitsCN.com--说明&#xff1a;个人学习笔记&#xff0c;实现小计合计显示&#xff0c;分组按BANK_IDOP_DATE升序排序--测试数据CREATE TABLE #TB(ID VARCHAR(10),BANK_ID VARCHAR(10),OP_DATE VARCHAR(10),OPERATOR_NO VARCHAR(20),AMT DECIMAL(10,2))INSERT #TB SELECT 1111,0…

mysql函数封装_PHP访问MYSQL数据库封装类(附函数说明)

/*MYSQL 数据库访问封装类MYSQL 数据访问方式&#xff0c;php4支持以mysql_开头的过程访问方式&#xff0c;php5开始支持以mysqli_开头的过程和mysqli面向对象访问方式&#xff0c;本封装类以mysql_封装数据访问的一般流程&#xff1a;1,连接数据库 mysql_connect or mysql_pco…

mule和activemq_Mule ESB,ActiveMQ和DLQ

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

MySQL倒序如何避免filesort_如何避免mysql查询的filesort?

我用不同的参数使用这种查询&#xff1a;EXPLAIN SELECT SQL_NO_CACHE ilan_genel.id , ilan_genel.durum , ilan_genel.kategori , ilan_genel.tip , ilan_genel.ozellik , ilan_genel.m2 , ilan_genel.fiyat , ilan_genel.baslik , ilan_genel.ilce , ilan_genel.parabirimi …

在Java中键入Safe SQL

字符串&#xff0c;字符串&#xff0c;字符串 无论您使用的是JPA &#xff0c; MyBatis还是Spring Data JDBC之类的框架&#xff0c;最终都将SQL语句声明为Java String。 这种方法的问题在于&#xff0c;您必须为每个语句编写测试&#xff0c;以确保它甚至是有效的SQL。 没有编…

springmvc怎么设置更改了界面不用重启_Microsoft Visual Studio 2019 更改语言包

第一次写文章&#xff0c;如有格式等问题&#xff0c;请多多包含与指点&#xff01;很多人在编程时更喜欢英文界面&#xff0c;认为与编程语言具有相同的语境&#xff0c;更顺手。但是&#xff0c;在更改环境显示语言时&#xff0c;可能会遇到一些障碍&#xff0c;例如我之前在…

苹果电脑怎么删除软件_误格式化,删除文件怎么恢复?3款最好用的数据恢复软件推荐...

1、EasyRecovery一款威力非常强大的硬盘数据恢复工具&#xff0c;能够恢复丢失的数据以及重建文件系统。主要体现在可以从被病毒破坏或是已经格式化的硬盘中恢复数据。EasyRecovery在使用过程中不会在原始的驱动器中写入任何东西&#xff0c;其主要是在内存中重建文件分区表使数…

设计模式 生成器_生成器设计模式的应用

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