public class ClusterUtils { private static Log log = LogFactory.getLog(ClusterUtils.class); /** * 存储服务器已授权的可执行方法(applicationContext-frame.xml中配置) */ private static Map<String, String> authorityMap; public static void setAuthorityMap(Map<String, String> authorityMap) { ClusterUtils.authorityMap = authorityMap; } /** * 判断当前服务器是否有权限执行当前方法(true:有权限) * (applicationContext-frame.xml中配置) * @Title: hasExecAuthority * @Description: * @author baolin.liu * @date 2015-8-31 下午04:12:09 * @return * @return boolean */ public static boolean hasExecAuthority() { StackTraceElement[] stackTraces = Thread.currentThread().getStackTrace(); String key = stackTraces[2].getClassName() + "." + stackTraces[2].getMethodName(); String localHostAddress = NetworkUtils.localHostAddress(); if (authorityMap.containsKey(key)) { String values = authorityMap.get(key); if (values != null && !values.contains(localHostAddress)) { log.info("当前服务器放弃执行:" + key + " 当前服务器ip[" + localHostAddress + "]" + " 目标服务器ip[" + values + "]"); return false; } } log.info("当前服务器允许执行:" + key + " 当前服务器ip[" + localHostAddress + "]"); return true; } }
@Transactional @Service public class FixedScanOverdueService implements IFixedScanOverdueService { //日志 private Log log = LogFactory.getLog(FixedScanOverdueService.class); @Resource private IProjectRepayPlanDao projectRepayPlanDao; @Resource private IProjectDao projectDao; @Resource private IPlanZyEqInteEqPrinciService planZyEqInteEqPrinciService ; @Resource private ITaskExecutionDao taskExecutionDao; @Resource private ISequenceService sequenceService; /**定时逾期扫描*/ public boolean process(String userId) { /** 指定服务器运行的方法 **/ if(!ClusterUtils.hasExecAuthority()){ return false; } log.info("******逾期扫描定时器任务启动开始******"); TaskExecution taskExecution=new TaskExecution(); try{ taskExecution.setId(sequenceService.nextval(Sequence.SEQ_TASK_EXECUTION)); taskExecution.setTaskType(TaskExecution.TaskType.overdueScan); taskExecution.setTaskName("逾期定时扫描"); taskExecution.setInsertBy(userId); taskExecution.setSmsFlag("N"); taskExecution.setEmailFlag("N"); /**1.取出逾期列表数据*/ List<ProjectRepayPlan> planlist= projectRepayPlanDao.getProjectRepayOverdueList(null, null); /**取出逾期的项目列表数据*/ List<Long> projectList=getProjectIdList(planlist); /**还款逾期插入集合数据*/ List<ProjectRepayPlan> overdueList=projectRepayPlanDao.getProjectRepayOverdueInsertList(null, null); /**2.计算当期逾期罚息*/ planlist=computeYqMoney(null,planlist); /**3.计算当期应还金额**/ planlist=planZyEqInteEqPrinciService.step50(null,planlist); /**4.计算当期结清罚息*/ planlist=computeJqYqMoneyList(planlist); /**5.计算当结清金额 */ planlist=planZyEqInteEqPrinciService.step60(null,planlist); /**6.剩余实际应还金额(实际应还金额 - 实还金额) */ planlist=computeSyMoney(planlist); /**7.更新还款计划中的逾期天数,逾期罚息,应还金额,结清罚息,当期结清金额,剩余实际应还金额*/ if(null!=planlist&&planlist.size()>0){ projectRepayPlanDao.batchUpdateOverdueRepayPlan(planlist); } /**8.更新项目逾期流程处理*/ if(null!=projectList&&projectList.size()>0){ projectDao.batchUpdateProjectStatus(projectList,ChainStorePropertyLoanStatusEnum.OVERDUE.toString()); } /**9.批量增加还款逾期数据*/ if(null!=overdueList&&overdueList.size()>0){ projectRepayPlanDao.batchInsertRepayOverdue(overdueList); } taskExecution.setStatus("SUCCESS"); log.info("******逾期扫定时器任务启动完成******"); }catch(Exception e){ taskExecution.setStatus("FAIL"); taskExecution.setRemark("逾期扫描定时任务执行失败:"+e.getMessage()); log.info("******逾期扫定时器任务出现异常******"); log.error("", e); throw new RuntimeException("逾期定时器执行失败"); }finally{ taskExecutionDao.insert(taskExecution); } return true; }
<!-- 集群环境配置 --> <bean class="com.shareinfo.commons.utils.ClusterUtils"> <!-- 配置某方法只能在指定的服务器中调用 --> <property name="authorityMap"> <map> <entry key="com.shareinfo.customer.service.impl.FixedScanOverdueService.process" value="192.168.1.100" /> </map> </property> </bean> <!-- END 集群环境配置 -->
集群工具类:
public class ClusterUtils { private static Log log = LogFactory.getLog(ClusterUtils.class); /** * 存储服务器已授权的可执行方法(applicationContext-frame.xml中配置) */ private static Map<String, String> authorityMap; public static void setAuthorityMap(Map<String, String> authorityMap) { ClusterUtils.authorityMap = authorityMap; } /** * 判断当前服务器是否有权限执行当前方法(true:有权限) * (applicationContext-frame.xml中配置) * @Title: hasExecAuthority * @Description: * @author baolin.liu * @date 2015-8-31 下午04:12:09 * @return * @return boolean */ public static boolean hasExecAuthority() { StackTraceElement[] stackTraces = Thread.currentThread().getStackTrace(); String key = stackTraces[2].getClassName() + "." + stackTraces[2].getMethodName(); String localHostAddress = NetworkUtils.localHostAddress(); if (authorityMap.containsKey(key)) { String values = authorityMap.get(key); if (values != null && !values.contains(localHostAddress)) { log.info("当前服务器放弃执行:" + key + " 当前服务器ip[" + localHostAddress + "]" + " 目标服务器ip[" + values + "]"); return false; } } log.info("当前服务器允许执行:" + key + " 当前服务器ip[" + localHostAddress + "]"); return true; } }
说明:本人于ITEYE创建于2015年,现转移到CSDN