事务控制(注解、编码控制)
在Transactional标注的方法里面处理一段事务逻辑提交之后,再处理非事务的逻辑
@Transactional(rollbackFor = Exception.class)
@Override
public 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;
}
编码控制事务。
@Autowired
private TransactionTemplate transactionTemplate;
@Test
public 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
@Slf4j
public 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")
@Override
public 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
@Bean
public 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;
}