Milo的初始化
上一篇文章我们已经介绍了Milo里面的测试样例,并且执行了测试样例,得到了我们想要的结果,订单服务、库存服务和账户服务数据保持一致。细心的朋友会发现我们项目引入的milo框架会在application.yml配置的milo-tcc数据库参数对应的库里面生成对应的事务日志表。
表的名称为milo_{model-name}_log,这个model-name就是application.yml里面milo-tcc配置的model-name参数项。这些都是在Milo框架初始化的时候就已经生成。下面我们解析Milo的初始化过程,而Milo框架的入口就是milo-spring-cloud-starter模块。
milo-spring-cloud-starter在resources资源文件夹里面定义了EnableAutoConfiguration的配置类,EnableAutoConfiguration的作用简单来说就是可以在项目启动的时候可以自动配置这个Bean,并且这个属性可以在依赖项目的application.yml中配置。
MiloAutoConfiguration的构造方法注入了MiloConfigProperties这个对象,MiloConfigProperties将依赖项目的application.yml中配置引入到我们的Milo框架。
同时MiloAutoConfiguration配置对象里面还会创建MiloTransactionBootstrap,MiloTransactionBootstrap对象的创建依赖MiloBootstrapService和MiloConfigProperties这两个对象。我们进入到MiloTransactionBootstrap
MiloTransactionBootstrap实现了ApplicationContextAware接口,从而可以拿到ApplicationContext,并保存到SpringBeanUtils中,同时调用miloBootstrapService.initMiloTccTransaction(miloConfig);
MiloBootstrapService依赖了MiloLogDaoService,通过MiloLogDaoService去初始化连接池HikariDataSource,创建数据库表milo_xxx_log。
从我们执行样例项目的日志看到,Milo的初始化过程还包括了一个定时任务的初始化
所以除了初始化数据库之外,milo框架还初始化了MiloTransactionLogHandleScheduled,MiloTransactionLogHandleScheduled是事务处理异常的自恢复定时任务,是Milo框架的重要组成部分,后面会详细分析MiloTransactionLogHandleScheduled是如何处理事务日志达到自恢复的。