这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战
- 在spring-cloud-ozx-account、spring-cloud-ozx-repo、spring-cloud-ozx-order三个服务中添加一个配置类SeataAutoConfig,主要实现如下:
- 配置数据源代理DataSourceProxy
- 初始化GlobalTransactionScanner,装载到Spring IOC容器中。
下面配置类是手动配置完成,GlobalTransactionScanner中的两个参数分别是applicationId(应用名称)和txServiceGroup(事务分组),但是seata-spring-boot-starter主动完成了这些功能,并且Seata自动完成了数据源的代理
@Configuration
@EnableConfigurationProperties({SeataProperties.class})
public class SeataAutoConfig{
@Autowired
private DataSourceProperties dataSourceProperties;
@Autowired
private ApplicationContext applicationContext;
@Autowired
private SeataProperties seataProperties;
public SeataAutoConfig(SeataProperties seataProperties,ApplicationContext applicationContext){
this.applicationContext=applicationContext;
this.seataProperties=seataProperties;
}
@Bean
public DruidDataSource druidDataSource(){
DruidDataSource druidDataSource= new DruidDataSource();
druidDataSource.setUrl(dataSourceProperties.getUrl());
druidDataSource.setUsername(dataSourceProperties.getUsername());
druidDataSource.setPassword(dataSourceProperties.getPassword());
druidDataSource.setDriverClassName(dataSourceProperties.getDriverClassName());
return druidDataSource;
}
@Bean
public DataSourceProxy dataSourceProxy(DruidDataSource druidDataSource){
return new DataSourceProxy(druidDataSource);
}
@Bean
public DataSourceTransactionManager transactionManager(DataSourceProxy dataSourceProxy){
return new DataSourceTransactionManager(dataSourceProxy);
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSourceProxy dataSourceProxy) throws Exception{
SqlSessionFactoryBean sqlSessionFactoryBean=new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSourceProxy);
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:com/ozx/springcloud/seata/orderprovider/mappper/*Mapper.xml"));
sqlSessionFactoryBean.setTransactionFactory(new SpringManagerTransactionFactory());
return sqlSessionFactoryBean.getObject();
}
@Bean
public GlobalTransactionScanner globalTransactionScanner(){
String applicationName=this.applicationContext.getEnvironment().getProperty("spring.application.name");
String txServiceGroup=this.seataProperties.getTxServiceGroup();
if(StringUtils.isEmpty(txServiceGroup)){
txServiceGroup= applicationName +"-seata-service-group";
this.seataProperties.setTxServiceGroup(txServiceGroup);
}
return new GlobalTransactionScanner(applicaitonName,txServiceGroup);
}
}
复制代码
注意点:
2.1.1.RELEASE版本的内嵌的seata的版本是0.9.0,所以它无法和seata-spring-boot-starter兼容。
采用自定义配置类SeataAutoConfig,需要在@SpringBootApplication注解内exclude去掉spring-cloud-alibaba-seata内的GlobalTransactionAutoConfiguration,否则两个配置类会产生冲突。
`@SpringBootApplication(exclude=GlobalTransactionAutoConfiguration.class)
spring-cloud-ozx-rest项目配置类如下,它没有关联数据源,所以只需要装载GlobalTransactionScanner,它自动扫描包含GlobalTransactional注解的代码
@EnableConfigurationProperties({SeataProperties.class})
@Configuration
public class SeataAutoConfig{
@Autowired
private ApplicationContext applicationContext;
@Autowired
private SeataProperties seataProperites;
public SeataAutoConfig(SeataProperties seataProperties,ApplicationContext applicationContext){
this.seataProperties=seataProperties;
this.applicationContext=applicationContext;
}
@Bean
@Bean
public GlobalTransactionScanner globalTransactionScanner(){
String applicationName=this.applicationContext.getEnvironment().getProperty("spring.application.name");
String txServiceGroup=this.seataProperties.getTxServiceGroup();
if(StringUtils.isEmpty(txServiceGroup)){
txServiceGroup= applicationName +"-seata-service-group";
this.seataProperties.setTxServiceGroup(txServiceGroup);
}
return new GlobalTransactionScanner(applicaitonName,txServiceGroup);
}
}
复制代码
基于Spring Cloud框架集成Seata框架配置完成,由于Spring Cloud没有提供分布式事务处理规范,它不能像配置中心插拔式集成各种主流的解决方案,而Spring Cloud Alibaba Seata本质是基于Spring Boot 自动装配来整合的。`
近期评论