﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-paulwong-随笔分类-SRPING BATCH</title><link>http://www.blogjava.net/paulwong/category/52669.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 23 Mar 2021 03:20:50 GMT</lastBuildDate><pubDate>Tue, 23 Mar 2021 03:20:50 GMT</pubDate><ttl>60</ttl><item><title>csv 文件打开乱码，有哪些方法可以解决？</title><link>http://www.blogjava.net/paulwong/archive/2021/03/23/435832.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 23 Mar 2021 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/03/23/435832.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435832.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/03/23/435832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435832.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435832.html</trackback:ping><description><![CDATA[Excel 在读取 csv 的时候是通过读取文件头上的 bom 来识别编码的，这导致如果我们生成 csv 文件的平台输出无 bom 头编码的 csv 文件（例如 utf-8 ，在标准中默认是可以没有 bom 头的），Excel 只能自动按照默认编码读取，不一致就会出现乱码问题了。<br /><br />掌握了这点相信乱码已经无法阻挡我们前进的步伐了：只需将不带 bom 头编码的 csv 文件，用文本编辑器（工具随意，推荐 notepad++ ）打开并转换为带 bom 的编码形式（具体编码方式随意），问题解决。<br /><br />当然，如果你是像我一样的码农哥哥，在生成 csv 文件的时候写入 bom 头更直接点，用户会感谢你的。<br /><br />附录：对于 utf-8 编码，unicode 标准中是没有 bom 定义的，微软在自己的 utf-8 格式的文本文件之前加上了EF BB BF三个字节作为识别此编码的 bom 头，这也解释了为啥大部分乱码都是 utf-8 编码导致的原因<br /><br />SPRING BATCH中生成CSV文件时的解决方案：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">new</span>&nbsp;FlatFileItemWriterBuilder&lt;T&gt;()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.name(itemWriterName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.resource(outputResource)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.lineAggregator(lineAggregator)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.headerCallback(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h&nbsp;-&gt;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(header);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h.write('\uFEFF');<span style="color: #008000; ">//</span><span style="color: #008000; ">只需加这一行</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h.write(header);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.build();</div><br /><a href="https://stackoverflow.com/questions/48952319/send-csv-file-encoded-in-utf-8-with-bom-in-java" target="_blank">https://stackoverflow.com/questions/48952319/send-csv-file-encoded-in-utf-8-with-bom-in-java</a><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-03-23 10:30 <a href="http://www.blogjava.net/paulwong/archive/2021/03/23/435832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING BATCH中STEP如果没加TRANSACTION MANAGER</title><link>http://www.blogjava.net/paulwong/archive/2020/03/16/435267.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 16 Mar 2020 01:43:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/03/16/435267.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435267.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/03/16/435267.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435267.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435267.html</trackback:ping><description><![CDATA[这时发现如果处理总数足够大时，被处理的ITEMS总数会少于应该处理的总数。<br /><br /><div>+------------+--------------+-------------+-----------------+------------------+--------------------+----------------+-----------+-------------------------</div><div>&nbsp;| READ_COUNT | FILTER_COUNT | WRITE_COUNT | READ_SKIP_COUNT | WRITE_SKIP_COUNT | PROCESS_SKIP_COUNT | ROLLBACK_COUNT | EXIT_CODE | EXIT_MESSAGE</div><div>-+------------+--------------+-------------+-----------------+------------------+--------------------+----------------+-----------+-------------------------</div><div>&nbsp;|&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1 |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 | COMPLETED |</div><div>&nbsp;|&nbsp; &nbsp; &nbsp; 30006 |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 |&nbsp; &nbsp; &nbsp; &nbsp;29947 |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;59 |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;61 | COMPLETED | Waited for 101 results.</div><div><br />如上面的总数是30006，但COMMIT的总数是29947，有59个被跳过了。<br /><br />因此需在STEP上加TRANSACTION MANAGER.<br /><br /><a href="https://stackoverflow.com/questions/42803941/spring-batch-incorrect-write-skip-count-issue" target="_blank">https://stackoverflow.com/questions/42803941/spring-batch-incorrect-write-skip-count-issue</a><br /><br /></div><img src ="http://www.blogjava.net/paulwong/aggbug/435267.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-03-16 09:43 <a href="http://www.blogjava.net/paulwong/archive/2020/03/16/435267.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 Spring Batch 构建企业级批处理应用-2</title><link>http://www.blogjava.net/paulwong/archive/2020/03/06/435226.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 06 Mar 2020 05:47:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/03/06/435226.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435226.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/03/06/435226.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435226.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435226.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前言在本系列文章的第 1 部分，我们搭建了一个用户缴费通知的批处理任务。尽管这个简单的应用展现了 Spring Batch 的基本功能，但是它与真实的应用相去甚远。在实际应用中，我们的 Job 可能必须要包含多个 Step，为了提高性能，我们可能需要考虑 Job 的并发问题。Spring Batch 在这些方面又提供了哪些好的特性呢？让我们继续。Step Flow通过前文我们已经知道，Step 是...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2020/03/06/435226.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/435226.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-03-06 13:47 <a href="http://www.blogjava.net/paulwong/archive/2020/03/06/435226.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 Spring Batch 构建企业级批处理应用-1</title><link>http://www.blogjava.net/paulwong/archive/2020/03/06/435225.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 06 Mar 2020 05:45:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/03/06/435225.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435225.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/03/06/435225.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435225.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435225.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 引言总述本系列文章旨在通过示例搭建以及特性介绍，详细讲述如何利用 Spring Batch 开发企业批处理应用。本系列文章共分为三部分，第一部分初步介绍了批处理以及 Spring Batch 的相关概念，同时搭建了一个简单的基于 Spring Batch 的批处理应用。第二部分介绍了 Step Flow 以及并发支持。第三部分则主要介绍了 Spring Batch 对任务监控的支持。下面让我们进入...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2020/03/06/435225.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/435225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-03-06 13:45 <a href="http://www.blogjava.net/paulwong/archive/2020/03/06/435225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置SPRING BATCH中的JUNIT TEST</title><link>http://www.blogjava.net/paulwong/archive/2020/02/03/435063.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 03 Feb 2020 08:47:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/02/03/435063.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435063.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/02/03/435063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435063.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435063.html</trackback:ping><description><![CDATA[关键是JobLauncherTestUtils的配置：<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp; @Configuration<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;BatchTestConfiguration&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;JobLauncherTestUtils&nbsp;stoppedReportJobLauncherTestUtils(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JobLauncher&nbsp;stoppedReportJobLauncher<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JobLauncherTestUtils()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setJobLauncher(JobLauncher&nbsp;stoppedReportJobLauncher)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">super</span>.setJobLauncher(stoppedReportJobLauncher);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setJob(Job&nbsp;stoppedReportJob)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">super</span>.setJob(stoppedReportJob);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-02-03 16:47 <a href="http://www.blogjava.net/paulwong/archive/2020/02/03/435063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Transform RemoteChunk to remote with json format in Spring Batch</title><link>http://www.blogjava.net/paulwong/archive/2020/01/21/435048.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 21 Jan 2020 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/01/21/435048.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435048.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/01/21/435048.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435048.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435048.html</trackback:ping><description><![CDATA[Spring Batch Remote Chunk模式下，远程执行JOB时，传输的对象是ChunkRequest/ChunkResponse，无法转成JSON格式传输。<br />
<br />
注意此处使用的是SPRING JACKSON，而不是JACKSON。一般是在SPRING INTEGRATIONA框架下转的。<br />
<br />
需要自定义Transformer：<br />
<br />
JsonToChunkRequestTransformer.java<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">package</span>&nbsp;com.frandorado.springbatchawsintegrationslave.transformer;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.io.IOException;<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.util.Collection;<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.util.Map;<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.util.stream.IntStream;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.batch.core.ExitStatus;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.batch.core.StepContribution;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.batch.core.StepExecution;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.batch.integration.chunk.ChunkRequest;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.annotation.Autowired;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.aws.support.AwsHeaders;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.json.JsonToObjectTransformer;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.messaging.Message;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Component;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.amazonaws.services.sqs.AmazonSQSAsync;<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.fasterxml.jackson.databind.ObjectMapper;<br />
<br />
@Component<br />
<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;JsonToChunkRequestTransformer&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;JsonToObjectTransformer&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;MESSAGE_GROUP_ID_HEADER&nbsp;=&nbsp;"message-group-id";<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />
&nbsp;&nbsp;&nbsp;&nbsp;AmazonSQSAsync&nbsp;amazonSQSAsync;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;Object&nbsp;doTransform(Message&lt;?&gt;&nbsp;message)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;ACK</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ack(message);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>.getMessageBuilderFactory().withPayload(buildChunkRequest(message)).setHeader(MESSAGE_GROUP_ID_HEADER,&nbsp;"unique").build();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;ChunkRequest&nbsp;buildChunkRequest(Message&lt;?&gt;&nbsp;message)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ObjectMapper().readValue(message.getPayload().toString(),&nbsp;Map.<span style="color: #0000FF; ">class</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;stepContributionMap&nbsp;=&nbsp;(Map)&nbsp;map.get("stepContribution");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;exitStatusMap&nbsp;=&nbsp;(Map)&nbsp;stepContributionMap.get("exitStatus");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StepContribution&nbsp;stepContribution&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StepContribution(<span style="color: #0000FF; ">new</span>&nbsp;StepExecution("null",&nbsp;<span style="color: #0000FF; ">null</span>));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExitStatus&nbsp;exitStatus&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ExitStatus((String)&nbsp;exitStatusMap.get("exitCode"),&nbsp;(String)&nbsp;exitStatusMap.get("exitDescription"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntStream.range(0,&nbsp;(Integer)&nbsp;stepContributionMap.get("readCount")).forEach(e&nbsp;-&gt;&nbsp;stepContribution.incrementReadCount());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stepContribution.incrementWriteCount((Integer)&nbsp;stepContributionMap.get("writeCount"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stepContribution.incrementFilterCount((Integer)&nbsp;stepContributionMap.get("filterCount"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stepContribution.incrementReadSkipCount((Integer)&nbsp;stepContributionMap.get("readSkipCount"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntStream.range(0,&nbsp;(Integer)&nbsp;stepContributionMap.get("writeSkipCount")).forEach(e&nbsp;-&gt;&nbsp;stepContribution.incrementWriteSkipCount());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntStream.range(0,&nbsp;(Integer)&nbsp;stepContributionMap.get("processSkipCount"))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.forEach(e&nbsp;-&gt;&nbsp;stepContribution.incrementProcessSkipCount());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stepContribution.setExitStatus(exitStatus);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ChunkRequest((Integer)&nbsp;map.get("sequence"),&nbsp;(Collection)&nbsp;map.get("items"),&nbsp;(Integer)&nbsp;map.get("jobId"),&nbsp;stepContribution);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;ack(Message&lt;?&gt;&nbsp;message)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;receiptHandle&nbsp;=&nbsp;message.getHeaders().get(AwsHeaders.RECEIPT_HANDLE,&nbsp;String.<span style="color: #0000FF; ">class</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;queue&nbsp;=&nbsp;message.getHeaders().get(AwsHeaders.QUEUE,&nbsp;String.<span style="color: #0000FF; ">class</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;queueUrl&nbsp;=&nbsp;amazonSQSAsync.getQueueUrl(queue).getQueueUrl();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amazonSQSAsync.deleteMessage(queueUrl,&nbsp;receiptHandle);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</div>
<br />
<br />
<div>JsonToChunkResponseTransformer.java</div>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">package</span>&nbsp;com.frandorado.springbatchawsintegrationmaster.transformer;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.io.IOException;<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.util.Map;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.batch.core.StepContribution;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.batch.core.StepExecution;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.batch.integration.chunk.ChunkResponse;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.json.JsonToObjectTransformer;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.messaging.Message;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Component;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.fasterxml.jackson.databind.ObjectMapper;<br />
<br />
@Component<br />
<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;JsonToChunkResponseTransformer&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;JsonToObjectTransformer&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;Object&nbsp;doTransform(Message&lt;?&gt;&nbsp;message)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;buildChunkResponse(message);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;ChunkResponse&nbsp;buildChunkResponse(Message&lt;?&gt;&nbsp;message)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ObjectMapper().readValue(message.getPayload().toString(),&nbsp;Map.<span style="color: #0000FF; ">class</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;jobId&nbsp;=&nbsp;(Integer)&nbsp;map.get("jobId");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;sequence&nbsp;=&nbsp;(Integer)&nbsp;map.get("sequence");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;messageContent&nbsp;=&nbsp;(String)&nbsp;map.get("message");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Boolean&nbsp;status&nbsp;=&nbsp;(Boolean)&nbsp;map.get("successful");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StepContribution&nbsp;stepContribution&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StepContribution(<span style="color: #0000FF; ">new</span>&nbsp;StepExecution("-",&nbsp;<span style="color: #0000FF; ">null</span>));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ChunkResponse(status,&nbsp;sequence,&nbsp;Long.valueOf(jobId),&nbsp;stepContribution,&nbsp;messageContent);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</div>
<br />
<br />
还有一种方式，就是如果第三类不支持转JSON，即代码里没有JACKSON的注解，可以采用MIXIN的方式：<br />
<br />StepExecutionJacksonMixIn.java<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;org.springframework.cloud.dataflow.rest.client.support;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;com.fasterxml.jackson.annotation.JsonCreator;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.fasterxml.jackson.annotation.JsonIgnoreProperties;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.fasterxml.jackson.annotation.JsonProperty;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.batch.core.StepExecution;<br /><br /><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;Jackson&nbsp;MixIn&nbsp;for&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;StepExecution}&nbsp;de-serialization.<br />&nbsp;*<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;Gunnar&nbsp;Hillert<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@since</span><span style="color: #008000; ">&nbsp;1.0<br />&nbsp;</span><span style="color: #008000; ">*/</span><br />@JsonIgnoreProperties({&nbsp;"jobExecution",&nbsp;"jobParameters",&nbsp;"jobExecutionId",&nbsp;"skipCount",&nbsp;"summary"&nbsp;})<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">abstract</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;StepExecutionJacksonMixIn&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@JsonCreator<br />&nbsp;&nbsp;&nbsp;&nbsp;StepExecutionJacksonMixIn(@JsonProperty("stepName")&nbsp;String&nbsp;stepName)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div>
<br />在配置文件中注册才能使用：<br /><div>JacksonConfiguration.java<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;java.util.Locale;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.TimeZone;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.batch.core.ExitStatus;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.batch.core.JobExecution;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.batch.core.JobInstance;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.batch.core.JobParameter;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.batch.core.JobParameters;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.batch.core.StepExecution;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.batch.item.ExecutionContext;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Bean;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Configuration;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.support.json.Jackson2JsonObjectMapper;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;com.fasterxml.jackson.databind.ObjectMapper;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.fasterxml.jackson.datatype.jdk8.Jdk8Module;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.novacredit.bmb.batchmonitor.springbatch.common.batch.jackson.ISO8601DateFormatWithMilliSeconds;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.novacredit.bmb.batchmonitor.springbatch.common.batch.jackson.mixin.ExecutionContextJacksonMixIn;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.novacredit.bmb.batchmonitor.springbatch.common.batch.jackson.mixin.ExitStatusJacksonMixIn;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.novacredit.bmb.batchmonitor.springbatch.common.batch.jackson.mixin.JobExecutionJacksonMixIn;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.novacredit.bmb.batchmonitor.springbatch.common.batch.jackson.mixin.JobInstanceJacksonMixIn;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.novacredit.bmb.batchmonitor.springbatch.common.batch.jackson.mixin.JobParameterJacksonMixIn;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.novacredit.bmb.batchmonitor.springbatch.common.batch.jackson.mixin.JobParametersJacksonMixIn;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.novacredit.bmb.batchmonitor.springbatch.common.batch.jackson.mixin.StepExecutionJacksonMixIn;<br /><br />@Configuration<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;JacksonConfiguration&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Jackson2JsonObjectMapper&nbsp;jackson2JsonObjectMapper(ObjectMapper&nbsp;objectMapper)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Jackson2JsonObjectMapper(objectMapper);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Jackson2ObjectMapperBuilderCustomizer&nbsp;dataflowObjectMapperBuilderCustomizer()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(builder)&nbsp;-&gt;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.dateFormat(<span style="color: #0000FF; ">new</span>&nbsp;ISO8601DateFormatWithMilliSeconds(TimeZone.getDefault(),&nbsp;Locale.getDefault(),&nbsp;<span style="color: #0000FF; ">true</span>));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;apply&nbsp;SCDF&nbsp;Batch&nbsp;Mixins&nbsp;to<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;ignore&nbsp;the&nbsp;JobExecution&nbsp;in&nbsp;StepExecution&nbsp;to&nbsp;prevent&nbsp;infinite&nbsp;loop.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">https://github.com/spring-projects/spring-hateoas/issues/333</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.mixIn(StepExecution.<span style="color: #0000FF; ">class</span>,&nbsp;StepExecutionJacksonMixIn.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.mixIn(ExecutionContext.<span style="color: #0000FF; ">class</span>,&nbsp;ExecutionContextJacksonMixIn.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.mixIn(JobExecution.<span style="color: #0000FF; ">class</span>,&nbsp;JobExecutionJacksonMixIn.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.mixIn(JobParameters.<span style="color: #0000FF; ">class</span>,&nbsp;JobParametersJacksonMixIn.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.mixIn(JobParameter.<span style="color: #0000FF; ">class</span>,&nbsp;JobParameterJacksonMixIn.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.mixIn(JobInstance.<span style="color: #0000FF; ">class</span>,&nbsp;JobInstanceJacksonMixIn.<span style="color: #0000FF; ">class</span>);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.mixIn(StepExecutionHistory.class,&nbsp;StepExecutionHistoryJacksonMixIn.class);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.mixIn(ExecutionContext.<span style="color: #0000FF; ">class</span>,&nbsp;ExecutionContextJacksonMixIn.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.mixIn(ExitStatus.<span style="color: #0000FF; ">class</span>,&nbsp;ExitStatusJacksonMixIn.<span style="color: #0000FF; ">class</span>);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectMapper.setDateFormat(new&nbsp;ISO8601DateFormatWithMilliSeconds());</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.modules(<span style="color: #0000FF; ">new</span>&nbsp;JavaTimeModule(),&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Jdk8Module());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp; @Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;flow4Contribution(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConnectionFactory&nbsp;connectionFactory,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JobProperties&nbsp;jobProperties,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Jackson2JsonObjectMapper&nbsp;jackson2JsonObjectMapper<br />&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;IntegrationFlows<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.from(request4ContributionMaster())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.enrichHeaders(headerEnricherConfigurer())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.transform(Transformers.toJson(jackson2JsonObjectMapper))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.handle(jmsOutboundGateway4Contribution(connectionFactory,&nbsp;jobProperties))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.transform(Transformers.fromJson(StepExecution.<span style="color: #0000FF; ">class</span>,&nbsp;jackson2JsonObjectMapper))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.channel(replies4ContributionMaster(<span style="color: #0000FF; ">null</span>))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><br /><br /><a href="https://github.com/spring-cloud/spring-cloud-dataflow/tree/master/spring-cloud-dataflow-rest-client/src/main/java/org/springframework/cloud/dataflow/rest/client/support" target="_blank">https://github.com/spring-cloud/spring-cloud-dataflow/tree/master/spring-cloud-dataflow-rest-client/src/main/java/org/springframework/cloud/dataflow/rest/client/support</a><br /><br />
<a href="https://frandorado.github.io/spring/2019/07/29/spring-batch-aws-series-introduction.html" target="_blank">https://frandorado.github.io/spring/2019/07/29/spring-batch-aws-series-introduction.html</a><br />
<a href="https://github.com/frandorado/spring-projects/tree/master/spring-batch-aws-integration/spring-batch-aws-integration-master/src/main/java/com/frandorado/springbatchawsintegrationmaster/transformer" target="_blank"><br />
https://github.com/frandorado/spring-projects/tree/master/spring-batch-aws-integration/spring-batch-aws-integration-master/src/main/java/com/frandorado/springbatchawsintegrationmaster/transformer</a><br />
<br />
<a href="https://github.com/frandorado/spring-projects/tree/master/spring-batch-aws-integration/spring-batch-aws-integration-slave/src/main/java/com/frandorado/springbatchawsintegrationslave/transformer" target="_blank">https://github.com/frandorado/spring-projects/tree/master/spring-batch-aws-integration/spring-batch-aws-integration-slave/src/main/java/com/frandorado/springbatchawsintegrationslave/transformer</a><img src ="http://www.blogjava.net/paulwong/aggbug/435048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-01-21 16:44 <a href="http://www.blogjava.net/paulwong/archive/2020/01/21/435048.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Batch JUnit test for multiple jobs</title><link>http://www.blogjava.net/paulwong/archive/2019/07/31/434326.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 31 Jul 2019 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/07/31/434326.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434326.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/07/31/434326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434326.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434326.html</trackback:ping><description><![CDATA[<br /><a href="https://stackoverflow.com/questions/34217101/spring-batch-junit-test-for-multiple-jobs" target="_blank">https://stackoverflow.com/questions/34217101/spring-batch-junit-test-for-multiple-jobs</a><br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Configuration<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;TestBatchConfiguration&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;MergedBeanDefinitionPostProcessor&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;@Qualifier("JobA")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Job&nbsp;job;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean(name="jtestl")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;JobLauncherTestUtils&nbsp;jobLauncherTestUtils()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JobLauncherTestUtils&nbsp;jobLauncherTestUtils&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JobLauncherTestUtils();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jobLauncherTestUtils.setJob(job);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;jobLauncherTestUtils;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">https://stackoverflow.com/questions/22416140/autowire-setter-override-with-java-config</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;This&nbsp;is&nbsp;needed&nbsp;to&nbsp;inject&nbsp;the&nbsp;correct&nbsp;job&nbsp;into&nbsp;JobLauncherTestUtils<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;postProcessMergedBeanDefinition(RootBeanDefinition&nbsp;beanDefinition,&nbsp;Class&lt;?&gt;&nbsp;beanType,&nbsp;String&nbsp;beanName)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(beanName.equals("jtestl"))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beanDefinition.getPropertyValues().add("job",&nbsp;getMyBeanFirstAImpl());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Object&nbsp;getMyBeanFirstAImpl()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;job;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Object&nbsp;postProcessBeforeInitialization(Object&nbsp;bean,&nbsp;String&nbsp;beanName)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;BeansException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;bean;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Object&nbsp;postProcessAfterInitialization(Object&nbsp;bean,&nbsp;String&nbsp;beanName)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;BeansException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;bean;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><img src ="http://www.blogjava.net/paulwong/aggbug/434326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-07-31 10:48 <a href="http://www.blogjava.net/paulwong/archive/2019/07/31/434326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING BATCH &amp; SPRING INTEGRATION TUTORIAL</title><link>http://www.blogjava.net/paulwong/archive/2019/07/18/434230.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 18 Jul 2019 05:21:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/07/18/434230.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434230.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/07/18/434230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434230.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434230.html</trackback:ping><description><![CDATA[<div style="box-sizing: border-box; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, Arial, sans-serif; font-size: 22px; background-color: #ffffff;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;">
<h2><a href="https://codenotfound.com/spring-jms-integration-gateway-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring JMS Integration Gateway Example</a>&nbsp;12 minute read</h2>
<p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to connect to a JMS broker using a Spring Integration Gateway and Spring Boot.</p>
</article></div>
<div style="box-sizing: border-box; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, Arial, sans-serif; font-size: 22px; background-color: #ffffff;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;">
<h2><a href="https://codenotfound.com/spring-jms-artemis-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring JMS Artemis Example</a>&nbsp;6 minute read</h2>
<p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to connect to Apache ActiveMQ Artemis using Spring JMS and Spring Boot.</p>
</article></div>
<div style="box-sizing: border-box; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, Arial, sans-serif; font-size: 22px; background-color: #ffffff;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;">
<h2><a href="https://codenotfound.com/spring-jms-topic-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring JMS Topic Example</a>&nbsp;5 minute read</h2>
<p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to publish/subscribe to a JMS topic using Spring JMS and Spring Boot.</p>
</article></div>
<div style="box-sizing: border-box; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, Arial, sans-serif; font-size: 22px; background-color: #ffffff;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;">
<h2><a href="https://codenotfound.com/spring-jms-integration-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring JMS Integration Example</a>12 minute read</h2>
<p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to connect to an ActiveMQ JMS broker using Spring Integration and Spring Boot.</p>
</article></div>
<div style="box-sizing: border-box; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, Arial, sans-serif; font-size: 22px; background-color: #ffffff;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;">
<h2><a href="https://codenotfound.com/spring-jms-listener-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring JMS Listener Example</a>&nbsp;7 minute read</h2>
<p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how a Spring JMS listener works in combination with Spring Boot.<br /><br /></p><div class="list__item" style="box-sizing: border-box;"><article class="archive__item" itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;"><h2 class="archive__item-title" itemprop="headline" style="box-sizing: border-box; color: #222222; margin: 0.5em 0px 0.25em; line-height: initial; font-size: 1.25em; transition: all 0.2s ease-in-out 0s; overflow: hidden; text-overflow: ellipsis;"><a href="https://codenotfound.com/spring-jms-jmstemplate-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring JMS JmsTemplate Example</a>&nbsp;<span style="color: #7a7a7a; font-size: 0.6em; orphans: 3; widows: 3;">7 minute read</span></h2><p class="archive__item-excerpt" itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to use JmsTemplate in combination with Spring JMS and Spring Boot.</p></article></div><p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;"></p><div style="box-sizing: border-box;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;"><h2><a href="https://codenotfound.com/spring-jms-message-selector-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring JMS Message Selector Example</a>&nbsp;5 minute read</h2><p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to implement a message selector using Spring JMS and Spring Boot.</p></article></div><div style="box-sizing: border-box;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;"><h2><a href="https://codenotfound.com/spring-jms-message-converter-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring JMS Message Converter Example</a>5 minute read</h2><p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to implement a message converter using Spring JMS and Spring Boot.</p><div><h2><a href="https://codenotfound.com/spring-batch-admin-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring Batch Admin Example</a>&nbsp;11 minute read</h2><p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to use a Spring Boot admin UI to manage Spring Batch jobs.<br /><br /></p><div class="list__item" style="box-sizing: border-box;"><article class="archive__item" itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;"><h2 class="archive__item-title" itemprop="headline" style="box-sizing: border-box; color: #222222; margin: 0.5em 0px 0.25em; line-height: initial; font-size: 1.25em; transition: all 0.2s ease-in-out 0s; overflow: hidden; text-overflow: ellipsis;"><a href="https://codenotfound.com/spring-batch-tasklet-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring Batch Tasklet Example</a>&nbsp;<span style="color: #7a7a7a; font-size: 0.6em; orphans: 3; widows: 3;">7 minute read</span></h2><p class="archive__item-excerpt" itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to implement a Spring Batch Tasklet using Spring Boot.</p></article></div><p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;"></p><div style="box-sizing: border-box;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;"><h2><a href="https://codenotfound.com/spring-batch-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s; outline: 0px;" target="_blank">Spring Batch Example</a>&nbsp;11 minute read</h2><p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to implement a Hello World Spring Batch job using Spring Boot.</p><div></div></article></div><div style="box-sizing: border-box;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;"></article></div></div></article></div><div style="box-sizing: border-box;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;"></article></div></article></div><img src ="http://www.blogjava.net/paulwong/aggbug/434230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-07-18 13:21 <a href="http://www.blogjava.net/paulwong/archive/2019/07/18/434230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING BATCH remote chunking模式下可同时处理多文件</title><link>http://www.blogjava.net/paulwong/archive/2019/07/16/434210.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 16 Jul 2019 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/07/16/434210.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434210.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/07/16/434210.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434210.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434210.html</trackback:ping><description><![CDATA[<div>SPRING BATCH remote chunking模式下，如果要同一时间处理多个文件，按DEMO的默认配置，是会报错的，这是由于多个文件的处理的MASTER方，是用同一个QUEUE名，这样SLAVE中处理多个JOB INSTANCE时，会返回不同的JOB-INSTANCE-ID，导致报错。<br />
<br />
这时需更改SPRING BATCH使用SPRING INTEGRATION的模式中的GATEWAY组件。<br />
<br />
GATEWAY组件是工作在REQUEST/RESPONSE模式下，即发一个MESSAGE到某一QUEUE时，要从REPLY QUEUE等到CONSUMER返回结果时，才往下继续。<br />
<br />
OUTBOUND&nbsp;GATEWAY：从某一CHANNEL获取MESSAGE，发往REQUEST QUEUE，从REPLY QUEUE等到CONSUMER返回结果，将此MESSAGE发往下一CHANNEL。<br />
<br />
INBOUND&nbsp;GATEWAY：从某一QUEUE获取MESSAGE，发往某一REQUEST&nbsp;CHANNEL，从REPLY CHANNEL等到返回结果，将此MESSAGE发往下一QUEUE。<br />
<br />
详情参见此文：<a href="https://blog.csdn.net/alexlau8/article/details/78056064" target="_blank">https://blog.csdn.net/alexlau8/article/details/78056064</a>。<br />
<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp; &nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;Master&nbsp;jms&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">int:channel&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="MasterRequestChannel"</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">int:dispatcher&nbsp;</span><span style="color: #FF0000; ">task-executor</span><span style="color: #0000FF; ">="RequestPublishExecutor"</span><span style="color: #0000FF; ">/&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">int:channel</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">task:executor&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="RequestPublishExecutor"</span><span style="color: #FF0000; ">&nbsp;pool-size</span><span style="color: #0000FF; ">="5-10"</span><span style="color: #FF0000; ">&nbsp;queue-capacity</span><span style="color: #0000FF; ">="0"</span><span style="color: #0000FF; ">/&gt;</span><br />
<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&lt;int-jms:outbound-channel-adapter&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-factory="connectionFactory"&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destination-name="RequestQueue"&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;channel="MasterRequestChannel"/&gt;&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">int:channel&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="MasterReplyChannel"</span><span style="color: #0000FF; ">/&gt;</span><br />
<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&lt;int-jms:message-driven-channel-adapter&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-factory="connectionFactory"&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destination-name="ReplyQueue"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;channel="MasterReplyChannel"/&gt;&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">int-jms:outbound-gateway<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF0000; ">connection-factory</span><span style="color: #0000FF; ">="connectionFactory"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;correlation-key</span><span style="color: #0000FF; ">="JMSCorrelationID"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request-channel</span><span style="color: #0000FF; ">="MasterRequestChannel"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request-destination-name</span><span style="color: #0000FF; ">="RequestQueue"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;receive-timeout</span><span style="color: #0000FF; ">="30000"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply-channel</span><span style="color: #0000FF; ">="MasterReplyChannel"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply-destination-name</span><span style="color: #0000FF; ">="ReplyQueue"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;async</span><span style="color: #0000FF; ">="true"</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">int-jms:reply-listener&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">int-jms:outbound-gateway</span><span style="color: #0000FF; ">&gt;</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;Slave&nbsp;jms&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">int:channel&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="SlaveRequestChannel"</span><span style="color: #0000FF; ">/&gt;</span><br />
<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&lt;int-jms:message-driven-channel-adapter<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-factory="connectionFactory"&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destination-name="RequestQueue"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;channel="SlaveRequestChannel"/&gt;&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">int:channel&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="SlaveReplyChannel"</span><span style="color: #0000FF; ">/&gt;</span><br />
<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&lt;int-jms:outbound-channel-adapter&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection-factory="connectionFactory"&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destination-name="ReplyQueue"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;channel="SlaveReplyChannel"/&gt;&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">int-jms:inbound-gateway<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF0000; ">connection-factory</span><span style="color: #0000FF; ">="connectionFactory"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;correlation-key</span><span style="color: #0000FF; ">="JMSCorrelationID"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request-channel</span><span style="color: #0000FF; ">="SlaveRequestChannel"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request-destination-name</span><span style="color: #0000FF; ">="RequestQueue"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply-channel</span><span style="color: #0000FF; ">="SlaveReplyChannel"</span><span style="color: #FF0000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default-reply-queue-name</span><span style="color: #0000FF; ">="ReplyQueue"</span><span style="color: #0000FF; ">/&gt;</span></div>
</div><br />
MASTER配置<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">package</span>&nbsp;com.paul.testspringbatch.config.master;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;javax.jms.ConnectionFactory;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.config.CustomScopeConfigurer;<br />
<span style="color: #008000; ">//</span><span style="color: #008000; ">import&nbsp;org.springframework.batch.core.configuration.annotation.StepScope;</span><span style="color: #008000; "><br />
</span><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Bean;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Configuration;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Profile;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Scope;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.support.SimpleThreadScope;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.channel.DirectChannel;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.channel.QueueChannel;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.config.EnableIntegration;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.dsl.IntegrationFlow;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.dsl.IntegrationFlows;<br />
<span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.jms.JmsOutboundGateway;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;com.paul.testspringbatch.common.constant.IntegrationConstant;<br />
<br />
@Configuration<br />
@EnableIntegration<br />
@Profile("batch-master")<br />
<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;IntegrationMasterConfiguration&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Value("${broker.url}")<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;brokerUrl;<br />
<br />
<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ActiveMQConnectionFactory&nbsp;connectionFactory()&nbsp;{<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActiveMQConnectionFactory&nbsp;connectionFactory&nbsp;=&nbsp;new&nbsp;ActiveMQConnectionFactory();<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connectionFactory.setBrokerURL(this.brokerUrl);<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connectionFactory.setTrustAllPackages(true);<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;connectionFactory;<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000; "><br />
</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Configure&nbsp;outbound&nbsp;flow&nbsp;(requests&nbsp;going&nbsp;to&nbsp;workers)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />
<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;DirectChannel&nbsp;requests()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DirectChannel();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;IntegrationFlow&nbsp;outboundFlow(ConnectionFactory&nbsp;connectionFactory)&nbsp;{<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;IntegrationFlows<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.from(requests())<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.handle(Jms.outboundAdapter(connectionFactory).destination(IntegrationConstant.MASTER_REQUEST_DESTINATION))<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;CustomScopeConfigurer&nbsp;customScopeConfigurer()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomScopeConfigurer&nbsp;customScopeConfigurer&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CustomScopeConfigurer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customScopeConfigurer.addScope("thread",&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SimpleThreadScope());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;customScopeConfigurer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;BeanFactoryPostProcessor&nbsp;beanFactoryPostProcessor()&nbsp;{<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;BeanFactoryPostProcessor()&nbsp;{<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;postProcessBeanFactory(ConfigurableListableBeanFactory&nbsp;beanFactory)&nbsp;throws&nbsp;BeansException&nbsp;{<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beanFactory.registerScope("thread",&nbsp;new&nbsp;SimpleThreadScope());<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Configure&nbsp;inbound&nbsp;flow&nbsp;(replies&nbsp;coming&nbsp;from&nbsp;workers)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Scope(value&nbsp;=&nbsp;"thread"<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;,&nbsp;proxyMode&nbsp;=&nbsp;ScopedProxyMode.NO&nbsp;</span><span style="color: #008000; ">*/</span>)<br />
<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;QueueChannel&nbsp;replies()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;QueueChannel();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;IntegrationFlow&nbsp;inboundFlow(ConnectionFactory&nbsp;connectionFactory)&nbsp;{<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;IntegrationFlows<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.from(Jms.messageDrivenChannelAdapter(connectionFactory).destination(IntegrationConstant.MASTER_REPLY_DESTINATION))<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.channel(replies())<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000; "><br />
</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;JmsOutboundGateway&nbsp;jmsOutboundGateway(ConnectionFactory&nbsp;connectionFactory)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JmsOutboundGateway&nbsp;jmsOutboundGateway&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JmsOutboundGateway();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmsOutboundGateway.setConnectionFactory(connectionFactory);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmsOutboundGateway.setRequestDestinationName(IntegrationConstant.MASTER_REQUEST_DESTINATION);<span style="color: #008000; ">//</span><span style="color: #008000; ">2.&nbsp;send&nbsp;the&nbsp;message&nbsp;to&nbsp;this&nbsp;destination</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmsOutboundGateway.setRequiresReply(<span style="color: #0000FF; ">true</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmsOutboundGateway.setCorrelationKey(IntegrationConstant.JMS_CORRELATION_KEY);<span style="color: #008000; ">//</span><span style="color: #008000; ">3.&nbsp;let&nbsp;the&nbsp;broker&nbsp;filter&nbsp;the&nbsp;message</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmsOutboundGateway.setAsync(<span style="color: #0000FF; ">true</span>);<span style="color: #008000; ">//</span><span style="color: #008000; ">must&nbsp;be&nbsp;async,&nbsp;so&nbsp;that&nbsp;JMS_CORRELATION_KEY&nbsp;work</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmsOutboundGateway.setUseReplyContainer(<span style="color: #0000FF; ">true</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmsOutboundGateway.setReplyDestinationName(IntegrationConstant.MASTER_REPLY_DESTINATION);<span style="color: #008000; ">//</span><span style="color: #008000; ">4.&nbsp;waiting&nbsp;the&nbsp;response&nbsp;from&nbsp;this&nbsp;destination</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmsOutboundGateway.setReceiveTimeout(30_000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;jmsOutboundGateway;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;jmsOutboundGatewayFlow(ConnectionFactory&nbsp;connectionFactory)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;IntegrationFlows<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.from(requests())<span style="color: #008000; ">//</span><span style="color: #008000; ">1.&nbsp;receive&nbsp;message&nbsp;from&nbsp;this&nbsp;channel</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.handle(jmsOutboundGateway(connectionFactory))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.channel(replies())<span style="color: #008000; ">//</span><span style="color: #008000; ">5.&nbsp;send&nbsp;back&nbsp;the&nbsp;response&nbsp;to&nbsp;this&nbsp;channel</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</div><br /><br />SLAVE配置：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;com.paul.testspringbatch.config.slave;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;javax.jms.ConnectionFactory;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Bean;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Configuration;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Profile;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.channel.DirectChannel;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.config.EnableIntegration;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.dsl.IntegrationFlow;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.dsl.IntegrationFlows;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.jms.dsl.Jms;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;com.paul.testspringbatch.common.constant.IntegrationConstant;<br /><br />@Configuration<br />@EnableIntegration<br />@Profile("batch-slave")<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;IntegrationSlaveConfiguration&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Configure&nbsp;inbound&nbsp;flow&nbsp;(requests&nbsp;coming&nbsp;from&nbsp;the&nbsp;master)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;DirectChannel&nbsp;requests()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DirectChannel();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;IntegrationFlow&nbsp;inboundFlow(ConnectionFactory&nbsp;connectionFactory)&nbsp;{<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;IntegrationFlows<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.from(Jms.messageDrivenChannelAdapter(connectionFactory).destination("requests"))<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.channel(requests())<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Configure&nbsp;outbound&nbsp;flow&nbsp;(replies&nbsp;going&nbsp;to&nbsp;the&nbsp;master)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;DirectChannel&nbsp;replies()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DirectChannel();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;IntegrationFlow&nbsp;outboundFlow(ConnectionFactory&nbsp;connectionFactory)&nbsp;{<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;IntegrationFlows<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.from(replies())<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.handle(Jms.outboundAdapter(connectionFactory).destination("replies"))<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;inboundGatewayFlow(ConnectionFactory&nbsp;connectionFactory)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;IntegrationFlows<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.from(Jms<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.inboundGateway(connectionFactory)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.destination(IntegrationConstant.SLAVE_HANDLE_MASTER_REQUEST_DESTINATION)<span style="color: #008000; ">//</span><span style="color: #008000; ">1.&nbsp;receive&nbsp;message&nbsp;from&nbsp;this&nbsp;channel.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.correlationKey(IntegrationConstant.JMS_CORRELATION_KEY)<span style="color: #008000; ">//</span><span style="color: #008000; ">2.&nbsp;let&nbsp;the&nbsp;broker&nbsp;filter&nbsp;the&nbsp;message</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.requestChannel(requests())<span style="color: #008000; ">//</span><span style="color: #008000; ">3.&nbsp;send&nbsp;the&nbsp;message&nbsp;to&nbsp;this&nbsp;channel</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.replyChannel(replies())<span style="color: #008000; ">//</span><span style="color: #008000; ">4.&nbsp;waitting&nbsp;the&nbsp;result&nbsp;from&nbsp;this&nbsp;channel</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.defaultReplyQueueName(IntegrationConstant.SLAVE_RETURN_RESULT_DESTINATION)<span style="color: #008000; ">//</span><span style="color: #008000; ">5.send&nbsp;back&nbsp;the&nbsp;result&nbsp;to&nbsp;this&nbsp;destination&nbsp;to&nbsp;the&nbsp;master.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><img src ="http://www.blogjava.net/paulwong/aggbug/434210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-07-16 14:38 <a href="http://www.blogjava.net/paulwong/archive/2019/07/16/434210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STEP范围内的ROUTER</title><link>http://www.blogjava.net/paulwong/archive/2019/07/11/434137.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 11 Jul 2019 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/07/11/434137.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434137.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/07/11/434137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434137.html</trackback:ping><description><![CDATA[在SPRING BATCH中，通常ROUTER是针对STEP的，但是如果在一个STEP中有多个WRITER，每个WRITER是写不同文件的，因此需要一个STEP内的ROUTER，以便能ROUTE到不同的WRITER中。<br /><br /><br /><a href="https://gist.github.com/benas/bfe2be7386b99ce496425fac9ff35fb8" target="_blank">https://gist.github.com/benas/bfe2be7386b99ce496425fac9ff35fb8</a><img src ="http://www.blogjava.net/paulwong/aggbug/434137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-07-11 11:45 <a href="http://www.blogjava.net/paulwong/archive/2019/07/11/434137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态改变SPRING BATCH 的 CHUNKSIZE</title><link>http://www.blogjava.net/paulwong/archive/2019/07/02/434011.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 02 Jul 2019 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/07/02/434011.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434011.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/07/02/434011.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434011.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434011.html</trackback:ping><description><![CDATA[&nbsp;在SPRING BATCH REMOTE CHUNKING的模式下：<br />SPRING BATCH&nbsp;读文件时，是按一行一行来读取数据，再按CHUNKSIZE提交到REMOTE操作，有时要整合当前行和下几行，再决定CHUNKSIZE，以便相关的数据能在远程同一个PROCESSOR中按顺序进行处理，因为相关的数据被拆成几个CHUNK来处理的话，就有可能不按顺序来处理。这样就需要动态调整CHUNKSIZE。<br />
<br />
参照如下：<br />
<a href="https://stackoverflow.com/questions/37390602/spring-batch-custom-completion-policy-for-dynamic-chunk-size" target="_blank">https://stackoverflow.com/questions/37390602/spring-batch-custom-completion-policy-for-dynamic-chunk-size</a>
<br /><br />并结合SingleItemPeekableItemReader（装饰者，允许查看下一条数据，真正的操作委托给代理）。<img src ="http://www.blogjava.net/paulwong/aggbug/434011.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-07-02 11:13 <a href="http://www.blogjava.net/paulwong/archive/2019/07/02/434011.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring batch 的高级特性--监听，异常处理，事务</title><link>http://www.blogjava.net/paulwong/archive/2019/06/12/433855.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 12 Jun 2019 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/06/12/433855.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/433855.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/06/12/433855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/433855.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/433855.html</trackback:ping><description><![CDATA[<br /><a href="https://my.oschina.net/u/2600078/blog/909346" target="_blank">https://my.oschina.net/u/2600078/blog/909346</a><img src ="http://www.blogjava.net/paulwong/aggbug/433855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-06-12 17:03 <a href="http://www.blogjava.net/paulwong/archive/2019/06/12/433855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING BOOT BATCH资源</title><link>http://www.blogjava.net/paulwong/archive/2019/05/07/433753.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 07 May 2019 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/05/07/433753.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/433753.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/05/07/433753.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/433753.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/433753.html</trackback:ping><description><![CDATA[<div>&nbsp;Spring Boot下Spring Batch入门实例</div>
<a href="https://www.jianshu.com/p/305192ea4cb1" target="_blank">https://www.jianshu.com/p/305192ea4cb1</a><br />
&nbsp;<br />
<br />
SPRING BATCH + QUARTZ<br />
<a href="https://examples.javacodegeeks.com/enterprise-java/spring/batch/quartz-spring-batch-example/" target="_blank">https://examples.javacodegeeks.com/enterprise-java/spring/batch/quartz-spring-batch-example/</a><br />
<a href="https://blog.kingbbode.com/posts/spring-batch-quartz" target="_blank">https://blog.kingbbode.com/posts/spring-batch-quartz</a><br />
<br />
Spring Batch Tutorial: Batch Processing Made Easy with Spring
<br />
<a href="https://www.toptal.com/spring/spring-batch-tutorial">https://www.toptal.com/spring/spring-batch-tutorial</a><img src ="http://www.blogjava.net/paulwong/aggbug/433753.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-05-07 17:07 <a href="http://www.blogjava.net/paulwong/archive/2019/05/07/433753.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何提高编码质量</title><link>http://www.blogjava.net/paulwong/archive/2012/12/14/392982.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 14 Dec 2012 03:57:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/12/14/392982.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/392982.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/12/14/392982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/392982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/392982.html</trackback:ping><description><![CDATA[问题&nbsp;<div>一般程序员都会发现这样的问题，需求拿了，编码写完了，编译也通过了，运行也没报错，就以为程序OK了，但到测试人员那里，一运行测试用例，就发现漏了这个那个的，产生了所谓的质量问题。</div>
<div><br />
</div>
<div>原因</div>
<div>这通常是由于程序员一拿到需求，就马上想要几个CLASS，然后就开始编码了。</div>
<div><br />
</div>
<div>解决方案</div>
<div>
<ol>
    <li>拿到需求后，先想大概会用到哪些OBJECT，即SERVICE，DAO之类的</li>
    <li>设计出会遇到哪些场景</li>
    <li>设计出分别在这些场景中，那些OBJECT合作的流程图</li>
    <li>编码</li>
</ol>
<div>举例</div>
</div>
<div>需求：有一系统会在每天的某个时间点，在某个文件夹内，导出一个一定格式名称的文件，现在要求程序实现在文件生成后，读取这个文件，抽取某些内容后，再生成另一文件，通过SFTP发走。</div>
<div><br />
</div>
<div>方案：</div>
<div>
<ol>
    <li>会用到排程器，控制器，SPRING BATCH JOB</li>
    <li>有这几种场景：没有发现文件时，发现了文件后正常处理，控制器和SPRING BATCH JOB出现错误时等</li>
    <li>处理流程：控制器没有发现文件后，通知排程器继续下一次循环；控制器发现文件后，通知SPRING BATCH JOB处理，然后通知控制器退出；控制器出现错误或SPRING BATCH JOB出现错误后，控制器通知排程器退出。</li>
    <li>根据这几种场景设计程序结构，编码</li>
    <li>编写单元测试用例</li>
</ol>
<div><br />
</div>
<div><br />
</div>
</div><img src ="http://www.blogjava.net/paulwong/aggbug/392982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2012-12-14 11:57 <a href="http://www.blogjava.net/paulwong/archive/2012/12/14/392982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING BATCH 错误通知机制</title><link>http://www.blogjava.net/paulwong/archive/2012/11/17/391508.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sat, 17 Nov 2012 13:42:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/11/17/391508.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/391508.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/11/17/391508.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/391508.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/391508.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 运行SPRING BATCH JOB 的时候，有可能出错，如果能有相关的错误处理机制，则这些错误就能及时得到处理。SPRING BATCH 提供了监听器，可配置在JOB执行完后，或执行JOB前，要执行的方法。JOB的定义及BEAN的配置文件：Code highlighting produced by Actipro CodeHighlighter (...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2012/11/17/391508.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/391508.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2012-11-17 21:42 <a href="http://www.blogjava.net/paulwong/archive/2012/11/17/391508.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING BATCH 测试</title><link>http://www.blogjava.net/paulwong/archive/2012/11/10/391143.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sat, 10 Nov 2012 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/11/10/391143.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/391143.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/11/10/391143.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/391143.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/391143.html</trackback:ping><description><![CDATA[SPRING BATCH 柯以测试的内容：JOB, STEP, INTEMPROCESSOR, ITEMREADER, ITEMWRITER。 
<div>JOB, STEP属于功能测试（黑盒）的范畴，INTEMPROCESSOR, ITEMREADER, ITEMWRITER属于单元测试（白盒）的范畴。</div>
<div><br /></div>
<div>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; border-left-color: #cccccc; padding-bottom: 4px; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000">/*</span><span style="color: #008000"><br />&nbsp;*&nbsp;Copyright&nbsp;2006-2007&nbsp;the&nbsp;original&nbsp;author&nbsp;or&nbsp;authors.<br />&nbsp;*<br />&nbsp;*&nbsp;Licensed&nbsp;under&nbsp;the&nbsp;Apache&nbsp;License,&nbsp;Version&nbsp;2.0&nbsp;(the&nbsp;"License");<br />&nbsp;*&nbsp;you&nbsp;may&nbsp;not&nbsp;use&nbsp;this&nbsp;file&nbsp;except&nbsp;in&nbsp;compliance&nbsp;with&nbsp;the&nbsp;License.<br />&nbsp;*&nbsp;You&nbsp;may&nbsp;obtain&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;License&nbsp;at<br />&nbsp;*<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.apache.org/licenses/LICENSE-2.0</span><span style="color: #008000"><br />&nbsp;*<br />&nbsp;*&nbsp;Unless&nbsp;required&nbsp;by&nbsp;applicable&nbsp;law&nbsp;or&nbsp;agreed&nbsp;to&nbsp;in&nbsp;writing,&nbsp;software<br />&nbsp;*&nbsp;distributed&nbsp;under&nbsp;the&nbsp;License&nbsp;is&nbsp;distributed&nbsp;on&nbsp;an&nbsp;"AS&nbsp;IS"&nbsp;BASIS,<br />&nbsp;*&nbsp;WITHOUT&nbsp;WARRANTIES&nbsp;OR&nbsp;CONDITIONS&nbsp;OF&nbsp;ANY&nbsp;KIND,&nbsp;either&nbsp;express&nbsp;or&nbsp;implied.<br />&nbsp;*&nbsp;See&nbsp;the&nbsp;License&nbsp;for&nbsp;the&nbsp;specific&nbsp;language&nbsp;governing&nbsp;permissions&nbsp;and<br />&nbsp;*&nbsp;limitations&nbsp;under&nbsp;the&nbsp;License.<br />&nbsp;</span><span style="color: #008000">*/</span><br /><span style="color: #0000ff">package</span>&nbsp;example;<br /><br /><span style="color: #0000ff">import</span>&nbsp;<span style="color: #0000ff">static</span>&nbsp;org.junit.Assert.assertEquals;<br /><span style="color: #0000ff">import</span>&nbsp;<span style="color: #0000ff">static</span>&nbsp;org.junit.Assert.assertNotNull;<br /><br /><span style="color: #0000ff">import</span>&nbsp;java.util.Date;<br /><span style="color: #0000ff">import</span>&nbsp;java.util.concurrent.Callable;<br /><br /><span style="color: #0000ff">import</span>&nbsp;org.junit.Before;<br /><span style="color: #0000ff">import</span>&nbsp;org.junit.Test;<br /><span style="color: #0000ff">import</span>&nbsp;org.junit.runner.RunWith;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.batch.core.BatchStatus;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.batch.core.Job;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.batch.core.JobExecution;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.batch.core.JobParameters;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.batch.core.JobParametersBuilder;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.batch.core.StepExecution;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.batch.core.launch.JobLauncher;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.batch.item.ExecutionContext;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.batch.item.ItemReader;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.batch.item.ItemStream;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.batch.item.NonTransientResourceException;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.batch.item.ParseException;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.batch.item.UnexpectedInputException;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.batch.test.JobLauncherTestUtils;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.batch.test.MetaDataInstanceFactory;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.batch.test.StepScopeTestExecutionListener;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.batch.test.StepScopeTestUtils;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.beans.factory.annotation.Autowired;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.test.annotation.DirtiesContext;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.test.context.ContextConfiguration;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.test.context.TestExecutionListeners;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.test.context.junit4.SpringJUnit4ClassRunner;<br /><span style="color: #0000ff">import</span>&nbsp;org.springframework.test.context.support.DependencyInjectionTestExecutionListener;<br /><br />@ContextConfiguration(locations&nbsp;=&nbsp;{&nbsp;"/test-context.xml",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"classpath:/META-INF/spring/batch/hello-tasklet-context.xml",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"classpath:/META-INF/spring/batch/jdbc-job-context.xml",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"classpath:/META-INF/spring/integration/hello-integration-context.xml"})<br />@RunWith(SpringJUnit4ClassRunner.<span style="color: #0000ff">class</span>)<br /><span style="color: #008000">//</span><span style="color: #008000">测试ITEMREADER/ITEMPROCESSOR/ITEMWRITER时用到</span><span style="color: #008000"><br /></span>@TestExecutionListeners(&nbsp;{&nbsp;DependencyInjectionTestExecutionListener.<span style="color: #0000ff">class</span>,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;StepScopeTestExecutionListener.<span style="color: #0000ff">class</span>&nbsp;})<br /><span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">class</span>&nbsp;HelloTaskletTests&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">private</span>&nbsp;JobLauncher&nbsp;jobLauncher;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">private</span>&nbsp;Job&nbsp;helloWorldJob;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">private</span>&nbsp;JobLauncherTestUtils&nbsp;jobLauncherTestUtils;<span style="color: #008000">//</span><span style="color: #008000">测试JOB/STEP的入口</span><span style="color: #008000"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">private</span>&nbsp;ItemReader&nbsp;xmlReader;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">void</span>&nbsp;testLaunchJobWithJobLauncher()&nbsp;<span style="color: #0000ff">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JobExecution&nbsp;jobExecution&nbsp;=&nbsp;jobLauncher.run(helloWorldJob,&nbsp;<span style="color: #0000ff">new</span>&nbsp;JobParameters());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(BatchStatus.COMPLETED,&nbsp;jobExecution.getStatus());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000">/**</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Create&nbsp;a&nbsp;unique&nbsp;job&nbsp;instance&nbsp;and&nbsp;check&nbsp;it's&nbsp;execution&nbsp;completes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;successfully&nbsp;-&nbsp;uses&nbsp;the&nbsp;convenience&nbsp;methods&nbsp;provided&nbsp;by&nbsp;the&nbsp;testing<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;superclass.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;@Test<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">void</span>&nbsp;testLaunchJob()&nbsp;<span style="color: #0000ff">throws</span>&nbsp;Exception&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JobExecution&nbsp;jobExecution&nbsp;=&nbsp;jobLauncherTestUtils.launchJob(jobLauncherTestUtils.getUniqueJobParameters());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(BatchStatus.COMPLETED,&nbsp;jobExecution.getStatus());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">void</span>&nbsp;testIntegration()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">while</span>(<span style="color: #0000ff">true</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000">/**</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试某个STEP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;@Test<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">void</span>&nbsp;testSomeStep()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JobExecution&nbsp;jobExecution&nbsp;=&nbsp;jobLauncherTestUtils.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;launchStep("xmlFileReadAndWriterStep",getJobParameters());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(BatchStatus.COMPLETED,&nbsp;jobExecution.getStatus());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000">/**</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试READER的方式1时，所需的方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">public</span>&nbsp;StepExecution&nbsp;getStepExecution()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StepExecution&nbsp;execution&nbsp;=&nbsp;MetaDataInstanceFactory<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.createStepExecution(getJobParameters());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">return</span>&nbsp;execution;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000">/**</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试READER的方式1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@throws</span><span style="color: #008000">&nbsp;Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;@Test<br />&nbsp;&nbsp;&nbsp;&nbsp;@DirtiesContext<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">void</span>&nbsp;testReader()&nbsp;<span style="color: #0000ff">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">int</span>&nbsp;count&nbsp;=&nbsp;StepScopeTestUtils.doInStepScope(getStepExecution(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">new</span>&nbsp;Callable&lt;Integer&gt;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">public</span>&nbsp;Integer&nbsp;call()&nbsp;<span style="color: #0000ff">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">int</span>&nbsp;count&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((ItemStream)&nbsp;xmlReader)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.open(<span style="color: #0000ff">new</span>&nbsp;ExecutionContext());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">while</span>&nbsp;(xmlReader.read()&nbsp;!=&nbsp;<span style="color: #0000ff">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">return</span>&nbsp;count;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000ff">finally</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((ItemStream)&nbsp;xmlReader).close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(3,&nbsp;count);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000">/**</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试READER的方式2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@throws</span><span style="color: #008000">&nbsp;UnexpectedInputException<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@throws</span><span style="color: #008000">&nbsp;ParseException<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@throws</span><span style="color: #008000">&nbsp;NonTransientResourceException<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@throws</span><span style="color: #008000">&nbsp;Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;@Test<br />&nbsp;&nbsp;&nbsp;&nbsp;@DirtiesContext<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">void</span>&nbsp;testReader2()&nbsp;<span style="color: #0000ff">throws</span>&nbsp;UnexpectedInputException,&nbsp;ParseException,&nbsp;NonTransientResourceException,&nbsp;Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertNotNull(xmlReader.read());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000">/**</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;测试READER的方式2时，必须加的方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;@Before<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">void</span>&nbsp;setUp()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((ItemStream)&nbsp;xmlReader).open(<span style="color: #0000ff">new</span>&nbsp;ExecutionContext());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000">/**</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">private</span>&nbsp;JobParameters&nbsp;getJobParameters()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;inputFile&nbsp;=&nbsp;"/Users/paul/Documents/PAUL/DOWNLOAD/SOFTWARE/DEVELOP/"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"SPRING&nbsp;BATCH/spring-batch-2.1.9.RELEASE/samples/"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"spring-batch-simple-cli/file/trades1.xml";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;outputFile&nbsp;=&nbsp;"/Users/paul/Documents/PAUL/DOWNLOAD/SOFTWARE/DEVELOP/"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"SPRING&nbsp;BATCH/spring-batch-2.1.9.RELEASE/samples/"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"spring-batch-simple-cli/file/output/out.xml";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JobParameters&nbsp;jobParameters&nbsp;=&nbsp;<span style="color: #0000ff">new</span>&nbsp;JobParametersBuilder()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.addString("input.file.path",&nbsp;inputFile)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.addString("output.file.path",&nbsp;outputFile)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.addDate("date",&nbsp;<span style="color: #0000ff">new</span>&nbsp;Date()).toJobParameters();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">return</span>&nbsp;jobParameters;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />}</div></div>
<div><br /></div>
<div><br /></div>参考例子：&nbsp; 
<div><a href="http://code.google.com/p/springbatch-in-action/source/browse/trunk/sbia/ch15/src/test/java/com/manning/sbia/ch15/batch/integration/?r=128#integration%2Fjob" target="_blank">http://code.google.com/p/springbatch-in-action/source/browse/trunk/sbia/ch15/src/test/java/com/manning/sbia/ch15/batch/integration/?r=128#integration%2Fjob</a> <br /><br />SPRING-BATCH TEST</div>
<div><a href="https://src.springframework.org/svn/spring-batch/trunk/spring-batch-core-tests/src/test/java/org/springframework/batch/core/test/" target="_blank">https://src.springframework.org/svn/spring-batch/trunk/spring-batch-core-tests/src/test/java/org/springframework/batch/core/test/</a><br /><br /></div><img src ="http://www.blogjava.net/paulwong/aggbug/391143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2012-11-10 17:25 <a href="http://www.blogjava.net/paulwong/archive/2012/11/10/391143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SRING INTEGRATION + BATCH</title><link>http://www.blogjava.net/paulwong/archive/2012/10/21/389968.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 21 Oct 2012 09:23:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/10/21/389968.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/389968.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/10/21/389968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/389968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/389968.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 场景：由SPRING INTEGRATION每10秒监控数据库中的POLL表，如果有符合条件的记录，则启动JDBC JOB，此JOB要做的也是和数据库交互的动作，如用JDBCITEMREADER读取数据库记录，用JDBCITEMWRITER写记录进数据库 。SPRING INTEGRATION与SPRING BATCH JOB交互的点是JOBPARAMETERS，即以KEY-V...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2012/10/21/389968.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/389968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2012-10-21 17:23 <a href="http://www.blogjava.net/paulwong/archive/2012/10/21/389968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING BATCH 运行机制</title><link>http://www.blogjava.net/paulwong/archive/2012/10/20/389910.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sat, 20 Oct 2012 03:57:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/10/20/389910.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/389910.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/10/20/389910.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/389910.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/389910.html</trackback:ping><description><![CDATA[JOB的XML配置相当于命令模式中的一个命令，每次运行，会生成一个JOB INSTANCE，同时也会生成一个JOB EXCETION，JOB INSTANCE表示有一个JOB，JOB EXECUTION表示进行第一次尝试。失败运行的JOB再次运行时，只生成一个JOB EXCETION，表示进行的第二次尝试。当SPRING BATCH JOB引擎接到运行请求时，有以下几种情况：@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&amp;file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
<div><br />
</div>
<div>
<ol>
     <li>判断此JOB以前是否有运行过，判断依据：根据JOB NAME和JOB PARAMETERS信息去这两张表查找，如找到记录，则是有运行过，如确定有则引擎退出并提示。<br />
     <br />
     <br />
     </li>
     <li>判断是否有重复运行的JOB，如果没，查找此JOB上次运行的情况，如果有FAIL的情况，则重新从上次失败的地方运行继续运行，判断根据：根据JOB INSTANCE关联的JOB EXECUTION查找是否有状态为FAIL的记录，如有则是，就新建一个JOB EXECUTION表示进行第二次尝试，同时又生成关于新JOB的JOB EXECUTION。上次的JOB运行完后，再运行此次新JOB。判断上次失败的STEP的依据：查找对应的JOB EXECUTON的STEP EXECUTON状态为FAIL的STEP即可，会从此步骤开始运行，而不是从第一步开始运行。<br />
     <br />
     </li>
</ol>
<div>参考文档：</div>
<div><a href="http://static.springsource.org/spring-batch/reference/html/domain.html#domainJobInstance" target="_blank">http://static.springsource.org/spring-batch/reference/html/domain.html#domainJobInstance</a><br />
</div>
</div>
<img src ="http://www.blogjava.net/paulwong/aggbug/389910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2012-10-20 11:57 <a href="http://www.blogjava.net/paulwong/archive/2012/10/20/389910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING INTEGRATION + SPRING BATCH</title><link>http://www.blogjava.net/paulwong/archive/2012/10/16/389625.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 15 Oct 2012 16:11:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/10/16/389625.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/389625.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/10/16/389625.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/389625.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/389625.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: SPRING INTEGRATION的强项是事件驱动，但捕获之后，要做的事是触发一个类的方法，对于要处理大数据量的文件，就没有办法了，如读取1w条记录，然后插入数据库。而这个正是SPRING BATCH的强项所在，因此有必要将此两个框架整合起来用。场景：盯着一个文件夹，如果一有文件，此文件可能非常大的，则启动一个BATCH JOB来处理。文件拉取器，监控文件夹一有新...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2012/10/16/389625.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/389625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2012-10-16 00:11 <a href="http://www.blogjava.net/paulwong/archive/2012/10/16/389625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Quartz 中的任务开始、暂停和继续</title><link>http://www.blogjava.net/paulwong/archive/2012/10/13/389514.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sat, 13 Oct 2012 08:18:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/10/13/389514.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/389514.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/10/13/389514.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/389514.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/389514.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第一个TASK:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->package com.paul.springbatchtest.tasklet;import org.quartz.SchedulerException;public class Tas...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2012/10/13/389514.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/389514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2012-10-13 16:18 <a href="http://www.blogjava.net/paulwong/archive/2012/10/13/389514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 3.0的任务调度</title><link>http://www.blogjava.net/paulwong/archive/2012/10/12/389451.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 12 Oct 2012 02:51:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/10/12/389451.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/389451.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/10/12/389451.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/389451.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/389451.html</trackback:ping><description><![CDATA[Spring3.0以后，自己已经完全支持更加精确的时间，而不需要Quartz（Quartz是一个开放源码项目，专注于任务调度器，提供了极为广泛的特性如持久化任务，集群和分布式任务等。Spring对Quartz的集成与其对JDK Timer的集成在任务、触发器和调度计划的声明式配置方面等都非常相似。 ）的支持：当然后面我们也会用Quartz实现任务的调度。<br /><br />Spring3.0同样也使用cron表达式。与Quartz不同的是，Spring3.0不支持年，而Quartz支持年。但这点好象并不是非常重要。 <br /><br />cron表达式：－是用空格分开的时间字段，不使用年。 
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">*(秒0-</span><span style="color: #000000">59</span><span style="color: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*(分钟0-</span><span style="color: #000000">59</span><span style="color: #000000">)&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*(小时0-</span><span style="color: #000000">23</span><span style="color: #000000">)&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*(日期1-</span><span style="color: #000000">31</span><span style="color: #000000">)&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*(月份1-12或是JAN-DEC)&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*(星期1-7或是SUN-SAT)&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />示例：&nbsp;<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*/</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;&nbsp;*&nbsp;*&nbsp;*&nbsp;*&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">-</span><span style="color: #000000">7</span><span style="color: #000000">&nbsp;&nbsp;::&nbsp;每个周6到周日，每隔5秒钟执行一次。<br />&nbsp;<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*/</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;*&nbsp;*&nbsp;</span><span style="color: #000000">7</span><span style="color: #000000">-</span><span style="color: #000000">9</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">-</span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">-</span><span style="color: #000000">7</span><span style="color: #000000">&nbsp;::&nbsp;1月到2月中的7号到9号，且必须要满足周一到周日，每隔1秒钟执行一次。&nbsp;<br /><br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*/</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;*&nbsp;*&nbsp;</span><span style="color: #000000">7</span><span style="color: #000000">-</span><span style="color: #000000">9</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">-</span><span style="color: #000000">7</span><span style="color: #000000">&nbsp;&nbsp;::&nbsp;注意里面的</span><span style="color: #000000">,</span><span style="color: #000000">(逗号)，只有1月和5月的7到9号，且必须要满足周一到周日，每一秒钟执行一次。&nbsp;<br /><br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*/</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">17</span><span style="color: #000000">-</span><span style="color: #000000">59</span><span style="color: #000000">&nbsp;*&nbsp;</span><span style="color: #000000">7</span><span style="color: #000000">-</span><span style="color: #000000">9</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">-</span><span style="color: #000000">7</span><span style="color: #000000">&nbsp;::&nbsp;只解释17-</span><span style="color: #000000">59</span><span style="color: #000000">,</span><span style="color: #000000">是指从第17分钟到第59分钟，在指定的时间内，每一秒种执行一次&nbsp;<br /><br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />*&nbsp;</span><span style="color: #000000">17</span><span style="color: #000000">-</span><span style="color: #000000">59</span><span style="color: #000000">&nbsp;*&nbsp;</span><span style="color: #000000">7</span><span style="color: #000000">-</span><span style="color: #000000">9</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">-</span><span style="color: #000000">7</span><span style="color: #000000">&nbsp;&nbsp;::&nbsp;此代码的功能与上面完全相同。如果不写秒即为每一秒执行一次。&nbsp;<br /></span><span style="color: #000000"><br />&nbsp; 59</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">19</span><span style="color: #000000">-</span><span style="color: #000000">23</span><span style="color: #000000">&nbsp;*&nbsp;</span><span style="color: #000000">7</span><span style="color: #000000">-</span><span style="color: #000000">9</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">-</span><span style="color: #000000">7</span><span style="color: #000000">&nbsp;&nbsp;::&nbsp;19分-23分的每59秒钟时只执行一次。&nbsp;<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="color: #000000">&nbsp; 59</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">19</span><span style="color: #000000">,</span><span style="color: #000000">26</span><span style="color: #000000">&nbsp;*&nbsp;</span><span style="color: #000000">7</span><span style="color: #000000">-</span><span style="color: #000000">9</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">-</span><span style="color: #000000">7</span><span style="color: #000000">&nbsp;&nbsp;::&nbsp;注意里面的</span><span style="color: #000000">,</span><span style="color: #000000">(逗号)，是指只有19分或是26分的56秒钟时执行一次。&nbsp;<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />&nbsp; *&nbsp;*&nbsp;</span><span style="color: #000000">16</span><span style="color: #000000">-</span><span style="color: #000000">23</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">7</span><span style="color: #000000">-</span><span style="color: #000000">9</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">-</span><span style="color: #000000">7</span><span style="color: #000000">&nbsp;&nbsp;::&nbsp;定义每天的16点到23点每一秒钟执行一次。&nbsp;<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="color: #000000">&nbsp; 59</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">59</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">23</span><span style="color: #000000">&nbsp;*&nbsp;*&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">-</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;&nbsp;::&nbsp;定义每周1到周5</span><span style="color: #000000">,</span><span style="color: #000000">晚上23:</span><span style="color: #000000">59</span><span style="color: #000000">:59秒只执行一次。<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />这个相当用有。可以工作时间每天给用户发邮件。&nbsp;<br /><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />在Spring3.0中引用了新的命名空间-task： <br />task:scheduler 用于定义一个ThreadPoolTaskScheduler,并可以指定线程池的大小，<br />即pool-size.所有任务队列都将会在指定大小的线程池中运行： <br /><br />定义如下：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;对于同一个Pojo可以声明多次，并设置标记属性&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="one"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="cn.itcast.schedule.One"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="task"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="A"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="two"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="cn.itcast.schedule.One"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="task"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="B"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="three"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="cn.itcast.schedule.One"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="task"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="C"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;声明一个具有两个线程的池，每一个对象将获取同样的运行机会&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">task:scheduler&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="sch"</span><span style="color: #ff0000">&nbsp;pool-size</span><span style="color: #0000ff">="2"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;引用线程池&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">task:scheduled-tasks&nbsp;</span><span style="color: #ff0000">scheduler</span><span style="color: #0000ff">="sch"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;引用Spring&nbsp;Bean并设置调用的方法的时间间隔&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">task:scheduled&nbsp;</span><span style="color: #ff0000">ref</span><span style="color: #0000ff">="one"</span><span style="color: #ff0000">&nbsp;method</span><span style="color: #0000ff">="doSomeThing"</span><span style="color: #ff0000">&nbsp;&nbsp;fixed-delay</span><span style="color: #0000ff">="#{1000*3}"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br /></span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #800000">task:scheduled&nbsp;</span><span style="color: #ff0000">ref</span><span style="color: #0000ff">="two"</span><span style="color: #ff0000">&nbsp;method</span><span style="color: #0000ff">="doSomeThing"</span><span style="color: #ff0000">&nbsp;&nbsp;fixed-delay</span><span style="color: #0000ff">="#{1000*3}"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br /></span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: #800000">task:scheduled&nbsp;</span><span style="color: #ff0000">ref</span><span style="color: #0000ff">="three"</span><span style="color: #ff0000">&nbsp;method</span><span style="color: #0000ff">="doSomeThing"</span><span style="color: #ff0000">&nbsp;&nbsp;fixed-delay</span><span style="color: #0000ff">="#{1000*3}"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br /></span><span style="color: #0000ff">&nbsp; &lt;/</span><span style="color: #800000">task:scheduled-tasks</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;配置一个定时执行的任务&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="work"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="cn.itcast.schedule.Two"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">task:scheduler&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="sendMail"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">task:scheduled-tasks&nbsp;</span><span style="color: #ff0000">scheduler</span><span style="color: #0000ff">="sendMail"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;定义在1月8号19:37:1秒执行一次，无论是周几&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">task:scheduled&nbsp;</span><span style="color: #ff0000">ref</span><span style="color: #0000ff">="work"</span><span style="color: #ff0000">&nbsp;method</span><span style="color: #0000ff">="work"</span><span style="color: #ff0000">&nbsp;cron</span><span style="color: #0000ff">="1&nbsp;37&nbsp;19&nbsp;8&nbsp;1&nbsp;*"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">task:scheduled-tasks</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div><br /><br />定义好之后，正常启动容器即可，只有条件符合，即会按要求执行任务。 <img src ="http://www.blogjava.net/paulwong/aggbug/389451.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2012-10-12 10:51 <a href="http://www.blogjava.net/paulwong/archive/2012/10/12/389451.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING BATCH SCREN</title><link>http://www.blogjava.net/paulwong/archive/2012/10/11/389425.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 11 Oct 2012 10:10:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/10/11/389425.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/389425.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/10/11/389425.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/389425.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/389425.html</trackback:ping><description><![CDATA[SCENARIO 1: <br />A job runs at a specific period in the day at a specific interval (e.g. between 1am - 3am at 15 minute intervals) . When it completes with a specific status, it stops (and does not run after 15 minutes) and does not get triggered again until the next day again at 1am, and at the same time, it triggers all dependent jobs.<br /><br />SCENARIO 2: <br />A job is scheduled to run at a specific time of day. It continues to run at regular intervals until a condition is met, after which it stops running. It will then start running the next day at the scheduled time and process repeats. 
<div><br /></div>
<div>Reference:</div>
<div><br /></div>
<div>spring+quartz 动态任务方案</div>
<div><a href="http://www.iteye.com/topic/704646" target="_blank">http://www.iteye.com/topic/704646</a><br /></div>
<div><br /></div>
<div>Quartz+Spring 自定义作业调度（作业在DB中配置）</div>
<div><a href="http://www.blogjava.net/jnbzwm/archive/2010/09/06/331239.html" target="_blank">http://www.blogjava.net/jnbzwm/archive/2010/09/06/331239.html</a><br /></div>
<div><br /></div>
<div>Quartz在Spring中动态设置cronExpression（spring设置动态定时任务）</div>
<div><a href="http://blog.sina.com.cn/s/blog_4f925fc30100u81j.html" target="_blank">http://blog.sina.com.cn/s/blog_4f925fc30100u81j.html</a><br /></div>
<div><br /></div>
<div>Quartz实现Java调度操作</div>
<div><a href="http://blog.sina.com.cn/s/blog_4f925fc30100u7yd.html" target="_blank">http://blog.sina.com.cn/s/blog_4f925fc30100u7yd.html</a><br /></div>
<div><br /></div>
<div>Sping 中配置Quartz，SchedulerFactoryBean不能自动启动</div>
<div><a href="http://www.iteye.com/problems/15283" target="_blank">http://www.iteye.com/problems/15283</a><br /></div>
<div><br /></div><img src ="http://www.blogjava.net/paulwong/aggbug/389425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2012-10-11 18:10 <a href="http://www.blogjava.net/paulwong/archive/2012/10/11/389425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING BATCH ADMIN安装实录</title><link>http://www.blogjava.net/paulwong/archive/2012/09/23/388382.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 23 Sep 2012 11:36:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/09/23/388382.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/388382.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/09/23/388382.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/388382.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/388382.html</trackback:ping><description><![CDATA[<ol><li><span style="color: #0000ff">下载</span><br />从云端下载文件：http://s3.amazonaws.com/dist.springframework.org/release/BATCHADM/spring-batch-admin-1.2.1.RELEASE.zip<br /><br /></li><li><span style="color: #0000ff">更改JOBREPOSITRY的数据库</span><br />支持从启动JVM时传参数，即如果启动JVM时传了-DENVIRONMENT=mysql值，则读取batch-mysql.properties文件，如未传值，则默认读batch-hsql.properties文件，如找不到此文件，才读取batch-default.properties文件，因此将batch-mysql.properties等删除，只保留default文件，里面放数据库驱动程序等信息是开发环境时的首选做法。相关的properties文件可去<a href="http://www.springsource.org/download/community" target="_blank">http://www.springsource.org/download/community</a>中下载。顺便将JDK改成1.6，SPRING-BATCH的版本改成最新的2.1.8。<br /><br /></li><li><span style="color: #0000ff">生成WAR包&nbsp;</span><br />先用MAVEN安装PARENT包，再安装ADMIN包。<br /><br /></li><li><span style="color: #0000ff">部署</span><br />打开TOMCAT，将WAR包丢进去即可，如果要在ECLIPSE中调试，将此两个PROJECT 导入到ECLIPSE中，安装<a href="http://code.google.com/p/run-jetty-run/wiki/GettingStarted" target="_blank">RUN-JETTY-RUN</a>插件，即可在ECLIPSE中启动JETTY，而MAVEN项目不用改成ECLIPSE的WEB项目，推荐！<br />访问网址：http://localhost:8080/spring-batch-admin-sample。<br /><br /></li><li><span style="color: #0000ff">部署JOB</span><br />将job的spring配置文件和相关class如itemreader等打成jar包，放到META-INF/spring/batch/jobs/下，则会自动显示到UI中。<br /><br />&lt;<a href="http://www.blogjava.net/Files/paulwong/spring-batch-admin-1.2.1.RELEASE.rar">点击下载修改后的控制台</a>&gt; &lt;<a href="http://www.blogjava.net/Files/paulwong/springbatch-test.rar">点击下载例子</a>&gt; </li></ol><img src ="http://www.blogjava.net/paulwong/aggbug/388382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2012-09-23 19:36 <a href="http://www.blogjava.net/paulwong/archive/2012/09/23/388382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING BATCH 资源</title><link>http://www.blogjava.net/paulwong/archive/2012/09/20/388179.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 20 Sep 2012 05:25:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/09/20/388179.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/388179.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/09/20/388179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/388179.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/388179.html</trackback:ping><description><![CDATA[<a href="http://www.cnblogs.com/gulvzhe/archive/2011/11/06/2238125.html" target="_blank"><font color="#993300">http://www.cnblogs.com/gulvzhe/archive/2011/11/06/2238125.html</font></a>&nbsp;<br />
<br />
<a href="http://www.ibm.com/developerworks/cn/java/j-lo-springbatch1/" target="_blank"><font color="#993300">http://www.ibm.com/developerworks/cn/java/j-lo-springbatch1/<br />
<br />
</font></a>单元测试例子<br />
<a href="http://code.google.com/p/springbatchhanson/" target="_blank">http://code.google.com/p/springbatchhanson/</a>
<div><br />
</div>
<div>单元测试STEP</div>
<div><a href="http://code.google.com/p/springbatch-in-action/source/browse/trunk/sbia/ch15/src/test/java/com/manning/sbia/ch15/batch/integration/step/StatisticStepTest.java?r=128&amp;spec=svn243" target="_blank">http://code.google.com/p/springbatch-in-action/source/browse/trunk/sbia/ch15/src/test/java/com/manning/sbia/ch15/batch/integration/step/StatisticStepTest.java?r=128&amp;spec=svn243</a></div>
<div><br />
</div>
<div>Spring Batch In Action例子</div>
<div><a href="http://code.google.com/p/springbatch-in-action/" target="_blank">http://code.google.com/p/springbatch-in-action/</a><br />
</div>
<div><a href="http://code.google.com/p/springbatchhanson/" target="_blank"><font color="#000000"><br />
</font>
<br />
</a>Pro Spring Batch例子<br />
<a href="http://www.apress.com/9781430234524" target="_blank">http://www.apress.com/9781430234524<br />
<br />
</a>Spring Batch官方例子<br />
<a href="http://www.springsource.org/download/community" target="_blank">http://www.springsource.org/download/community</a> <br />
<br />
Spring Batch 之 Sample（固定长格式文件读写）(六) <br />
<a href="http://mowengaobo.iteye.com/blog/1522137" target="_blank">http://mowengaobo.iteye.com/blog/1522137</a>
<div><br />
</div>
<div>SPRING BATCH REFERENCE</div>
<div><a href="http://static.springsource.org/spring-batch/reference/html/index.html" target="_blank">http://static.springsource.org/spring-batch/reference/html/index.html</a><br />
</div>
</div>
<img src ="http://www.blogjava.net/paulwong/aggbug/388179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2012-09-20 13:25 <a href="http://www.blogjava.net/paulwong/archive/2012/09/20/388179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring batch基本概念</title><link>http://www.blogjava.net/paulwong/archive/2012/09/19/388027.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 18 Sep 2012 16:19:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/09/19/388027.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/388027.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/09/19/388027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/388027.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/388027.html</trackback:ping><description><![CDATA[如果要读一堆的文本文件到数据库,则可以使用SPRIN BATCH。<br /><br />主流程：<br /><font face="Verdana">由JobRunner</font>启动Job，Job启动Step，Step启动TaskLet，TaskLet启动Chunk，Chunk启动ItemRader/ItemProcessor/ItemWriter。<br /><br />Step之间可以设定流程，即在Step间放一个Decision，在上一步放一个Listener，根据条件把某变量值放到Context中，Decision根据此值决定下一步是哪个。<br /><br />DefaultLineMapper：将STRING转成MAP<br /><br />DelimitedLineTokenizer：将行以豆号分割出来放到LIST<br /><br />BeanWrapperFieldSetMapper：将MAP转成VO<br /><br />FlatFileItemWriter：输出到文件<br /><br />DelimitedLineAggregator：对象转字符串<br /><br />自定义TaskLet：如果任务不是读或写那种,就新增自定义类完成所需工作<br /><br /><br /><br /><br /><br /><a href="http://www.cnblogs.com/gulvzhe/archive/2011/11/06/2238125.html" target="_blank">http://www.cnblogs.com/gulvzhe/archive/2011/11/06/2238125.html</a>&nbsp;<br /><br /><a href="http://www.ibm.com/developerworks/cn/java/j-lo-springbatch1/" target="_blank">http://www.ibm.com/developerworks/cn/java/j-lo-springbatch1/</a><br /><br /><a href="http://www.visa4uk.fco.gov.uk/Welcome.htm" target="_blank">http://www.visa4uk.fco.gov.uk/Welcome.htm</a>  <img src ="http://www.blogjava.net/paulwong/aggbug/388027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2012-09-19 00:19 <a href="http://www.blogjava.net/paulwong/archive/2012/09/19/388027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>