事务控制(注解、编码控制)
在Transactional标注的方法里面处理一段事务逻辑提交之后,再处理非事务的逻辑
@Transactional(rollbackFor = Exception.class)@Overridepublic int insertUser(User user) { int result = userMapper.insertSelective(user); TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){ @Override public void afterCommit() { System.out.println("Transaction is commit"); } }); return result;}
编码控制事务。
@Autowiredprivate TransactionTemplate transactionTemplate;@Testpublic void transcationByhand(){ OrderTransboundaryInfoDO insert1 = new OrderTransboundaryInfoDO(); insert1.setOrderCode("zxyTest333"); insert1.setReceiveRealName("zxy333"); insert1.setUserPhone("zxy333"); insert1.setUserId(2143124312412412412L); insert1.setReceiveIdentityCard("dfadsfads"); insert1.setCreateTm(new Date()); //只有excute内部的方法才有事务 transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { orderTransboundaryInfoDAO.insertSelective(insert1); orderTransboundaryInfoDAO.insert(insert1);//此行代码会报错,回滚 } }); }
将service的方法快速异步化
配置线程池
@Configuration@EnableAsync@Slf4jpublic class ExecutorConfiguration { @Bean public Executor asyncServiceExecutor() { log.info("start asyncServiceExecutor"); ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //配置核心线程数 executor.setCorePoolSize(5); //配置最大线程数 executor.setMaxPoolSize(5); //配置队列大小 executor.setQueueCapacity(2000); //配置线程池中的线程的名称前缀 executor.setThreadNamePrefix("async-service-"); // rejection-policy:当pool已经达到max size的时候,如何处理新任务 // CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //执行初始化 executor.initialize(); return executor; }}
异步service方法
@Async("asyncServiceExecutor")@Overridepublic void testAsyncExecutor() { log.info("testAsyncExecutor start"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } log.info("testAsyncExecutor done");}
参考:
分布式SESSION共享
引入redis依赖,配置configuration
@Configuration @EnableRedisHttpSession public class RedisSessionConfig { }
使用spring管理线程池
实例名称:threadPoolTaskExecutor
@Beanpublic ThreadPoolTaskExecutor threadPoolTaskExecutor() { ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); threadPoolTaskExecutor.setCorePoolSize(4); threadPoolTaskExecutor.setMaxPoolSize(20); //任务队列深度 threadPoolTaskExecutor.setQueueCapacity(5000); threadPoolTaskExecutor.setThreadNamePrefix("z-manager-thread-"); //待任务处理完之后才销毁线程池(类似于jdk线程池的shutdown和shutdownNow的区别) threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true); //处理不过来时的拒绝策略 threadPoolTaskExecutor.setRejectedExecutionHandler((runnable, executor) -> { // }); return threadPoolTaskExecutor;}