需求:
新建一个通知,通知下面选择需要通知到的通知人,要求通知发送的时候如果通知发送失败,不能新建通知和具体的通知人关系。发送某个人失败,要求通知成功建立,其他人成功发送则建立通知和通知人的关系,失败发送的话也不影响其他人的成功。
处理:
本想想的是这个东西大概率要用事物的传播特性做吧,七个传播特性
REQUIRED:如果当前没有事务,就新建一个事务。如果当前存在事务,则加入这个事务。这是最常见的选择。 SUPPORTS:如果当前没有事务,就以非事务方式执行。 如果当前有事务,则使用事务。MANDATORY:如果当前没有事务,就抛出异常。 REQUIRES_NEW:如果当前存在事务,把当前事务挂起,并且自己创建一个新的事务给自己使用。如果当前没有事务,则自己新建一个事务。 NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 NESTED:如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。
干了半天没做出来,不确定能不能够实现,然后使用trycatch加事务注解处理了
@Transactional@Overridepublic Map<String, Object> noticeSend(SdssNotificationNoticeInfoQueryVo sdssNotificationNoticeInfoQueryVo) {Map<String, Object> map = doCheck(sdssNotificationNoticeInfoQueryVo);if (!"0".equals(String.valueOf(map.get("status")))) {return map;}String staffCode = unifastContext.getUser().getStaffCode();sdssNotificationNoticeInfoQueryVo.setNotifierStaffNo(staffCode);sdssNotificationNoticeInfoQueryVo.setIfNotified(1);sdssNotificationNoticeInfoQueryVo.setNotificationTime(new Timestamp(System.currentTimeMillis()));if (-1 == sdssNotificationNoticeInfoQueryVo.getId()) {socialSecurityBaseMapper.createNotice(sdssNotificationNoticeInfoQueryVo);} else {//跟新通知单信息socialSecurityBaseMapper.updateSdssNotificationNotice(sdssNotificationNoticeInfoQueryVo);//删除通知单关联socialSecurityBaseMapper.deleteSdssNotificationNoticeInfo(sdssNotificationNoticeInfoQueryVo.getId());}List<SdssNotificationBaseTableInfoQueryVo> sdssNotificationBaseTableInfoQueryVos = deduplicationList(sdssNotificationNoticeInfoQueryVo.getSdssNotificationBaseTableInfoQueryVos());for (SdssNotificationBaseTableInfoQueryVo notificationBaseTableInfoQueryVo : sdssNotificationBaseTableInfoQueryVos) {try {SdssNotificationNoticeInfo sdssNotificationNoticeInfo = new SdssNotificationNoticeInfo();sdssNotificationNoticeInfo.setNotificationTableId(sdssNotificationNoticeInfoQueryVo.getId());sdssNotificationNoticeInfo.setYear(sdssNotificationNoticeInfoQueryVo.getYear());sdssNotificationNoticeInfo.setCityId(sdssNotificationNoticeInfoQueryVo.getCityId());sdssNotificationNoticeInfo.setStaffNo(notificationBaseTableInfoQueryVo.getStaffNo());socialSecurityBaseMapper.createNoticeInfo(sdssNotificationNoticeInfo);Map<String,Object> param = new HashMap<>();param.put("id",sdssNotificationNoticeInfo.getId());param.put("status","1");List<Map<String, Object>> userIdByEmployeeNumber = socialSecurityBaseMapper.findUserIdByEmployeeNumber(sdssNotificationNoticeInfoQueryVo.getNotifierStaffNo());String sendemployeeid = "";if (!userIdByEmployeeNumber.isEmpty()) {sendemployeeid = String.valueOf(userIdByEmployeeNumber.get(0).get("employeeNumber"));}String reciveemployeeid = "";List<Map<String, Object>> userIdByEmployeeNumber1 = socialSecurityBaseMapper.findUserIdByEmployeeNumber(sdssNotificationNoticeInfo.getStaffNo());if (!userIdByEmployeeNumber1.isEmpty()) {reciveemployeeid = String.valueOf(userIdByEmployeeNumber1.get(0).get("employeeNumber"));}String cityName = notificationBaseTableInfoQueryVo.getCityName();int year = notificationBaseTableInfoQueryVo.getYear();String title = "关于"+year+"年度"+cityName+"人员社保基数变更的通知单";String userid = "356442";String flowKey = "SocialBaseConfirm";StartProcessBody startProcessBody = new StartProcessBody();startProcessBody.setTitle(title);startProcessBody.setCurrentUserId(sendemployeeid);startProcessBody.setTaskDefinitionKey(sdssNotificationNoticeInfoQueryVo.getTaskDefinitionKey());startProcessBody.setBusinessKey(String.valueOf(sdssNotificationNoticeInfo.getId()));startProcessBody.setProcessDefinitionKey(flowKey);startProcessBody.setNextUserId(Arrays.asList(reciveemployeeid));BaseResponse<ProcessVO> result = new BaseResponse<ProcessVO>();result = workflowClient.start(startProcessBody);if (!CommonUseEnum.ONE.getValue().equals(result.getCode())) {throw new RuntimeException("流程发起失败!");}socialSecurityBaseMapper.updateSdssNotificationNoticeInfoIfNotified(param);} catch (Exception e) {log.error("通知单发送失败", e.getMessage());}}map.put("status", 0);map.put("msg", "修改完成");return map;}
实话说也没有实现子流程的回滚,也是有问题的,但是完成了我的需求,我是感觉用注解是不能够完全处理问题的,我就想到用手动事务,写了一个手动提交事务的,还可以实现两个事务独立互不影响的效果
@Overridepublic Map<String, Object> noticetesttrans(SdssNotificationNoticeInfoQueryVo sdssNotificationNoticeInfoQueryVo) {Map<String, Object> map = new HashMap<>();//谁有问题谁回滚
// TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
// try{
// createNotice1(sdssNotificationNoticeInfoQueryVo);
// platformTransactionManager.commit(transactionStatus);
// }
// catch (Exception e){
// map.put("status", 0);
// map.put("msg", "修改失败");
// platformTransactionManager.rollback(transactionStatus);
// }
//
// TransactionStatus transactionStatuss = platformTransactionManager.getTransaction(transactionDefinition);
// try{
// createNoticeInfo1(sdssNotificationNoticeInfoQueryVo);
// platformTransactionManager.commit(transactionStatuss);
// }
// catch (Exception e){
// map.put("status", 0);
// map.put("msg", "修改失败");
// platformTransactionManager.rollback(transactionStatuss);
// }//父子结构,主体有问题,连带子一起回滚,子有问题继续处理TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);try {createNotice1(sdssNotificationNoticeInfoQueryVo);platformTransactionManager.commit(transactionStatus);map.put("status", 0);map.put("msg", "修改完成");} catch (Exception e) {platformTransactionManager.rollback(transactionStatus);map.put("status", -1);map.put("msg", "修改失败");return map;}try {createNoticeInfo1(sdssNotificationNoticeInfoQueryVo);map.put("status", 0);map.put("msg", "修改完成");} catch (Exception e) {platformTransactionManager.rollback(transactionStatus);map.put("status", -1);map.put("msg", "修改失败");return map;}map.put("status", 0);map.put("msg", "修改完成");return map;}/*** 创建消息体* @param sdssNotificationNoticeInfoQueryVo*/public void createNotice1(SdssNotificationNoticeInfoQueryVo sdssNotificationNoticeInfoQueryVo){//逻辑socialSecurityBaseMapper.createNotice(sdssNotificationNoticeInfoQueryVo);//逻辑
// int i = 1/0;}public void createNoticeInfo1(SdssNotificationNoticeInfoQueryVo sdssNotificationNoticeInfoQueryVo){if(sdssNotificationNoticeInfoQueryVo.getId()==0){sdssNotificationNoticeInfoQueryVo.setId(9999);}List<SdssNotificationBaseTableInfoQueryVo> sdssNotificationBaseTableInfoQueryVos = sdssNotificationNoticeInfoQueryVo.getSdssNotificationBaseTableInfoQueryVos();for (int i = 0; i < sdssNotificationBaseTableInfoQueryVos.size(); i++) {SdssNotificationBaseTableInfoQueryVo notificationBaseTableInfoQueryVo = sdssNotificationBaseTableInfoQueryVos.get(i);SdssNotificationNoticeInfo sdssNotificationNoticeInfo = new SdssNotificationNoticeInfo();sdssNotificationNoticeInfo.setNotificationTableId(sdssNotificationNoticeInfoQueryVo.getId());sdssNotificationNoticeInfo.setYear(sdssNotificationNoticeInfoQueryVo.getYear());sdssNotificationNoticeInfo.setCityId(sdssNotificationNoticeInfoQueryVo.getCityId());sdssNotificationNoticeInfo.setStaffNo(notificationBaseTableInfoQueryVo.getStaffNo());socialSecurityBaseMapper.createNoticeInfo(sdssNotificationNoticeInfo);if(i == 1){int qw = 1/0;}}}