说说分布式事务(二)
3PC
以两阶段提交来说,主持人收到一个提案请求,打电话跟每个组员询问是否通过并统计回复,然后将最后决定打电话通知各组员。要是主持人在跟第一位组员通完电话后失忆,而第一位组员在得知结果并执行后老人痴呆,那么即使重新选出主持人,也没人知道最后的提案决定是什么,也许是通过,也许是驳回,不管大家选择哪一种决定,都有可能与第一位组员已执行过的真实决定不一致,老板就会不开心认为决策小组沟通有问题而解雇。三阶段提交即是引入了另一个步骤,主持人打电话跟组员通知请准备通过提案,以避免没人知道真实决定而造成决定不一致的失业危机。为什么能够解决二阶段提交的问题呢?回到刚刚提到的状况,在主持人通知完第一位组员请准备通过后两人意外失忆,即使没人知道全体在第一阶段的决定为何,全体决策组员仍可以重新协调过程或直接否决,不会有不一致决定而失业。那么当主持人通知完全体组员请准备通过并得到大家的再次确定后进入第三阶段,当主持人通知第一位组员请通过提案后两人意外失忆,这时候其他组员再重新选出主持人后,仍可以知道目前至少是处于准备通过提案阶段,表示第一阶段大家都已经决定要通过了,此时便可以直接通过
sonarqube和mvn整合
SonarQube(Sonar)是一个用于管理代码质量的开源平台。SonarQube目前已支持超过20种主流编程语言,它管理的代码质量主要涉及7个维度:架构与设计、重复、单元测试、复杂度、潜在的bug、代码标准、注释。
本文,笔者将围绕搭建SonarQube这样的代码质量管理平台这个主题展开,结合java代码实例一步步讲述具体的过程,其中涉及Sonar的下载安装、创建对应Mysql数据库以及运行和管理,并对实践过程中出现的一些问题进行了分析和解决。
注:本文中所有的实践都是在Docker虚拟机下进行,但目测同样适用于各个平台。
centos7升级后无法重启或关机解决办法
由于CentOS7新发布的yum源升级包中systemd关机流程判断条件发生了变化,可能会导致centos7升级后,服务器重启时卡死。新发布的systemd进程的判断更加严格,如果某些进程不响应SIGTERM信号,可能会导致重启是挂死。该问题和业务进程对SIGTERM信号的处理有关。
执行yum update systemd(或者yum update)将systemd系列软件包更新到219-19.el7版本之后,reboot会出现如下卡机界面导致系统挂住,无法重启:
现象:
适配器模式之对象适配器
问题导入:比如有A型螺母和B型螺母,那么用户可以再A型螺母上直接使用按着A型螺母生产的A型螺丝,同样也可以在B型螺母上直接使用按着B型螺母标准生产的B型螺丝。但是由于A型螺母和B型螺母的标准不一样,用户在A型螺母上不能直接使用B型的螺丝,反之也一样。该如何达到这个目的呢?
使用适配器就可以解决这个问题:生产一种“A型螺母适配器”,这种A型螺母适配器的前端符合A型螺母标准要求,可以拧在A型螺母上,后端又焊接了一个B型螺母。这样用户就可以借助A型螺母适配器在A型螺母上使用B型的螺丝了。
适配器模式又称为包装器,是用来将一个类的接口转换成客户希望的另外一个接口。这可以使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式的关键是建立一个适配器,这个适配器实现了目标接口并且包含了被适配者的引用。
适配器模式的三种角色:
- 目标:目标是一个接口,该接口是客户想要使用的接口。
- 被适配者:被适配者是一个已经存在的接口或抽象类,这个接口接口或者抽象类需要适配。
- 适配器:适配器是一个类,该类实现了目标接口并且包含有被适配者的引用,即适配器的职责是对适配者接口或抽象类与目标接口进行适配。
以下通过一个简单的问题来描述适配器模式中所涉及的各个角色。
关于MapStruct转换list的问题
mapstruct在转换list之前必须有一个前置转换,即他们的实体之间的转换
错误的转换方式:
1 | List<EggVo> listpoTovo(List<Egg> po); |
正确的转换方式:
1 | @Mapping(source = "id", target = "lid") |
添加了实体转换之后,就可以正常的进行list转换了,同理把属性映射直接加在list转换上也是不行的,要加在实体转换上,然后list的转换也会继承这和属性的映射。
Lombok介绍
背景
我们在开发过程中,通常都会定义大量的JavaBean,然后通过IDE去生成其属性的构造器、getter、setter、equals、hashcode、toString方法,当要对某个属性进行改变时,比如命名、类型等,都需要重新去生成上面提到的这些方法,那Java中有没有一种方式能够避免这种重复的劳动呢?答案是有,我们来看一下下面这张图,右面是一个简单的JavaBean,只定义了两个属性,在类上加上了@Data,从左面的结构图上可以看到,已经自动生成了上面提到的方法。
Lombok简介
ombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。
MapStruct介绍
介绍
MapStruct在一个成熟可维护的工程中,细分模块后,domian工程最好不要被其他工程依赖,但是实体类一般存于domain之中,这样其他工程想获取实体类数据时就需要在各自工程写model,自定义model可以根据自身业务需要而并不需要映射整个实体属性。
mapstruct这个插件就是用来处理domin实体类与model类的属性映射,定义mapper接口,mapstruct就会自动的帮我们实现这个映射接口,避免了麻烦复杂的映射实现。
- Github地址:https://github.com/mapstruct/mapstruct/
- 使用例子:https://github.com/mapstruct/mapstruct-examples
- MapStrcut与其它工具对比以及使用说明:http://www.tuicool.com/articles/uiIRjai