packagemulti;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;importsimm.framework.threadutils.multi.DefaultExecTask;importsimm.framework.threadutils.multi.ISaveService;importsimm.framework.threadutils.multi.MultiEndFlag;importsimm.framework.threadutils.multi.MultiExecutor;importjava.util.ArrayList;importjava.util.List;importjava.util.UUID;importjava.util.concurrent.ExecutionException;/*** 损益单保存服务*/@Servicepublic class DemoService implements ISaveService{private static final Logger logger = LoggerFactory.getLogger(DefaultExecTask.class);
@AutowiredprivateNoteCheckBalanceMapper noteCheckBalanceMapper;/*** 业务保存
*@paramlist*/
public void save(Listlist){for(NoteCheckBalance item :list){
noteCheckBalanceMapper.insert(item);
}
}/*** 批量保存事件*/@Transactional(rollbackFor= Exception.class)
@Overridepublic Integer batchSave(List list, MultiEndFlag endFlag, UUID threadId) throwsException {int result = 0;try{//业务操作
save(list);
result= 1;//进行waitForEnd 操作,是为了确保所有的线程都最终通知同步协作标志
endFlag.waitForEnd(threadId ,result);//其他线程异常手工回滚
if(result==1 && !endFlag.isAllSuccess()){
String message= "子线程未全部执行成功,对线程["+threadId+"]进行回滚";throw newException(message);
}returnresult;
}catch(Exception ex){
logger.error(ex.toString());if(result ==0){//本身线程异常抛出异常,通知已经做完(判断是为了防止 与 try块中的通知重复)
endFlag.waitForEnd(threadId ,result);
}throwex;
}
}/*** 调用示例
*@paramargs
*@throwsExecutionException
*@throwsInterruptedException*/
public static void main(String[] args) throwsExecutionException, InterruptedException {//调用示例
MultiExecutor.exec(new DemoService(), new ArrayList(),500);
}
}