Java项目中都比较注重设计模式,工厂模式是Spring中核心设计模式之一,简单理解就是对象的创建和管理由框架来完成,使用过程中只需要传入固定标识,然后取出相应的实例,在调用相应的方法。下面从一个具体的例子来解释。
理财系统中涉及的交易过程,比如转入、转出、消费、退款等流程都会存在超时或者失败(向异常补偿表中插一条数据),这时系统需要进行的相应的补偿操作(重复执行),现在想通过一个job实现对所有业务流程的补偿操作。
通常的实现思路很简单,一个switch case语句,判断异常所属的业务类型,接着调用对应的方法进行补偿。
下面使用工厂模式来实现这个功能:
Step 1. 创建一个interface接口,规范补偿执行方法名,然后所有的业务补偿实现这个接口
[mdx_fold title="ExceptionService"]package me.icharm.service.intf.exception; public interface ExceptionService { /** * 交易补偿接口,各个类型交易根据交易请求标识,进行补偿操作 * @param bizFk 外部交易标识 * @return dto 返回补偿结果 */ RespExceptionTaskDto compenTransaction(String bizFk); }[/mdx_fold]
Step 2. 各业务各自实现这个接口的具体补偿过程(实现上面的接口)。
Step 3. 新建一个工厂类并实现InitializingBean,关键。
[mdx_fold title="ExceptionFactory"]package me.icharm.service.impl.exception; import me.icharm.enums.constants.exception.ExceptionCompenTaskEnums.BizCode; import me.icharm.service.intf.exception.ExceptionService; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.Map; /** * 补偿任务工厂类 */ @Service("exceptionFactory") public class ExceptionFactory implements InitializingBean { // 买入 @Autowired @Qualifier("bankBuyService") private ExceptionCompenService bankBuyService; // 卖出 @Autowired @Qualifier("bankSellService") private ExceptionCompenService bankSellService; // ... 注入所有业务的具体补偿实现类 // 用于存放所有业务实现service实例的Map private Map<String, ExceptionCompenService> serviceMap = new HashMap<String, ExceptionCompenService>(); // 根据业务类型,获取对应service实例 public ExceptionCompenService createProcessor(String bizCode) { return serviceMap.get(bizCode); } /** * 重写Spring框架的InitializingBean的afterPropertiesSet来实现由Spring接管各业务补偿实例 */ @Override public void afterPropertiesSet() throws Exception { // 购买 serviceMap.put(BizCode.BUY.code, bankBuyService); // 支取 serviceMap.put(BizCode.DRAW.code, bankSellService); // ...put 所有的业务补偿类实例 }[/mdx_fold]
Step 4. 补偿Job中调用ExceptionFactory 中createProcessor来获取具体的业务补偿实例,在调用补偿方法,实现补偿。
[mdx_fold title="ExceptionTaskJob.java"]package me.icharm.service.job.exception; import me.icharm.dao.dmo.exception.ExceptionTask; import me.icharm.service.enums.constants.exception.ExceptionCompenTaskEnums.BizCode; import me.icharm.service.intf.exception.ExceptionTaskServcice; import me.icharm.service.impl.exception.ExceptionFactory; import java.util.List; @Service("exceptionTaskJob") public class ExceptionTaskJob { /** * JOB BIZ ID */ private static final String BIZ_JOB_ID = "EXCEPTION_TASK_JOB"; /** * 注入异常补偿Service */ @Autowired private ExceptionTaskServcice exceptionTaskServcice; /** * 注入工厂 */ @Autowired private ExceptionFactory exceptionFactory; /** * JOB业务处理方法 */ public void executeInvoke() { // 从异常补偿表中取异常数据 List[/mdx_fold]compenList = exceptionTaskServcice.queryExceptionDataList(); for (ExceptionTask task : compenList) { // 处理补偿业务 ExceptionService compen = exceptionFactory.createProcessor(task.getBizCode()); compen.compenTransaction(task) } } }
Comments | NOTHING