博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Batch JobExecutionDecider
阅读量:6153 次
发布时间:2019-06-21

本文共 4503 字,大约阅读时间需要 15 分钟。

hot3.png

    根据不同的支付渠道选择不同的step进行处理,主要通过实现JobExecutionDecider接口,返回不同的FlowExecutionStatus来决定step分支。

    其大致实现:

    1、maven依赖:

org.springframework.batch
spring-batch-core
3.0.6.RELEASE
org.springframework.batch
spring-batch-samples
1.1.4.RELEASE
sources
mysql
mysql-connector-java
5.1.5
commons-dbcp
commons-dbcp
1.4

    2、Reader实现

/** * Created by heyinbo on 2016/8/17. * 抽象数据读取 */public abstract class PayBillItemReader
implements ItemReader
, InitializingBean { /** * 当前数据所处位置 */ private volatile int current = 0; /** * 数据集 */ protected volatile List
result; private Object lock = new Object(); public T doReader() { synchronized (lock) { if (null == result) { doDownLoad(); } } int next = current++; if (null != result && next < result.size()) { return result.get(next); } return null; } public abstract void doDownLoad(); @Override public void afterPropertiesSet() throws Exception { }}
/** * Created by heyinbo on 2016/8/17. * 数据读取的具体实现 * */public class WXPayBillItemReader extends PayBillItemReader
{ private String id; /** * 下载日期 */ private Date loadDate; /** * 支付渠道 */ private String payWay; @Override public void doDownLoad() { //TODO 下载对账单 } @Override public PayBillItem read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException { return doReader(); } public Date getLoadDate() { return loadDate; } public void setLoadDate(Date loadDate) { this.loadDate = loadDate; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPayWay() { return payWay; } public void setPayWay(String payWay) { this.payWay = payWay; }}

    2、writer实现

public class PayBillItemWriter implements ItemWriter
{ @Override public void write(List items) throws Exception { //TODO write database //测试事务// throw new DemoException("database rollback"); }}

    3、JobExecutionDecider实现

/** * Created by heyinbo on 2016/8/17. * 根据JobParameters传入的值决策流程执行分支 */public class PayBillJobExecutionDecider implements JobExecutionDecider {    @Override    public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {     //根据传入的参数决定step,具体参考配置文件        String payWay = jobExecution.getJobParameters().getString("payWay");        return new FlowExecutionStatus(payWay);    }}  

    5、测试运行

public class DeciderJobLaunch {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("spring-batch-decider.xml");        JobLauncher launcher = (JobLauncher) context.getBean("jobLauncher");        Job job = (Job) context.getBean("deciderJob");        try {            /* 运行Job */            JobExecution result = launcher.run(job, new JobParametersBuilder()                    .addString("id", "10010")                    .addString("payWay", "weixin")                    .addDate("loadDate", new Date())                    .toJobParameters());            /* 处理结束,控制台打印处理结果 */            System.out.println(result.getExitStatus().toString());        } catch (Exception e) {            e.printStackTrace();        }    }}  

    6、batch相关配置

    以上就是整个job的处理流程,其中包括异常处理以及事务管理。

备注:优化对账方式,将数据初始化到redis服务中,通过redis的sdiff命令进行比对筛选差集。目前采用redis是基于其扩展方便,利于后期针对不同渠道进行扩展。

转载于:https://my.oschina.net/u/1263326/blog/737981

你可能感兴趣的文章
mysql内存优化
查看>>
都市求生日记第一篇
查看>>
Java集合---HashMap源码剖析
查看>>
SQL优化技巧
查看>>
thead 固定,tbody 超出滚动(附带改变滚动条样式)
查看>>
Dijkstra算法
查看>>
css 动画 和 响应式布局和兼容性
查看>>
csrf 跨站请求伪造相关以及django的中间件
查看>>
MySQL数据类型--与MySQL零距离接触2-11MySQL自动编号
查看>>
生日小助手源码运行的步骤
查看>>
Configuration python CGI in XAMPP in win-7
查看>>
bzoj 5006(洛谷 4547) [THUWC2017]Bipartite 随机二分图——期望DP
查看>>
CF 888E Maximum Subsequence——折半搜索
查看>>
欧几里德算法(辗转相除法)
查看>>
面试题1-----SVM和LR的异同
查看>>
MFC控件的SubclassDlgItem
查看>>
如何避免历史回退到登录页面
查看>>
《图解HTTP》1~53Page Web网络基础 HTTP协议 HTTP报文内的HTTP信息
查看>>
unix环境高级编程-高级IO(2)
查看>>
树莓派是如何免疫 Meltdown 和 Spectre 漏洞的
查看>>