diff --git a/README.md b/README.md index 8962f1404..f002052a0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# LCN分布式事务框架v4.0 +# LCN分布式事务框架v4.0 for springboot2.0.x "LCN并不生产事务,LCN只是本地事务的协调者" @@ -30,11 +30,11 @@ ## 目录说明 -transaction-dubbo LCN dubbo rpc框架扩展支持 +extensions feign扩展配置类 -transaction-springcloud LCN springcloud rpc框架扩展支持 +springcloud-lcn-demo demo案例 -transaction-motan LCN motan rpc框架扩展支持 +transaction-springcloud LCN springcloud rpc框架扩展支持 tx-client 是LCN核心tx模块端控制框架 @@ -48,7 +48,6 @@ tx-plugins-db 是LCN 对关系型数据库的插件支持 分布式事务发起方: ``` - @Override @TxTransaction(isStart=true) @Transactional @@ -61,13 +60,10 @@ tx-plugins-db 是LCN 对关系型数据库的插件支持 int v = 100/0; return true; } - - ``` 分布式事务被调用方(test2Service的业务实现类) ``` - @Override @Transactional @TxTransaction @@ -76,7 +72,6 @@ tx-plugins-db 是LCN 对关系型数据库的插件支持 testDao.save(); return true; } - ``` 如上代码执行完成以后两个模块都将回滚事务。 @@ -119,27 +114,12 @@ tx-plugins-db 是LCN 对关系型数据库的插件支持 ${lcn.last.version} - com.codingapi tx-plugins-db ${lcn.last.version} - - - com.codingapi - transaction-dubbo - ${lcn.last.version} - - - - com.codingapi - transaction-motan - ${lcn.last.version} - - - com.codingapi transaction-springcloud @@ -148,19 +128,6 @@ tx-plugins-db 是LCN 对关系型数据库的插件支持 ``` -依赖gradle等形式,见中心库 - -[http://mvnrepository.com/search?q=codingapi](http://mvnrepository.com/search?q=codingapi) - - ## demo演示教程 -每个demo下有区分为 jdbc/hibernate/mybatis不同框架的版本demo - -[springcloud版本](https://github.com/codingapi/springcloud-lcn-demo) - -[dubbo版本](https://github.com/codingapi/dubbo-lcn-demo) - -[motan版本](https://gitee.com/zfvipCase/motan-lcn-demo) - -技术交流群:554855843 +[springcloud版本](https://github.com/yizhishang/tx-lcn/tree/springcloud-2.0.4/springcloud-lcn-demo) diff --git a/pom.xml b/pom.xml index 840e7f088..900705dcc 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.codingapi tx-lcn - 4.2.0-SNAPSHOT + 4.2.0 pom tx-lcn @@ -16,64 +16,34 @@ tx-client tx-manager - transaction-dubbo transaction-springcloud - transaction-motan - tx-plugins-db + + springcloud-lcn-demo yyyyMMddHHmmss UTF-8 UTF-8 - 1.7 - 1.7 - 1.7 + 1.8 + 1.8 + 1.8 3.6.0 - 4.2.0-SNAPSHOT - - - - - - - The Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - - - - - lorne - 1991wangliang@gmail.com - - developer - - +8 - - - - - scm:git:https://github.com/codingapi/tx-lcn.git - scm:git:https://github.com/codingapi/tx-lcn.git - https://github.com/codingapi/tx-lcn - v${project.version} - - - - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - - ossrh - Maven Central Staging Repository - https://oss.sonatype.org/service/local/staging/deploy/maven2/ - - + 1.8.4 + 19.0 + 4.0.38 + 1.1.3 + 4.0.0 + 1.7.7 + 4.2.0 + 2.0.4.RELEASE + 5.0.8.RELEASE + 2.0.0.RELEASE + @@ -101,7 +71,6 @@ - org.sonatype.plugins nexus-staging-maven-plugin @@ -113,37 +82,6 @@ true - - org.apache.maven.plugins - maven-javadoc-plugin - 2.10.3 - - - attach-javadocs - - jar - - - - - - - - - - - - - - - - - - - - - - diff --git a/springcloud-lcn-demo/README.md b/springcloud-lcn-demo/README.md new file mode 100644 index 000000000..b592b60f0 --- /dev/null +++ b/springcloud-lcn-demo/README.md @@ -0,0 +1,41 @@ +>1.maven引入 +````xml + + com.codingapi + transaction-springcloud + ${lcn.last.version} + + + org.slf4j + * + + + + + com.codingapi + tx-plugins-db + ${lcn.last.version} + + + org.slf4j + * + + + +```` + +>2.application.properties文件配置eureka地址 +```properties +eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/ +``` + +>3.发起方和参与方的业务方法添加@Transactional注解和@TxTransaction注解 + +>4.发起方中的涉及分布式事务的方法要添加@TxTransaction(isStart = true)注解 + +>5.tx-manager启动前要配置redis + +>6.springboot启动类添加注解配置@EnableFeignClients(basePackages = {"com.codingapi.tx"}) + + +注意事项:避免事务发起方和调用方操作一张表的数据,会导致锁表 \ No newline at end of file diff --git a/springcloud-lcn-demo/pom.xml b/springcloud-lcn-demo/pom.xml new file mode 100644 index 000000000..23919c8f7 --- /dev/null +++ b/springcloud-lcn-demo/pom.xml @@ -0,0 +1,125 @@ + + + 4.0.0 + + com.codingapi + springcloud-lcn-demo + 4.2.0 + pom + + springcloud-lcn-demo + + + springcloud-mybatis-demo1 + springcloud-mybatis-demo2 + springcloud-mybatis-demo3 + + + + org.springframework.boot + spring-boot-starter-parent + 2.0.4.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + 1.8 + 1.8 + + 4.2.0 + Finchley.RELEASE + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + com.codingapi + transaction-springcloud + ${lcn.last.version} + + + org.slf4j + * + + + + + + com.codingapi + tx-plugins-db + ${lcn.last.version} + + + org.slf4j + * + + + + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + 2.0.0.RELEASE + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.boot + spring-boot-starter-undertow + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compile.source} + ${maven.compile.target} + ${project.build.sourceEncoding} + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + \ No newline at end of file diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/pom.xml b/springcloud-lcn-demo/springcloud-mybatis-demo1/pom.xml new file mode 100644 index 000000000..db80dd3d1 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + com.example + springcloud-mybatis-demo1 + 0.0.1-SNAPSHOT + jar + + springcloud-mybatis-demo1 + Demo project for Spring Boot + + + com.codingapi + springcloud-lcn-demo + 4.2.0 + + + + UTF-8 + UTF-8 + + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 1.1.1 + + + + org.springframework.boot + spring-boot-starter-actuator + + + + com.alibaba + druid + 1.0.19 + + + + mysql + mysql-connector-java + 5.1.43 + + + + + diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/MybatisDemo1Application.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/MybatisDemo1Application.java new file mode 100644 index 000000000..904a1ad3d --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/MybatisDemo1Application.java @@ -0,0 +1,45 @@ +package com.example.demo; + +import com.alibaba.druid.pool.DruidDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; + +import javax.sql.DataSource; + +@Configuration +@SpringBootApplication +@EnableEurekaClient +@EnableFeignClients(basePackages = {"com.codingapi.tx", "com.example.demo"}) +public class MybatisDemo1Application { + + public static void main(String[] args) { + SpringApplication.run(MybatisDemo1Application.class, args); + } + + @Autowired + private Environment env; + + @Bean + public DataSource dataSource() { + DruidDataSource dataSource = new DruidDataSource(); + dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name")); + dataSource.setUrl(env.getProperty("spring.datasource.url")); + dataSource.setUsername(env.getProperty("spring.datasource.username")); + dataSource.setPassword(env.getProperty("spring.datasource.password")); + dataSource.setInitialSize(10); + dataSource.setMaxActive(50); + dataSource.setMinIdle(0); + dataSource.setMaxWait(60000); + dataSource.setValidationQuery("SELECT 1"); + dataSource.setTestOnBorrow(false); + dataSource.setTestWhileIdle(true); + dataSource.setPoolPreparedStatements(false); + return dataSource; + } +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/client/Demo2Client.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/client/Demo2Client.java new file mode 100644 index 000000000..dae430696 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/client/Demo2Client.java @@ -0,0 +1,23 @@ +package com.example.demo.client; + +import com.example.demo.entity.Test; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * Created by lorne on 2017/6/27. + */ +@FeignClient(value = "demo2", fallback = Demo2ClientHystric.class) +public interface Demo2Client { + + @RequestMapping(value = "/demo/list", method = RequestMethod.GET) + List list(); + + + @RequestMapping(value = "/demo/save", method = RequestMethod.GET) + int save(@RequestParam(value = "id") String id, @RequestParam(value = "name") String name); +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/client/Demo2ClientHystric.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/client/Demo2ClientHystric.java new file mode 100644 index 000000000..8e4796335 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/client/Demo2ClientHystric.java @@ -0,0 +1,24 @@ +package com.example.demo.client; + +import com.example.demo.entity.Test; +import org.springframework.stereotype.Component; + +import java.util.List; + + +@Component +public class Demo2ClientHystric implements Demo2Client { + + + @Override + public List list() { + System.out.println("进入断路器-list。。。"); + throw new RuntimeException("list 保存失败."); + } + + @Override + public int save(String id, String name) { + System.out.println("进入断路器-save。。。"); + throw new RuntimeException("save 保存失败."); + } +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/client/Demo3Client.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/client/Demo3Client.java new file mode 100644 index 000000000..45fcf1d73 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/client/Demo3Client.java @@ -0,0 +1,19 @@ +package com.example.demo.client; + +import com.example.demo.entity.Test; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * Created by lorne on 2017/6/27. + */ +@FeignClient(value = "demo3", fallback = Demo3ClientHystric.class) +public interface Demo3Client { + + @RequestMapping(value = "/demo/save", method = RequestMethod.GET) + int save(); +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/client/Demo3ClientHystric.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/client/Demo3ClientHystric.java new file mode 100644 index 000000000..e43ce0c63 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/client/Demo3ClientHystric.java @@ -0,0 +1,17 @@ +package com.example.demo.client; + +import com.example.demo.entity.Test; +import org.springframework.stereotype.Component; + +import java.util.List; + + +@Component +public class Demo3ClientHystric implements Demo3Client { + + @Override + public int save() { + System.out.println("进入断路器-save。。。"); + throw new RuntimeException("save 保存失败."); + } +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/controller/DemoController.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/controller/DemoController.java new file mode 100644 index 000000000..69d80a032 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/controller/DemoController.java @@ -0,0 +1,51 @@ +package com.example.demo.controller; + + +import com.alibaba.fastjson.JSONObject; +import com.codingapi.tx.framework.utils.SerializerUtils; +import com.codingapi.tx.model.TransactionInvocation; +import com.example.demo.entity.Test; +import com.example.demo.service.DemoService; +import com.lorne.core.framework.utils.encode.Base64Utils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * Created by lorne on 2017/6/26. + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Autowired + private DemoService demoService; + + + @RequestMapping("/list") + @ResponseBody + public List list(){ + return demoService.list(); + } + + + @RequestMapping("/save") + @ResponseBody + public int save(String id, String name){ + return demoService.save(id, name); + } + + @PostMapping("notifyResult") + public String notifyResult(@RequestBody String jsonStr) + { + System.out.println("通知地址..." + jsonStr); + String data = (String) JSONObject.parseObject(jsonStr).get("json"); + data = (String) JSONObject.parseObject(data).get("data"); + byte[] serializers = Base64Utils.decode(data); + TransactionInvocation transactionInvocation = SerializerUtils.parserTransactionInvocation(serializers); + + System.out.println(transactionInvocation.getMethodStr()); + return null; + } +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/dao/TestMapper.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/dao/TestMapper.java new file mode 100644 index 000000000..4a0148fc7 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/dao/TestMapper.java @@ -0,0 +1,24 @@ +package com.example.demo.dao; + +import com.example.demo.entity.Test; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * Created by lorne on 2017/6/28. + */ +@Mapper +public interface TestMapper { + + + @Select("SELECT * FROM T_TEST") + List findAll(); + + @Insert("INSERT INTO T_TEST(NAME) VALUES(#{name})") + int save(@Param("name") String name); + +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/entity/Test.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/entity/Test.java new file mode 100644 index 000000000..763d8bffa --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/entity/Test.java @@ -0,0 +1,29 @@ +package com.example.demo.entity; + +/** + * Created by lorne on 2017/6/26. + */ + +public class Test { + + + private Integer id; + + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/DemoService.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/DemoService.java new file mode 100644 index 000000000..979dccf67 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/DemoService.java @@ -0,0 +1,16 @@ +package com.example.demo.service; + +import com.example.demo.entity.Test; + +import java.util.List; + +/** + * Created by lorne on 2017/6/26. + */ +public interface DemoService { + + List list(); + + int save(String id, String name); + +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/DemoServiceImpl.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/DemoServiceImpl.java new file mode 100644 index 000000000..f33a27d2b --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/DemoServiceImpl.java @@ -0,0 +1,53 @@ +package com.example.demo.service.impl; + +import com.codingapi.tx.annotation.TxTransaction; +import com.example.demo.client.Demo2Client; +import com.example.demo.client.Demo3Client; +import com.example.demo.dao.TestMapper; +import com.example.demo.entity.Test; +import com.example.demo.service.DemoService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * Created by lorne on 2017/6/26. + */ +@Service +public class DemoServiceImpl implements DemoService { + + + @Autowired + private Demo2Client demo2Client; + + @Autowired + private Demo3Client demo3Client; + + @Autowired + private TestMapper testMapper; + + private Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class); + + @Override + public List list() { + return testMapper.findAll(); + } + + @Override + @TxTransaction(isStart = true) + @Transactional + public int save(String id, String name) { + + testMapper.save("mybatis1"); + + demo2Client.save(id, name); + + demo3Client.save(); + + return 2; + } +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/resources/application.properties b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/resources/application.properties new file mode 100644 index 000000000..a26c20ceb --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/resources/application.properties @@ -0,0 +1,32 @@ +#feign.hystrix.enabled=true + +spring.datasource.driver-class-name = com.mysql.jdbc.Driver +spring.datasource.url= jdbc:mysql://localhost:3306/test?useSSL=false +spring.datasource.username= root +spring.datasource.password=root +spring.datasource.initialize = true +init-db= true + + +## \u5173\u4E8Espringcloud-hystrix\u673A\u5236 +#hystrix.command.default.execution.isolation.strategy= SEMAPHORE +#hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000 + + +spring.application.name = demo1 +server.port = 8081 +#${random.int[9000,9999]} +eureka.client.service-url.defaultZone=http://127.0.0.1:1111/eureka/ + +#Ribbon\u7684\u8D1F\u8F7D\u5747\u8861\u7B56\u7565 +tx-manager.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule +tx-manager.ribbon.MaxAutoRetriesNextServer=0 + +ribbon.eureka.enabled=true +ribbon.readTimeout=6000 +ribbon.ConnectTimeout=6000 + +#txmanager\u5730\u5740 +tm.manager.url=http://127.0.0.1:9010/tx/manager/ + +logging.level.com.codingapi=debug \ No newline at end of file diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo2/pom.xml b/springcloud-lcn-demo/springcloud-mybatis-demo2/pom.xml new file mode 100644 index 000000000..98724199f --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo2/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + com.example + springcloud-mybatis-demo2 + 0.0.1-SNAPSHOT + jar + + springcloud-mybatis-demo2 + Demo project for Spring Boot + + + com.codingapi + springcloud-lcn-demo + 4.2.0 + + + + UTF-8 + UTF-8 + + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 1.1.1 + + + + org.springframework.boot + spring-boot-starter-actuator + + + + com.alibaba + druid + 1.0.19 + + + + mysql + mysql-connector-java + 5.1.43 + + + + + + + diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/MybatisDemo2Application.java b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/MybatisDemo2Application.java new file mode 100644 index 000000000..b4d943f83 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/MybatisDemo2Application.java @@ -0,0 +1,46 @@ +package com.example.demo; + +import com.alibaba.druid.pool.DruidDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; + +import javax.sql.DataSource; + +@Configuration +@SpringBootApplication +@EnableEurekaClient +@EnableFeignClients(basePackages = {"com.codingapi.tx"}) +public class MybatisDemo2Application { + + public static void main(String[] args) { + SpringApplication.run(MybatisDemo2Application.class, args); + } + + @Autowired + private Environment env; + + @Bean + public DataSource dataSource() { + DruidDataSource dataSource = new DruidDataSource(); + dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name")); + dataSource.setUrl(env.getProperty("spring.datasource.url")); + dataSource.setUsername(env.getProperty("spring.datasource.username")); + dataSource.setPassword(env.getProperty("spring.datasource.password")); + dataSource.setInitialSize(2); + dataSource.setMaxActive(20); + dataSource.setMinIdle(0); + dataSource.setMaxWait(60000); + dataSource.setValidationQuery("SELECT 1"); + dataSource.setTestOnBorrow(false); + dataSource.setTestWhileIdle(true); + dataSource.setPoolPreparedStatements(false); + return dataSource; + } + +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/controller/DemoController.java b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/controller/DemoController.java new file mode 100644 index 000000000..832188de9 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/controller/DemoController.java @@ -0,0 +1,36 @@ +package com.example.demo.controller; + + +import com.example.demo.entity.Test; +import com.example.demo.service.DemoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * Created by lorne on 2017/6/26. + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Autowired + private DemoService demoService; + + + @RequestMapping("/list") + @ResponseBody + public List list(){ + return demoService.list(); + } + + + @RequestMapping("/save") + @ResponseBody + public int save(String id, String name){ + return demoService.save(id, name); + } +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/dao/TestMapper.java b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/dao/TestMapper.java new file mode 100644 index 000000000..648d9ac2f --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/dao/TestMapper.java @@ -0,0 +1,24 @@ +package com.example.demo.dao; + +import com.example.demo.entity.Test; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * Created by lorne on 2017/6/28. + */ +@Mapper +public interface TestMapper { + + + @Select("SELECT * FROM T_TEST") + List findAll(); + + @Insert("INSERT INTO T_TEST(ID, NAME) VALUES(#{id}, #{name})") + int save(@Param("id") String id, @Param("name") String name); + +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/entity/Test.java b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/entity/Test.java new file mode 100644 index 000000000..973c06547 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/entity/Test.java @@ -0,0 +1,28 @@ +package com.example.demo.entity; + +/** + * Created by lorne on 2017/6/26. + */ + +public class Test { + + private Integer id; + + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/DemoService.java b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/DemoService.java new file mode 100644 index 000000000..979dccf67 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/DemoService.java @@ -0,0 +1,16 @@ +package com.example.demo.service; + +import com.example.demo.entity.Test; + +import java.util.List; + +/** + * Created by lorne on 2017/6/26. + */ +public interface DemoService { + + List list(); + + int save(String id, String name); + +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/DemoServiceImpl.java b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/DemoServiceImpl.java new file mode 100644 index 000000000..deb941fdb --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/DemoServiceImpl.java @@ -0,0 +1,34 @@ +package com.example.demo.service.impl; + +import com.codingapi.tx.annotation.ITxTransaction; +import com.codingapi.tx.annotation.TxTransaction; +import com.example.demo.dao.TestMapper; +import com.example.demo.entity.Test; +import com.example.demo.service.DemoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * Created by lorne on 2017/6/26. + */ +@Service +public class DemoServiceImpl implements DemoService, ITxTransaction { + + @Autowired + private TestMapper testMapper; + + @Override + public List list() { + return testMapper.findAll(); + } + + @Override + @TxTransaction + @Transactional + public int save(String id, String name) { + return testMapper.save(id, name); + } +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/resources/application.properties b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/resources/application.properties new file mode 100644 index 000000000..e12fa5eb6 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/resources/application.properties @@ -0,0 +1,24 @@ +spring.datasource.driver-class-name = com.mysql.jdbc.Driver +spring.datasource.url= jdbc:mysql://localhost:3306/test?useSSL=false +spring.datasource.username= root +spring.datasource.password=root +spring.datasource.initialize = true +init-db= true + +spring.application.name = demo2 +server.port = 8082 +#${random.int[9000,9999]} +eureka.client.service-url.defaultZone=http://127.0.0.1:1111/eureka/ + +##Ribbon\u7684\u8D1F\u8F7D\u5747\u8861\u7B56\u7565 +tx-manager.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule +tx-manager.ribbon.MaxAutoRetriesNextServer=0 + +ribbon.eureka.enabled=true +ribbon.readTimeout=6000 +ribbon.ConnectTimeout=6000 + +#txmanager\u5730\u5740 +tm.manager.url=http://127.0.0.1:9010/tx/manager/ + +logging.level.com.codingapi=debug \ No newline at end of file diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo3/pom.xml b/springcloud-lcn-demo/springcloud-mybatis-demo3/pom.xml new file mode 100644 index 000000000..bf2594e1c --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo3/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + com.example + springcloud-mybatis-demo3 + 0.0.1-SNAPSHOT + jar + + springcloud-mybatis-demo2 + Demo project for Spring Boot + + + com.codingapi + springcloud-lcn-demo + 4.2.0 + + + + UTF-8 + UTF-8 + + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 1.1.1 + + + + org.springframework.boot + spring-boot-starter-actuator + + + + com.alibaba + druid + 1.0.19 + + + + mysql + mysql-connector-java + 5.1.43 + + + + + + + diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/MybatisDemo3Application.java b/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/MybatisDemo3Application.java new file mode 100644 index 000000000..baeb723b7 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/MybatisDemo3Application.java @@ -0,0 +1,46 @@ +package com.example.demo; + +import com.alibaba.druid.pool.DruidDataSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; + +import javax.sql.DataSource; + +@Configuration +@SpringBootApplication +@EnableEurekaClient +@EnableFeignClients(basePackages = {"com.codingapi.tx"}) +public class MybatisDemo3Application { + + public static void main(String[] args) { + SpringApplication.run(MybatisDemo3Application.class, args); + } + + @Autowired + private Environment env; + + @Bean + public DataSource dataSource() { + DruidDataSource dataSource = new DruidDataSource(); + dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name")); + dataSource.setUrl(env.getProperty("spring.datasource.url")); + dataSource.setUsername(env.getProperty("spring.datasource.username")); + dataSource.setPassword(env.getProperty("spring.datasource.password")); + dataSource.setInitialSize(2); + dataSource.setMaxActive(20); + dataSource.setMinIdle(0); + dataSource.setMaxWait(60000); + dataSource.setValidationQuery("SELECT 1"); + dataSource.setTestOnBorrow(false); + dataSource.setTestWhileIdle(true); + dataSource.setPoolPreparedStatements(false); + return dataSource; + } + +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/controller/DemoController.java b/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/controller/DemoController.java new file mode 100644 index 000000000..941745160 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/controller/DemoController.java @@ -0,0 +1,36 @@ +package com.example.demo.controller; + + +import com.example.demo.entity.Test; +import com.example.demo.service.DemoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * Created by lorne on 2017/6/26. + */ +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Autowired + private DemoService demoService; + + + @RequestMapping("/list") + @ResponseBody + public List list(){ + return demoService.list(); + } + + + @RequestMapping("/save") + @ResponseBody + public int save(){ + return demoService.save(); + } +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/dao/TestMapper.java b/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/dao/TestMapper.java new file mode 100644 index 000000000..648d9ac2f --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/dao/TestMapper.java @@ -0,0 +1,24 @@ +package com.example.demo.dao; + +import com.example.demo.entity.Test; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * Created by lorne on 2017/6/28. + */ +@Mapper +public interface TestMapper { + + + @Select("SELECT * FROM T_TEST") + List findAll(); + + @Insert("INSERT INTO T_TEST(ID, NAME) VALUES(#{id}, #{name})") + int save(@Param("id") String id, @Param("name") String name); + +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/entity/Test.java b/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/entity/Test.java new file mode 100644 index 000000000..973c06547 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/entity/Test.java @@ -0,0 +1,28 @@ +package com.example.demo.entity; + +/** + * Created by lorne on 2017/6/26. + */ + +public class Test { + + private Integer id; + + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/service/DemoService.java b/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/service/DemoService.java new file mode 100644 index 000000000..ecf199308 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/service/DemoService.java @@ -0,0 +1,16 @@ +package com.example.demo.service; + +import com.example.demo.entity.Test; + +import java.util.List; + +/** + * Created by lorne on 2017/6/26. + */ +public interface DemoService { + + List list(); + + int save(); + +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/service/impl/DemoServiceImpl.java b/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/service/impl/DemoServiceImpl.java new file mode 100644 index 000000000..3cc1d8f29 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/service/impl/DemoServiceImpl.java @@ -0,0 +1,37 @@ +package com.example.demo.service.impl; + +import com.codingapi.tx.annotation.ITxTransaction; +import com.codingapi.tx.annotation.TxTransaction; +import com.example.demo.dao.TestMapper; +import com.example.demo.entity.Test; +import com.example.demo.service.DemoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Random; + +/** + * Created by lorne on 2017/6/26. + */ +@Service +public class DemoServiceImpl implements DemoService, ITxTransaction { + + @Autowired + private TestMapper testMapper; + + @Override + public List list() { + return testMapper.findAll(); + } + + @Override + @TxTransaction + @Transactional + public int save() { + Random random = new Random(); + Integer ss = random.nextInt(1000); + return testMapper.save(ss + "", "demo3"); + } +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/resources/application.properties b/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/resources/application.properties new file mode 100644 index 000000000..3cc2347d7 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/resources/application.properties @@ -0,0 +1,22 @@ +spring.datasource.driver-class-name = com.mysql.jdbc.Driver +spring.datasource.url= jdbc:mysql://localhost:3306/test?useSSL=false +spring.datasource.username= root +spring.datasource.password=root + +spring.application.name = demo3 +server.port = 8083 +#${random.int[9000,9999]} +eureka.client.service-url.defaultZone=http://127.0.0.1:1111/eureka/ + +##Ribbon\u7684\u8D1F\u8F7D\u5747\u8861\u7B56\u7565 +tx-manager.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule +tx-manager.ribbon.MaxAutoRetriesNextServer=0 + +ribbon.eureka.enabled=true +ribbon.readTimeout=6000 +ribbon.ConnectTimeout=6000 + +#txmanager\u5730\u5740 +tm.manager.url=http://127.0.0.1:9010/tx/manager/ + +logging.level.com.codingapi=debug \ No newline at end of file diff --git a/transaction-dubbo/.gitignore b/transaction-dubbo/.gitignore deleted file mode 100644 index e371e574f..000000000 --- a/transaction-dubbo/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -.DS_Store -node_modules/ -dist/ -npm-debug.log -test/unit/coverage -test/e2e/reports -selenium-debug.log - -.classpath -.project -.settings/ -target/ -out/ -output/ - -.idea/ -*.iml -logging.path_IS_UNDEFINED/ -nohup.out diff --git a/transaction-dubbo/README.md b/transaction-dubbo/README.md deleted file mode 100644 index 6b7eea35e..000000000 --- a/transaction-dubbo/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# transaction-dubbo - -是LCN基于dubbo的分布式事务框架 \ No newline at end of file diff --git a/transaction-dubbo/pom.xml b/transaction-dubbo/pom.xml deleted file mode 100644 index 064d77314..000000000 --- a/transaction-dubbo/pom.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - 4.0.0 - - - - com.codingapi - tx-lcn - 4.2.0-SNAPSHOT - - - com.codingapi - transaction-dubbo - ${lcn.last.version} - - - transaction-dubbo - https://github.com/codingapi/tx-lcn - - transaction-dubbo project for Spring Boot - - - - 2.5.7 - - - - - - com.codingapi - tx-client - ${lcn.last.version} - - - - com.alibaba - dubbo - ${dubbo.version} - - - org.springframework - spring - - - - - - com.101tec - zkclient - 0.3 - - - - - \ No newline at end of file diff --git a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/ConsistentHashLoadBalanceProxy.java b/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/ConsistentHashLoadBalanceProxy.java deleted file mode 100644 index 77723a737..000000000 --- a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/ConsistentHashLoadBalanceProxy.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.codingapi.tx.dubbo.balance; - -import com.alibaba.dubbo.common.URL; -import com.alibaba.dubbo.rpc.Invocation; -import com.alibaba.dubbo.rpc.Invoker; -import com.alibaba.dubbo.rpc.cluster.loadbalance.ConsistentHashLoadBalance; - -import java.util.List; - -/** - * create by lorne on 2017/11/29 - */ -public class ConsistentHashLoadBalanceProxy extends ConsistentHashLoadBalance { - - - private LCNBalanceProxy lcnBalanceProxy = new LCNBalanceProxy(); - - @Override - public Invoker select(List> invokers, URL url, Invocation invocation) { - return lcnBalanceProxy.proxy(invokers,super.select(invokers, url, invocation)); - } -} diff --git a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/LCNBalanceProxy.java b/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/LCNBalanceProxy.java deleted file mode 100644 index 04e2f7e6b..000000000 --- a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/LCNBalanceProxy.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.codingapi.tx.dubbo.balance; - -import com.alibaba.dubbo.rpc.Invoker; -import com.alibaba.dubbo.rpc.RpcException; -import com.codingapi.tx.aop.bean.TxTransactionLocal; -import com.lorne.core.framework.utils.encode.MD5Util; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; - -/** - * create by lorne on 2017/11/29 - */ - -public class LCNBalanceProxy { - - private Logger logger = LoggerFactory.getLogger(LCNBalanceProxy.class); - - public Invoker proxy(List> invokers,Invoker invoker) throws RpcException { - TxTransactionLocal txTransactionLocal = TxTransactionLocal.current(); - if(txTransactionLocal==null){ - return invoker; - } - - try { - logger.debug("LCNBalanceProxy - > start"); - - String groupId = txTransactionLocal.getGroupId(); - - String uniqueKey = invoker.getUrl().getServiceInterface(); - - logger.debug("LCNBalanceProxy - > uniqueKey - >" + uniqueKey); - - String key = MD5Util.md5((groupId + "_" + uniqueKey).getBytes()); - - //请求tm获取模块信息 - Invoker old = getInvoker(txTransactionLocal, invokers, key); - - if (old != null) { - logger.debug("LCNBalanceProxy - > load old invoker "); - - return old; - } - putInvoker(key, txTransactionLocal, invoker); - - logger.debug("LCNBalanceProxy - > load new invoker "); - - return invoker; - }finally { - logger.debug("LCNBalanceProxy - > end"); - } - } - - - private void putInvoker(String key,TxTransactionLocal txTransactionLocal,Invoker invoker){ - String serviceName = invoker.getUrl().getServiceInterface(); - String address = invoker.getUrl().getAddress(); - - String md5 = MD5Util.md5((address+serviceName).getBytes()); - - logger.debug("putInvoker->address->"+address+",md5-->"+md5); - - txTransactionLocal.putLoadBalance(key,md5); - } - - - private Invoker getInvoker(TxTransactionLocal txTransactionLocal,List> invokers,String key){ - String val = txTransactionLocal.getLoadBalance(key); - if(StringUtils.isEmpty(val)){ - return null; - } - for(Invoker invoker:invokers){ - String serviceName = invoker.getUrl().getServiceInterface(); - String address = invoker.getUrl().getAddress(); - - String md5 = MD5Util.md5((address+serviceName).getBytes()); - - logger.debug("getInvoker->address->"+address+",md5-->"+md5); - - if(val.equals(md5)){ - return invoker; - } - } - return null; - } -} diff --git a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/LeastActiveLoadBalanceProxy.java b/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/LeastActiveLoadBalanceProxy.java deleted file mode 100644 index 7ef9473f0..000000000 --- a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/LeastActiveLoadBalanceProxy.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.codingapi.tx.dubbo.balance; - -import com.alibaba.dubbo.common.URL; -import com.alibaba.dubbo.rpc.Invocation; -import com.alibaba.dubbo.rpc.Invoker; -import com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance; - -import java.util.List; - -/** - * create by lorne on 2017/11/29 - */ -public class LeastActiveLoadBalanceProxy extends LeastActiveLoadBalance{ - - - private LCNBalanceProxy lcnBalanceProxy = new LCNBalanceProxy(); - - @Override - public Invoker select(List> invokers, URL url, Invocation invocation) { - return lcnBalanceProxy.proxy(invokers,super.select(invokers, url, invocation)); - } -} diff --git a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/RandomLoadBalanceProxy.java b/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/RandomLoadBalanceProxy.java deleted file mode 100644 index 3b4329e6b..000000000 --- a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/RandomLoadBalanceProxy.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.codingapi.tx.dubbo.balance; - -import com.alibaba.dubbo.common.URL; -import com.alibaba.dubbo.rpc.Invocation; -import com.alibaba.dubbo.rpc.Invoker; -import com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance; - -import java.util.List; - -/** - * create by lorne on 2017/11/29 - */ -public class RandomLoadBalanceProxy extends RandomLoadBalance { - - private LCNBalanceProxy lcnBalanceProxy = new LCNBalanceProxy(); - - @Override - public Invoker select(List> invokers, URL url, Invocation invocation) { - return lcnBalanceProxy.proxy(invokers,super.select(invokers, url, invocation)); - } -} diff --git a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/RoundRobinLoadBalanceProxy.java b/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/RoundRobinLoadBalanceProxy.java deleted file mode 100644 index f90d988d5..000000000 --- a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/RoundRobinLoadBalanceProxy.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.codingapi.tx.dubbo.balance; - -import com.alibaba.dubbo.common.URL; -import com.alibaba.dubbo.rpc.Invocation; -import com.alibaba.dubbo.rpc.Invoker; -import com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance; - -import java.util.List; - -/** - * create by lorne on 2017/11/29 - */ -public class RoundRobinLoadBalanceProxy extends RoundRobinLoadBalance { - - private LCNBalanceProxy lcnBalanceProxy = new LCNBalanceProxy(); - - @Override - public Invoker select(List> invokers, URL url, Invocation invocation) { - return lcnBalanceProxy.proxy(invokers,super.select(invokers, url, invocation)); - } -} diff --git a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/filter/TransactionFilter.java b/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/filter/TransactionFilter.java deleted file mode 100644 index 362f9facf..000000000 --- a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/filter/TransactionFilter.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.codingapi.tx.dubbo.filter; - -import com.alibaba.dubbo.common.Constants; -import com.alibaba.dubbo.common.extension.Activate; -import com.alibaba.dubbo.rpc.*; -import com.codingapi.tx.aop.bean.TxTransactionLocal; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Created by lorne on 2017/6/30. - */ -@Activate(group = Constants.CONSUMER, order = -10001) -public class TransactionFilter implements Filter { - - - private Logger logger = LoggerFactory.getLogger(TransactionFilter.class); - - @Override - public Result invoke(Invoker invoker, Invocation invocation) throws RpcException { - - TxTransactionLocal txTransactionLocal = TxTransactionLocal.current(); - String groupId = txTransactionLocal == null ? null : txTransactionLocal.getGroupId(); - - logger.info("LCN-dubbo TxGroup info -> groupId:"+groupId); - - if(txTransactionLocal!=null){ - RpcContext.getContext().setAttachment("tx-group",groupId); - RpcContext.getContext().setAttachment("tx-mode",txTransactionLocal.getMode().name()); - } - - return invoker.invoke(invocation); - } -} diff --git a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/interceptor/TransactionAspect.java b/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/interceptor/TransactionAspect.java deleted file mode 100644 index 963c5bcb3..000000000 --- a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/interceptor/TransactionAspect.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.codingapi.tx.dubbo.interceptor; - -import com.codingapi.tx.Constants; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.Ordered; -import org.springframework.stereotype.Component; - -/** - * LCN 事务拦截器 - * create by lorne on 2018/1/5 - */ - -@Aspect -@Component -public class TransactionAspect implements Ordered { - - private Logger logger = LoggerFactory.getLogger(TransactionAspect.class); - - - @Autowired - private TxManagerInterceptor txManagerInterceptor; - - - @Around("@annotation(com.codingapi.tx.annotation.TxTransaction)") - public Object transactionRunning(ProceedingJoinPoint point)throws Throwable{ - logger.debug("annotation-TransactionRunning-start---->"); - Object obj = txManagerInterceptor.around(point); - logger.debug("annotation-TransactionRunning-end---->"); - return obj; - } - - - @Around("this(com.codingapi.tx.annotation.ITxTransaction) && execution( * *(..))") - public Object around(ProceedingJoinPoint point)throws Throwable{ - logger.debug("interface-ITransactionRunning-start---->"); - Object obj = txManagerInterceptor.around(point); - logger.debug("interface-ITransactionRunning-end---->"); - return obj; - } - - - @Override - public int getOrder() { - return Constants.ASPECT_ORDER; - } - - -} diff --git a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/interceptor/TxManagerInterceptor.java b/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/interceptor/TxManagerInterceptor.java deleted file mode 100644 index bc1fe84a8..000000000 --- a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/interceptor/TxManagerInterceptor.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.codingapi.tx.dubbo.interceptor; - - -import com.alibaba.dubbo.rpc.RpcContext; -import com.codingapi.tx.aop.service.AspectBeforeService; -import org.aspectj.lang.ProceedingJoinPoint; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * Created by lorne on 2017/6/7. - */ - -@Component -public class TxManagerInterceptor { - - - @Autowired - private AspectBeforeService aspectBeforeService; - - - public Object around(ProceedingJoinPoint point) throws Throwable { - - String groupId = null; - String mode = null; - try { - groupId = RpcContext.getContext().getAttachment("tx-group"); - mode = RpcContext.getContext().getAttachment("tx-mode"); - }catch (Exception e){} - return aspectBeforeService.around(groupId,point,mode); - } - -} diff --git a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/listener/TransactionSocketListener.java b/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/listener/TransactionSocketListener.java deleted file mode 100644 index 6dbdd7078..000000000 --- a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/listener/TransactionSocketListener.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.codingapi.tx.dubbo.listener; - -import com.codingapi.tx.listener.service.InitService; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * Created by lorne on 2017/7/1. - */ -@Component -public class TransactionSocketListener implements ApplicationContextAware { - - - @Autowired - private InitService initService; - - - @Override - public void setApplicationContext(ApplicationContext event) throws BeansException { - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - // 若连接不上txmanager start()方法将阻塞 - initService.start(); - } - }); - thread.setName("TxInit-thread"); - thread.start(); - } - -} diff --git a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/service/impl/ModelNameServiceImpl.java b/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/service/impl/ModelNameServiceImpl.java deleted file mode 100644 index 1eab4bd1a..000000000 --- a/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/service/impl/ModelNameServiceImpl.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.codingapi.tx.dubbo.service.impl; - -import com.alibaba.dubbo.config.ApplicationConfig; -import com.alibaba.dubbo.config.ProviderConfig; -import com.alibaba.dubbo.config.RegistryConfig; -import com.codingapi.tx.listener.service.ModelNameService; -import com.lorne.core.framework.utils.encode.MD5Util; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.stereotype.Service; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.Map; - -/** - * Created by lorne on 2017/7/12. - */ -@Service -public class ModelNameServiceImpl implements ModelNameService { - - - @Autowired - private ApplicationConfig applicationConfig; - - @Autowired - private ApplicationContext applicationContext; - - private ProviderConfig providerConfig(){ - Map beans = applicationContext.getBeansOfType(ProviderConfig.class); - ProviderConfig providerConfig = null; - if(beans!=null){ - String defaultKey = "default"; - for(String key:beans.keySet()){ - defaultKey = key; - } - - providerConfig = beans.get(defaultKey); - } - return providerConfig; - } - - private RegistryConfig getRegistryConfig(){ - Map beans = applicationContext.getBeansOfType(RegistryConfig.class); - RegistryConfig registryConfig = null; - if(beans!=null){ - String defaultKey = "default"; - for(String key:beans.keySet()){ - defaultKey = key; - } - - registryConfig = beans.get(defaultKey); - } - return registryConfig; - } - - private String host = null; - - @Override - public String getModelName() { - return applicationConfig.getName(); - } - - - private String getIp() { - if (host == null) { - try { - host = InetAddress.getLocalHost().getHostAddress(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } - } - return host; - } - - @Override - public String getUniqueKey() { - String address = getIp() + getPort(); - return MD5Util.md5(address.getBytes()); - } - - - @Override - public String getIpAddress() { - return getIp() + ":" + getPort(); - } - - private int getPort(){ - if(providerConfig()!=null&&providerConfig().getPort()!=null){ - return providerConfig().getPort(); - } - - RegistryConfig registryConfig = getRegistryConfig(); - if(registryConfig!=null&®istryConfig.getPort()!=null){ - return registryConfig.getPort(); - } - return 20880; - } -} diff --git a/transaction-dubbo/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter b/transaction-dubbo/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter deleted file mode 100644 index 6b59bf1fc..000000000 --- a/transaction-dubbo/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter +++ /dev/null @@ -1 +0,0 @@ -transactionFilter=com.codingapi.tx.dubbo.filter.TransactionFilter \ No newline at end of file diff --git a/transaction-dubbo/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance b/transaction-dubbo/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance deleted file mode 100644 index 7f8ebadc0..000000000 --- a/transaction-dubbo/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance +++ /dev/null @@ -1,4 +0,0 @@ -lcn_random = com.codingapi.tx.dubbo.balance.RandomLoadBalanceProxy -lcn_roundrobin = com.codingapi.tx.dubbo.balance.RoundRobinLoadBalanceProxy -lcn_leastactive = com.codingapi.tx.dubbo.balance.LeastActiveLoadBalanceProxy -lcn_consistenthash = com.codingapi.tx.dubbo.balance.ConsistentHashLoadBalanceProxy \ No newline at end of file diff --git a/transaction-dubbo/src/main/resources/banner.txt b/transaction-dubbo/src/main/resources/banner.txt deleted file mode 100644 index 51d683404..000000000 --- a/transaction-dubbo/src/main/resources/banner.txt +++ /dev/null @@ -1,13 +0,0 @@ - - >=> >=> >==> >=> - >=> >=> >=> >> >=> >=> - >=> >=> >=> >=> >=> - >=> >=> >=> >=>>=> - >=> >=> >=> > >=> - >=> >=> >=> >=> >>=> - >=======> >===> >=> >=> - - LCN-Client version:4.1.0 - - - diff --git a/transaction-motan/pom.xml b/transaction-motan/pom.xml deleted file mode 100644 index a922488a5..000000000 --- a/transaction-motan/pom.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - 4.0.0 - - - - com.codingapi - tx-lcn - 4.2.0-SNAPSHOT - - - com.codingapi - transaction-motan - ${lcn.last.version} - - - transaction-motan - https://github.com/codingapi/tx-lcn - - transaction-motan project for Spring Boot - - - - - michael - zfvip_it@163.com - - developer - - +8 - - - - - 1.1.0 - - - - - com.codingapi - tx-client - ${lcn.last.version} - - - - - com.weibo - motan-core - ${motan.versoin} - - - - com.weibo - motan-springsupport - ${motan.versoin} - - - - - \ No newline at end of file diff --git a/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/ActiveWeightLoadBalanceProxy.java b/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/ActiveWeightLoadBalanceProxy.java deleted file mode 100644 index 395375f17..000000000 --- a/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/ActiveWeightLoadBalanceProxy.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.codingapi.tx.motan.balance; - -import com.weibo.api.motan.cluster.loadbalance.ActiveWeightLoadBalance; -import com.weibo.api.motan.common.MotanConstants; -import com.weibo.api.motan.core.extension.Activation; -import com.weibo.api.motan.core.extension.SpiMeta; -import com.weibo.api.motan.rpc.Referer; -import com.weibo.api.motan.rpc.Request; - -import java.util.List; - -/** - *

"低并发优化" 负载均衡代理

- * - * @author 张峰 zfvip_it@163.com - * 2017/12/1 10:42 - */ -@SpiMeta(name = "activeWeightLcn") -@Activation(key = {MotanConstants.NODE_TYPE_SERVICE, MotanConstants.NODE_TYPE_REFERER}) -public class ActiveWeightLoadBalanceProxy extends ActiveWeightLoadBalance { - - private LCNBalanceProxy lcnBalanceProxy = new LCNBalanceProxy(); - - @Override - protected Referer doSelect(Request request) { - return lcnBalanceProxy.proxy(getReferers(),super.doSelect(request)); - } - - @Override - protected void doSelectToHolder(Request request, List refersHolder) { - super.doSelectToHolder(request, refersHolder); - refersHolder.set(0, lcnBalanceProxy.proxy(getReferers(),super.doSelect(request))); - } -} diff --git a/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/ConfigurableWeightLoadBalanceProxy.java b/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/ConfigurableWeightLoadBalanceProxy.java deleted file mode 100644 index ca1906eab..000000000 --- a/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/ConfigurableWeightLoadBalanceProxy.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.codingapi.tx.motan.balance; - -import com.weibo.api.motan.cluster.loadbalance.ConfigurableWeightLoadBalance; -import com.weibo.api.motan.common.MotanConstants; -import com.weibo.api.motan.core.extension.Activation; -import com.weibo.api.motan.core.extension.SpiMeta; -import com.weibo.api.motan.rpc.Referer; -import com.weibo.api.motan.rpc.Request; - -import java.util.List; - -/** - *

权重可配置的负载均衡器

- * - * @author 张峰 zfvip_it@163.com - * 2017/12/1 10:44 - */ -@SpiMeta(name = "configurableWeightLcn") -@Activation(key = {MotanConstants.NODE_TYPE_SERVICE, MotanConstants.NODE_TYPE_REFERER}) -public class ConfigurableWeightLoadBalanceProxy extends ConfigurableWeightLoadBalance { - - private LCNBalanceProxy lcnBalanceProxy = new LCNBalanceProxy(); - - @Override - protected Referer doSelect(Request request) { - return lcnBalanceProxy.proxy(getReferers(),super.doSelect(request)); - } - - @Override - protected void doSelectToHolder(Request request, List refersHolder) { - super.doSelectToHolder(request, refersHolder); - refersHolder.set(0, lcnBalanceProxy.proxy(getReferers(),super.doSelect(request))); - } -} diff --git a/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/ConsistentHashLoadBalanceProxy.java b/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/ConsistentHashLoadBalanceProxy.java deleted file mode 100644 index 98c6b42ba..000000000 --- a/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/ConsistentHashLoadBalanceProxy.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.codingapi.tx.motan.balance; - -import com.weibo.api.motan.cluster.loadbalance.ConsistentHashLoadBalance; -import com.weibo.api.motan.common.MotanConstants; -import com.weibo.api.motan.core.extension.Activation; -import com.weibo.api.motan.core.extension.SpiMeta; -import com.weibo.api.motan.rpc.Referer; -import com.weibo.api.motan.rpc.Request; - -import java.util.List; - -/** - *

一致性 Hash,相同参数的请求总是发到同一提供者

- * - * @author 张峰 zfvip_it@163.com - * 2017/12/1 10:44 - */ -@SpiMeta(name = "consistentLcn") -@Activation(key = {MotanConstants.NODE_TYPE_SERVICE, MotanConstants.NODE_TYPE_REFERER}) -public class ConsistentHashLoadBalanceProxy extends ConsistentHashLoadBalance { - - private LCNBalanceProxy lcnBalanceProxy = new LCNBalanceProxy(); - - @Override - protected Referer doSelect(Request request) { - return lcnBalanceProxy.proxy(getReferers(),super.doSelect(request)); - } - - @Override - protected void doSelectToHolder(Request request, List refersHolder) { - super.doSelectToHolder(request, refersHolder); - refersHolder.set(0, lcnBalanceProxy.proxy(getReferers(),super.doSelect(request))); - } -} diff --git a/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/LCNBalanceProxy.java b/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/LCNBalanceProxy.java deleted file mode 100644 index c7e9160dc..000000000 --- a/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/LCNBalanceProxy.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.codingapi.tx.motan.balance; - -import com.codingapi.tx.aop.bean.TxTransactionLocal; -import com.lorne.core.framework.utils.encode.MD5Util; -import com.weibo.api.motan.rpc.Referer; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; - -/** - *

LCN负载均衡代理

- * - * @author 张峰 zfvip_it@163.com - * 2017/12/1 10:21 - */ -public class LCNBalanceProxy { - - private Logger logger = LoggerFactory.getLogger(LCNBalanceProxy.class); - - protected Referer proxy(List referers,Referer referer) { - TxTransactionLocal txTransactionLocal = TxTransactionLocal.current(); - if (txTransactionLocal == null) { - return referer; - } - - try { - logger.debug("LCNBalanceProxy - > start"); - - String groupId = txTransactionLocal.getGroupId(); - - String uniqueKey = referer.getInterface().getName(); - - logger.debug("LCNBalanceProxy - > uniqueKey - >" + uniqueKey); - - String key = MD5Util.md5((groupId + "_" + uniqueKey).getBytes()); - - Referer old = getReferer(txTransactionLocal,referers,key); - if (old != null) { - logger.debug("LCNBalanceProxy - > load old referer "); - - return old; - } - - putReferer(key,txTransactionLocal,referer); - - logger.debug("LCNBalanceProxy - > load new referer "); - - return referer; - }finally { - logger.debug("LCNBalanceProxy - > end"); - } - } - - - private void putReferer(String key,TxTransactionLocal txTransactionLocal,Referer referer){ - String serviceName = referer.getInterface().getName(); - String address = referer.getUrl().getHost()+":"+referer.getUrl().getPort(); - - String md5 = MD5Util.md5((address+serviceName).getBytes()); - - logger.debug("putReferer->address->"+address+",md5-->"+md5); - - txTransactionLocal.putLoadBalance(key,md5); - } - - - private Referer getReferer(TxTransactionLocal txTransactionLocal,List referers,String key){ - String val = txTransactionLocal.getLoadBalance(key); - if(StringUtils.isEmpty(val)){ - return null; - } - for(Referer invoker:referers){ - String serviceName = invoker.getInterface().getName(); - String address = invoker.getUrl().getHost()+":"+invoker.getUrl().getPort(); - - String md5 = MD5Util.md5((address+serviceName).getBytes()); - - logger.debug("getReferer->address->"+address+",md5-->"+md5); - - if(val.equals(md5)){ - return invoker; - } - } - return null; - } -} diff --git a/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/LocalFirstLoadBalanceProxy.java b/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/LocalFirstLoadBalanceProxy.java deleted file mode 100644 index ce2eb4b4a..000000000 --- a/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/LocalFirstLoadBalanceProxy.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.codingapi.tx.motan.balance; - -import com.weibo.api.motan.cluster.loadbalance.LocalFirstLoadBalance; -import com.weibo.api.motan.common.MotanConstants; -import com.weibo.api.motan.core.extension.Activation; -import com.weibo.api.motan.core.extension.SpiMeta; -import com.weibo.api.motan.rpc.Referer; -import com.weibo.api.motan.rpc.Request; - -import java.util.List; - -/** - *

"本地服务优先" 负载均衡代理

- * - * @author 张峰 zfvip_it@163.com - * 2017/12/1 10:46 - */ -@SpiMeta(name = "localFirstLcn") -@Activation(key = {MotanConstants.NODE_TYPE_SERVICE, MotanConstants.NODE_TYPE_REFERER}) -public class LocalFirstLoadBalanceProxy extends LocalFirstLoadBalance { - - private LCNBalanceProxy lcnBalanceProxy = new LCNBalanceProxy(); - - @Override - protected Referer doSelect(Request request) { - return lcnBalanceProxy.proxy(getReferers(),super.doSelect(request)); - } - - @Override - protected void doSelectToHolder(Request request, List refersHolder) { - super.doSelectToHolder(request, refersHolder); - refersHolder.set(0, lcnBalanceProxy.proxy(getReferers(),super.doSelect(request))); - } -} diff --git a/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/RandomLoadBalanceProxy.java b/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/RandomLoadBalanceProxy.java deleted file mode 100644 index bb3785e68..000000000 --- a/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/RandomLoadBalanceProxy.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.codingapi.tx.motan.balance; - -import com.weibo.api.motan.cluster.loadbalance.RandomLoadBalance; -import com.weibo.api.motan.common.MotanConstants; -import com.weibo.api.motan.core.extension.Activation; -import com.weibo.api.motan.core.extension.SpiMeta; -import com.weibo.api.motan.rpc.Referer; -import com.weibo.api.motan.rpc.Request; - -import java.util.List; - -/** - *

随机,按权重设置随机概率

- * - * @author 张峰 zfvip_it@163.com - * 2017/12/1 10:46 - */ -@SpiMeta(name = "randomLcn") -@Activation(key = {MotanConstants.NODE_TYPE_SERVICE, MotanConstants.NODE_TYPE_REFERER}) -public class RandomLoadBalanceProxy extends RandomLoadBalance { - - private LCNBalanceProxy lcnBalanceProxy = new LCNBalanceProxy(); - - @Override - protected Referer doSelect(Request request) { - return lcnBalanceProxy.proxy(getReferers(),super.doSelect(request)); - } - - @Override - protected void doSelectToHolder(Request request, List refersHolder) { - super.doSelectToHolder(request, refersHolder); - refersHolder.set(0, lcnBalanceProxy.proxy(getReferers(),super.doSelect(request))); - } -} diff --git a/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/RoundRobinLoadBalanceProxy.java b/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/RoundRobinLoadBalanceProxy.java deleted file mode 100644 index 22edf5a5e..000000000 --- a/transaction-motan/src/main/java/com/codingapi/tx/motan/balance/RoundRobinLoadBalanceProxy.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.codingapi.tx.motan.balance; - -import com.weibo.api.motan.cluster.loadbalance.RoundRobinLoadBalance; -import com.weibo.api.motan.common.MotanConstants; -import com.weibo.api.motan.core.extension.Activation; -import com.weibo.api.motan.core.extension.SpiMeta; -import com.weibo.api.motan.rpc.Referer; -import com.weibo.api.motan.rpc.Request; - -import java.util.List; - -/** - *

轮循,按公约后的权重设置轮循比率

- * - * @author 张峰 zfvip_it@163.com - * 2017/12/1 10:47 - */ -@SpiMeta(name = "roundrobinLcn") -@Activation(key = {MotanConstants.NODE_TYPE_SERVICE, MotanConstants.NODE_TYPE_REFERER}) -public class RoundRobinLoadBalanceProxy extends RoundRobinLoadBalance { - - private LCNBalanceProxy lcnBalanceProxy = new LCNBalanceProxy(); - - @Override - protected Referer doSelect(Request request) { - return lcnBalanceProxy.proxy(getReferers(),super.doSelect(request)); - } - - @Override - protected void doSelectToHolder(Request request, List refersHolder) { - super.doSelectToHolder(request, refersHolder); - refersHolder.set(0, lcnBalanceProxy.proxy(getReferers(),super.doSelect(request))); - } -} diff --git a/transaction-motan/src/main/java/com/codingapi/tx/motan/filter/TransactionFilter.java b/transaction-motan/src/main/java/com/codingapi/tx/motan/filter/TransactionFilter.java deleted file mode 100644 index 56bd7d381..000000000 --- a/transaction-motan/src/main/java/com/codingapi/tx/motan/filter/TransactionFilter.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.codingapi.tx.motan.filter; - -import com.codingapi.tx.aop.bean.TxTransactionLocal; -import com.weibo.api.motan.common.MotanConstants; -import com.weibo.api.motan.core.extension.Activation; -import com.weibo.api.motan.core.extension.SpiMeta; -import com.weibo.api.motan.filter.Filter; -import com.weibo.api.motan.rpc.Caller; -import com.weibo.api.motan.rpc.Request; -import com.weibo.api.motan.rpc.Response; -import com.weibo.api.motan.rpc.RpcContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Map; - -/** - *

motan拦截器

- * - * @author 张峰 zfvip_it@163.com - * 2017/11/17 15:38 - */ -@SpiMeta(name = "transaction") -@Activation(key = {MotanConstants.NODE_TYPE_SERVICE, MotanConstants.NODE_TYPE_REFERER}) -public class TransactionFilter implements Filter { - - private Logger logger = LoggerFactory.getLogger(TransactionFilter.class); - - /** - * 实现新浪的filter接口 rpc传参数 - * @param caller caller - * @param request 请求 - * @return Response - */ - public Response filter(Caller caller, Request request) { - TxTransactionLocal txTransactionLocal = TxTransactionLocal.current(); - if (txTransactionLocal != null) { - - request.setAttachment("tx-group", txTransactionLocal.getGroupId()); - - logger.info("LCN-dubbo TxGroup info -> groupId:"+ txTransactionLocal.getGroupId()+",maxTimeOut:"+txTransactionLocal.getMaxTimeOut()); - - } else { - Map map = request.getAttachments(); - if (map != null && !map.isEmpty()) { - if (map.containsKey("tx-group")) { - RpcContext.getContext().putAttribute("tx-group", request.getAttachments().get("tx-group")); - } - } - } - - - return caller.call(request); - } -} diff --git a/transaction-motan/src/main/java/com/codingapi/tx/motan/interceptor/TransactionAspect.java b/transaction-motan/src/main/java/com/codingapi/tx/motan/interceptor/TransactionAspect.java deleted file mode 100644 index 0d91a2e9f..000000000 --- a/transaction-motan/src/main/java/com/codingapi/tx/motan/interceptor/TransactionAspect.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.codingapi.tx.motan.interceptor; - -import com.codingapi.tx.Constants; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.Ordered; -import org.springframework.stereotype.Component; - -/** - * LCN 事务拦截器 - * create by lorne on 2018/1/5 - */ - -@Aspect -@Component -public class TransactionAspect implements Ordered { - - private Logger logger = LoggerFactory.getLogger(TransactionAspect.class); - - @Autowired - private TxManagerInterceptor txManagerInterceptor; - - - @Around("@annotation(com.codingapi.tx.annotation.TxTransaction)") - public Object transactionRunning(ProceedingJoinPoint point)throws Throwable{ - logger.debug("annotation-TransactionRunning-start---->"); - Object obj = txManagerInterceptor.around(point); - logger.debug("annotation-TransactionRunning-end---->"); - return obj; - } - - @Around("this(com.codingapi.tx.annotation.ITxTransaction) && execution( * *(..))") - public Object around(ProceedingJoinPoint point)throws Throwable{ - logger.debug("interface-ITransactionRunning-start---->"); - Object obj = txManagerInterceptor.around(point); - logger.debug("interface-ITransactionRunning-end---->"); - return obj; - } - - - @Override - public int getOrder() { - return Constants.ASPECT_ORDER; - } - - -} diff --git a/transaction-motan/src/main/java/com/codingapi/tx/motan/interceptor/TxManagerInterceptor.java b/transaction-motan/src/main/java/com/codingapi/tx/motan/interceptor/TxManagerInterceptor.java deleted file mode 100644 index 20f71e3df..000000000 --- a/transaction-motan/src/main/java/com/codingapi/tx/motan/interceptor/TxManagerInterceptor.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.codingapi.tx.motan.interceptor; - -import com.codingapi.tx.aop.service.AspectBeforeService; -import com.weibo.api.motan.rpc.RpcContext; -import org.aspectj.lang.ProceedingJoinPoint; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; - -/** - *

类说明

- * - * @author 张峰 zfvip_it@163.com - * 2017/11/17 15:42 - */ -@Component -public class TxManagerInterceptor { - - @Resource - private AspectBeforeService aspectBeforeService; - - - public Object around(ProceedingJoinPoint point) throws Throwable { - - String groupId = null; - String mode = null; - try { - groupId = (String) RpcContext.getContext().getAttribute("tx-group"); - mode = (String) RpcContext.getContext().getAttribute("tx-mode"); - } catch (Exception e) { - } - return aspectBeforeService.around(groupId, point, mode); - } -} diff --git a/transaction-motan/src/main/java/com/codingapi/tx/motan/listener/TransactionSocketListener.java b/transaction-motan/src/main/java/com/codingapi/tx/motan/listener/TransactionSocketListener.java deleted file mode 100644 index 4a3f9fc5f..000000000 --- a/transaction-motan/src/main/java/com/codingapi/tx/motan/listener/TransactionSocketListener.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.codingapi.tx.motan.listener; - -import com.codingapi.tx.listener.service.InitService; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -/** - * Created by lorne on 2017/7/1. - */ -@Component -public class TransactionSocketListener implements ApplicationContextAware { - - - @Autowired - private InitService initService; - - - @Override - public void setApplicationContext(ApplicationContext event) throws BeansException { - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - // 若连接不上txmanager start()方法将阻塞 - initService.start(); - } - }); - thread.setName("TxInit-thread"); - thread.start(); - } - -} diff --git a/transaction-motan/src/main/java/com/codingapi/tx/motan/service/impl/ModelNameServiceImpl.java b/transaction-motan/src/main/java/com/codingapi/tx/motan/service/impl/ModelNameServiceImpl.java deleted file mode 100644 index 84d0c186d..000000000 --- a/transaction-motan/src/main/java/com/codingapi/tx/motan/service/impl/ModelNameServiceImpl.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.codingapi.tx.motan.service.impl; - -import com.codingapi.tx.listener.service.ModelNameService; -import com.lorne.core.framework.utils.encode.MD5Util; -import com.weibo.api.motan.config.springsupport.BasicServiceConfigBean; -import org.apache.commons.lang.StringUtils; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.net.InetAddress; -import java.net.UnknownHostException; - -/** - *

类说明

- * - * @author 张峰 zfvip_it@163.com - * 2017/11/17 13:30 - */ -@Service -public class ModelNameServiceImpl implements ModelNameService { - - @Resource - private BasicServiceConfigBean basicServiceConfigBean; - - @Resource - private Environment environment; - - private String host = null; - - public String getModelName() { - return environment.getProperty("tx.application"); - } - - public String getUniqueKey() { - String address = getIp() + getPort(); - return MD5Util.md5(address.getBytes()); - } - - public String getIpAddress() { - String address = getIp() + ":" + getPort(); - return address; - } - - private String getIp() { - if (host == null) { - try { - host = InetAddress.getLocalHost().getHostAddress(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } - } - return host; - } - - private String getPort() { - String export = basicServiceConfigBean.getExport(); - if (StringUtils.isNotBlank(export)) { - return export.split(":")[1]; - } - return null; - } - - /** - * 超时时间 - * - * @return 超时时间 - */ - public String getTimeOut() { - return basicServiceConfigBean.getRequestTimeout().toString(); - } -} diff --git a/transaction-motan/src/main/resources/META-INF/services/com.weibo.api.motan.cluster.LoadBalance b/transaction-motan/src/main/resources/META-INF/services/com.weibo.api.motan.cluster.LoadBalance deleted file mode 100644 index f43532524..000000000 --- a/transaction-motan/src/main/resources/META-INF/services/com.weibo.api.motan.cluster.LoadBalance +++ /dev/null @@ -1,6 +0,0 @@ -com.codingapi.tx.motan.balance.ActiveWeightLoadBalanceProxy -com.codingapi.tx.motan.balance.LocalFirstLoadBalanceProxy -com.codingapi.tx.motan.balance.RandomLoadBalanceProxy -com.codingapi.tx.motan.balance.RoundRobinLoadBalanceProxy -com.codingapi.tx.motan.balance.ConfigurableWeightLoadBalanceProxy -com.codingapi.tx.motan.balance.ConsistentHashLoadBalanceProxy \ No newline at end of file diff --git a/transaction-motan/src/main/resources/META-INF/services/com.weibo.api.motan.filter.Filter b/transaction-motan/src/main/resources/META-INF/services/com.weibo.api.motan.filter.Filter deleted file mode 100644 index 42974e950..000000000 --- a/transaction-motan/src/main/resources/META-INF/services/com.weibo.api.motan.filter.Filter +++ /dev/null @@ -1 +0,0 @@ -com.codingapi.tx.motan.filter.TransactionFilter \ No newline at end of file diff --git a/transaction-motan/src/main/resources/banner.txt b/transaction-motan/src/main/resources/banner.txt deleted file mode 100644 index 51d683404..000000000 --- a/transaction-motan/src/main/resources/banner.txt +++ /dev/null @@ -1,13 +0,0 @@ - - >=> >=> >==> >=> - >=> >=> >=> >> >=> >=> - >=> >=> >=> >=> >=> - >=> >=> >=> >=>>=> - >=> >=> >=> > >=> - >=> >=> >=> >=> >>=> - >=======> >===> >=> >=> - - LCN-Client version:4.1.0 - - - diff --git a/transaction-springcloud/.gitignore b/transaction-springcloud/.gitignore deleted file mode 100644 index e371e574f..000000000 --- a/transaction-springcloud/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -.DS_Store -node_modules/ -dist/ -npm-debug.log -test/unit/coverage -test/e2e/reports -selenium-debug.log - -.classpath -.project -.settings/ -target/ -out/ -output/ - -.idea/ -*.iml -logging.path_IS_UNDEFINED/ -nohup.out diff --git a/transaction-springcloud/pom.xml b/transaction-springcloud/pom.xml index d5f04dcfe..4c890ce05 100644 --- a/transaction-springcloud/pom.xml +++ b/transaction-springcloud/pom.xml @@ -1,30 +1,22 @@ - 4.0.0 com.codingapi tx-lcn - 4.2.0-SNAPSHOT + 4.2.0 - com.codingapi transaction-springcloud - ${lcn.last.version} - transaction-springcloud https://github.com/codingapi/tx-lcn transaction-springcloud project for Spring Boot - - 1.3.2.RELEASE - 4.3.7.RELEASE - - - @@ -34,23 +26,37 @@ - org.springframework.cloud - spring-cloud-starter-feign - ${spring-cloud.version} - - - com.google.guava - guava - - + org.springframework + spring-context + ${org.springframework-version} + + com.netflix.ribbon + ribbon-core + 2.2.5 + org.springframework - spring-context + spring-web ${org.springframework-version} - + + org.springframework.cloud + spring-cloud-starter-netflix-ribbon + 2.0.1.RELEASE + + + com.netflix.feign + feign-core + 8.18.0 + runtime + + + org.springframework.boot + spring-boot + ${spring-cloud.version} + diff --git a/transaction-springcloud/src/main/java/com/codingapi/tx/RequestInterceptorConfiguration.java b/transaction-springcloud/src/main/java/com/codingapi/tx/RequestInterceptorConfiguration.java index 1b7c36f17..7aea96456 100644 --- a/transaction-springcloud/src/main/java/com/codingapi/tx/RequestInterceptorConfiguration.java +++ b/transaction-springcloud/src/main/java/com/codingapi/tx/RequestInterceptorConfiguration.java @@ -1,9 +1,12 @@ package com.codingapi.tx; import com.codingapi.tx.springcloud.feign.TransactionRestTemplateInterceptor; +import com.codingapi.tx.springcloud.http.TransactionHttpRequestInterceptor; import feign.RequestInterceptor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; /** * create by lorne on 2018/1/18 @@ -15,4 +18,13 @@ public class RequestInterceptorConfiguration { public RequestInterceptor requestInterceptor(){ return new TransactionRestTemplateInterceptor(); } + + @Bean + public TransactionHttpRequestInterceptor transactionHttpRequestInterceptor(@Autowired(required = false) RestTemplate restTemplate){ + TransactionHttpRequestInterceptor transactionHttpRequestInterceptor = new TransactionHttpRequestInterceptor(); + if(restTemplate != null){ + restTemplate.getInterceptors().add(transactionHttpRequestInterceptor); + } + return transactionHttpRequestInterceptor; + } } diff --git a/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/interceptor/TransactionAspect.java b/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/interceptor/TransactionAspect.java index 1b33e9c6b..aec99dd02 100644 --- a/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/interceptor/TransactionAspect.java +++ b/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/interceptor/TransactionAspect.java @@ -13,37 +13,40 @@ /** * LCN 事务拦截器 * create by lorne on 2018/1/5 + * + * @author Administrator */ - @Aspect @Component -public class TransactionAspect implements Ordered { +public class TransactionAspect implements Ordered +{ private Logger logger = LoggerFactory.getLogger(TransactionAspect.class); @Autowired private TxManagerInterceptor txManagerInterceptor; - @Around("@annotation(com.codingapi.tx.annotation.TxTransaction)") - public Object transactionRunning(ProceedingJoinPoint point)throws Throwable{ + public Object transactionRunning(ProceedingJoinPoint point) throws Throwable + { logger.debug("annotation-TransactionRunning-start---->"); - Object obj = txManagerInterceptor.around(point); + Object obj = txManagerInterceptor.around(point); logger.debug("annotation-TransactionRunning-end---->"); return obj; } @Around("this(com.codingapi.tx.annotation.ITxTransaction) && execution( * *(..))") - public Object around(ProceedingJoinPoint point)throws Throwable{ + public Object around(ProceedingJoinPoint point) throws Throwable + { logger.debug("interface-ITransactionRunning-start---->"); - Object obj = txManagerInterceptor.around(point); + Object obj = txManagerInterceptor.around(point); logger.debug("interface-ITransactionRunning-end---->"); return obj; } - @Override - public int getOrder() { + public int getOrder() + { return Constants.ASPECT_ORDER; } diff --git a/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/listener/ServerListener.java b/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/listener/ServerListener.java index c6dab85f1..69c47aed3 100644 --- a/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/listener/ServerListener.java +++ b/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/listener/ServerListener.java @@ -4,42 +4,37 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.context.WebServerInitializedEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; @Component -public class ServerListener implements ApplicationListener { +public class ServerListener implements ApplicationListener { private Logger logger = LoggerFactory.getLogger(ServerListener.class); + @Value("${server.port}") private int serverPort; @Autowired private InitService initService; @Override - public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) { - logger.info("onApplicationEvent -> onApplicationEvent. "+event.getEmbeddedServletContainer()); - this.serverPort = event.getEmbeddedServletContainer().getPort(); - - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - // 若连接不上txmanager start()方法将阻塞 - initService.start(); - } + public void onApplicationEvent(WebServerInitializedEvent event) { + logger.info("onApplicationEvent -> onApplicationEvent. "+event.getWebServer()); + this.serverPort = event.getWebServer().getPort(); + + Thread thread = new Thread(() -> { + // 若连接不上txmanager start()方法将阻塞 + initService.start(); }); thread.setName("TxInit-thread"); thread.start(); } - public int getPort() { - return this.serverPort; - } - - public void setServerPort(int serverPort) { - this.serverPort = serverPort; + public int getServerPort() { + return serverPort; } } diff --git a/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/service/impl/ModelNameServiceImpl.java b/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/service/impl/ModelNameServiceImpl.java index a9b6f9de4..5fff0e50a 100644 --- a/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/service/impl/ModelNameServiceImpl.java +++ b/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/service/impl/ModelNameServiceImpl.java @@ -44,7 +44,7 @@ private String getIp() { } private int getPort() { - int port = serverListener.getPort(); + int port = serverListener.getServerPort(); int count = 0; while (port == 0) { try { @@ -52,7 +52,7 @@ private int getPort() { } catch (InterruptedException e) { e.printStackTrace(); } - port = serverListener.getPort(); + port = serverListener.getServerPort(); count++; if(count==2000){ diff --git a/transaction-springcloud/src/main/resources/banner.txt b/transaction-springcloud/src/main/resources/banner.txt index 51d683404..9161fc577 100644 --- a/transaction-springcloud/src/main/resources/banner.txt +++ b/transaction-springcloud/src/main/resources/banner.txt @@ -7,7 +7,7 @@ >=> >=> >=> >=> >>=> >=======> >===> >=> >=> - LCN-Client version:4.1.0 + LCN-Client version:4.2.0 diff --git a/tx-client/.editorconfig b/tx-client/.editorconfig deleted file mode 100644 index e291365a9..000000000 --- a/tx-client/.editorconfig +++ /dev/null @@ -1,9 +0,0 @@ -root = true - -[*] -charset = utf-8 -indent_style = space -indent_size = 4 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true diff --git a/tx-client/.gitignore b/tx-client/.gitignore deleted file mode 100644 index e371e574f..000000000 --- a/tx-client/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -.DS_Store -node_modules/ -dist/ -npm-debug.log -test/unit/coverage -test/e2e/reports -selenium-debug.log - -.classpath -.project -.settings/ -target/ -out/ -output/ - -.idea/ -*.iml -logging.path_IS_UNDEFINED/ -nohup.out diff --git a/tx-client/pom.xml b/tx-client/pom.xml index 7f206d268..f185e56e5 100644 --- a/tx-client/pom.xml +++ b/tx-client/pom.xml @@ -6,31 +6,30 @@ com.codingapi tx-lcn - 4.2.0-SNAPSHOT + 4.2.0 com.codingapi tx-client - ${lcn.last.version} tx-client https://github.com/codingapi/tx-lcn tx-client project for Spring Boot - - - 4.3.7.RELEASE - 19.0 - 4.0.38 - 1.1.3 - 4.0.0 - 1.7.7 - - - + + org.springframework.cloud + spring-cloud-starter-openfeign + ${spring-cloud-starter-openfeign.version} + + + org.springframework.cloud + spring-cloud-starter-ribbon + 1.4.4.RELEASE + + com.github.1991wangliang lorne_core @@ -43,19 +42,17 @@ 4.1.12.Final - org.aspectj aspectjweaver - 1.8.4 + ${org.aspectj.version} org.aspectj aspectjrt - 1.8.4 + ${org.aspectj.version} - org.slf4j slf4j-api @@ -77,22 +74,18 @@ ${org.slf4j-version} - - javax.servlet javax.servlet-api 3.1.0 - org.springframework spring-context ${org.springframework-version} - com.caucho hessian diff --git a/tx-client/src/main/java/com/codingapi/tx/Constants.java b/tx-client/src/main/java/com/codingapi/tx/Constants.java index b4650b9b0..7dded7743 100644 --- a/tx-client/src/main/java/com/codingapi/tx/Constants.java +++ b/tx-client/src/main/java/com/codingapi/tx/Constants.java @@ -17,9 +17,6 @@ public class Constants { /** * 主切面的 order值 - * 主切面一定要在 @Transaction 切面的外层(ASPECT_ORDER 小于 标签中的order ) - * 主切面需要能接受到异常。接收到异常才会触发回滚 - * 这意味着自定义的切面若catch了异常且不向外传递,那么这个切面需要在主切面的外层(自定义切面order 小于 ASPECT_ORDER) */ public static final int ASPECT_ORDER = 1000; diff --git a/tx-client/src/main/java/com/codingapi/tx/MQTxManagerFegin.java b/tx-client/src/main/java/com/codingapi/tx/MQTxManagerFegin.java new file mode 100644 index 000000000..c6ca8ae9b --- /dev/null +++ b/tx-client/src/main/java/com/codingapi/tx/MQTxManagerFegin.java @@ -0,0 +1,41 @@ +package com.codingapi.tx; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * @author yizhishang + */ +@FeignClient(value = "tx-manager") +public interface MQTxManagerFegin { + + /** + * 检查并清理事务数据 + * @param groupId 事务组id + * @param waitTaskId 任务id + * @return 事务状态 + */ + @GetMapping("/tx/manager/cleanNotifyTransactionHttp") + String cleanNotifyTransactionHttp(@RequestParam(value = "groupId") String groupId, @RequestParam(value = "waitTaskId") String waitTaskId); + + /** + * 记录补偿事务数据到tm + */ + @PostMapping("/tx/manager/sendCompensateMsg") + String sendCompensateMsg(@RequestParam("currentTime") long currentTime, @RequestParam("groupId") String groupId, + @RequestParam("model") String model, @RequestParam("address") String address, + @RequestParam("uniqueKey") String uniqueKey, + @RequestParam("className") String className, @RequestParam("methodStr") String methodStr, + @RequestParam("data") String data, @RequestParam("time") long time, + @RequestParam("startError") int startError); + + /** + * 获取TM服务地址 + * @return txServer + */ + @GetMapping("/tx/manager/getServer") + String getServer(); + +} diff --git a/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxCompensateLocal.java b/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxCompensateLocal.java index c4053460a..19037daf2 100644 --- a/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxCompensateLocal.java +++ b/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxCompensateLocal.java @@ -6,7 +6,7 @@ */ public class TxCompensateLocal { - private final static ThreadLocal currentLocal = new InheritableThreadLocal(); + private final static ThreadLocal currentLocal = new InheritableThreadLocal<>(); private String groupId; diff --git a/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxTransactionInfo.java b/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxTransactionInfo.java index 6d229b286..194788f0b 100644 --- a/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxTransactionInfo.java +++ b/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxTransactionInfo.java @@ -12,8 +12,7 @@ public class TxTransactionInfo { - private TxTransaction transaction; - + private TxTransaction txTransaction; private TxTransactionLocal txTransactionLocal; @@ -27,8 +26,8 @@ public class TxTransactionInfo { private TxTransactionMode mode; - public TxTransactionInfo(TxTransaction transaction, TxTransactionLocal txTransactionLocal, TransactionInvocation invocation, String txGroupId) { - this.transaction = transaction; + public TxTransactionInfo(TxTransaction txTransaction, TxTransactionLocal txTransactionLocal, TransactionInvocation invocation, String txGroupId) { + this.txTransaction = txTransaction; this.txTransactionLocal = txTransactionLocal; this.txGroupId = txGroupId; this.invocation = invocation; @@ -42,8 +41,8 @@ public void setMode(TxTransactionMode mode) { this.mode = mode; } - public TxTransaction getTransaction() { - return transaction; + public TxTransaction getTxTransaction() { + return txTransaction; } public TxTransactionLocal getTxTransactionLocal() { diff --git a/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxTransactionLocal.java b/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxTransactionLocal.java index e134b5ea8..3fce24713 100644 --- a/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxTransactionLocal.java +++ b/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxTransactionLocal.java @@ -19,7 +19,7 @@ public class TxTransactionLocal { private Logger logger = LoggerFactory.getLogger(TxTransactionLocal.class); - private final static ThreadLocal currentLocal = new InheritableThreadLocal(); + private final static ThreadLocal currentLocal = new InheritableThreadLocal<>(); private String groupId; diff --git a/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TransactionServerFactoryServiceImpl.java b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TransactionServerFactoryServiceImpl.java index 8d1d06c98..f47a9d9d3 100644 --- a/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TransactionServerFactoryServiceImpl.java +++ b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TransactionServerFactoryServiceImpl.java @@ -1,22 +1,19 @@ package com.codingapi.tx.aop.service.impl; - import com.codingapi.tx.aop.bean.TxTransactionInfo; import com.codingapi.tx.aop.service.TransactionServer; import com.codingapi.tx.aop.service.TransactionServerFactoryService; import com.codingapi.tx.datasource.ILCNTransactionControl; import com.codingapi.tx.framework.utils.SocketManager; -import com.codingapi.tx.netty.service.NettyService; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; - - /** - * Created by lorne on 2017/6/8. + * @author lorne + * @date 2017/6/8 */ @Service public class TransactionServerFactoryServiceImpl implements TransactionServerFactoryService { @@ -35,24 +32,22 @@ public class TransactionServerFactoryServiceImpl implements TransactionServerFac @Autowired private TransactionServer txRunningNoTransactionServer; - @Autowired - private NettyService nettyService; - @Autowired private ILCNTransactionControl transactionControl; - + @Override public TransactionServer createTransactionServer(TxTransactionInfo info) throws Throwable { - if (!SocketManager.getInstance().isNetState()) { + //检查socket通讯是否正常 (第一次执行时启动txRunningTransactionServer的业务处理控制,然后嵌套调用其他事务的业务方法时都并到txInServiceTransactionServer业务处理下) logger.warn("tx-manager not connected."); return txDefaultTransactionServer; } - /*********分布式事务处理逻辑*开始***********/ + /*********分布式事务处理逻辑***********/ + logger.info("分布式事务处理逻辑...开始"); - /** 尽当Transaction注解不为空,其他都为空时。表示分布式事务开始启动 **/ - if (info.getTransaction() != null && info.getTransaction().isStart() && info.getTxTransactionLocal() == null && StringUtils.isEmpty(info.getTxGroupId())) { + /** 事务发起方:仅当TxTransaction注解不为空,其他都为空时。表示分布式事务开始启动 **/ + if (info.getTxTransaction() != null && info.getTxTransaction().isStart() && info.getTxTransactionLocal() == null && StringUtils.isEmpty(info.getTxGroupId())) { //检查socket通讯是否正常 (当启动事务的主业务方法执行完以后,再执行其他业务方法时将进入txInServiceTransactionServer业务处理) if (SocketManager.getInstance().isNetState()) { return txStartTransactionServer; @@ -62,18 +57,18 @@ public TransactionServer createTransactionServer(TxTransactionInfo info) throws } } - - /** 分布式事务已经开启,业务进行中 **/ + /** 事务参与方:分布式事务已经开启,业务进行中 **/ + logger.debug("事务参与方:分布式事务已经开启,业务进行中"); if (info.getTxTransactionLocal() != null || StringUtils.isNotEmpty(info.getTxGroupId())) { //检查socket通讯是否正常 (第一次执行时启动txRunningTransactionServer的业务处理控制,然后嵌套调用其他事务的业务方法时都并到txInServiceTransactionServer业务处理下) if (SocketManager.getInstance().isNetState()) { if (info.getTxTransactionLocal() != null) { return txDefaultTransactionServer; } else { - if(transactionControl.isNoTransactionOperation() // 表示整个应用没有获取过DB连接 - || info.getTransaction().readOnly()) { //无事务业务的操作 + /** 表示整个应用没有获取过DB连接 || 无事务业务的操作 **/ + if (transactionControl.isNoTransactionOperation() || info.getTxTransaction().readOnly()) { return txRunningNoTransactionServer; - }else { + } else { return txRunningTransactionServer; } } @@ -83,7 +78,7 @@ public TransactionServer createTransactionServer(TxTransactionInfo info) throws } } /*********分布式事务处理逻辑*结束***********/ - + logger.debug("分布式事务处理逻辑*结束"); return txDefaultTransactionServer; } } diff --git a/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxDefaultTransactionServerImpl.java b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxDefaultTransactionServerImpl.java index 7dca22511..b7df72477 100644 --- a/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxDefaultTransactionServerImpl.java +++ b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxDefaultTransactionServerImpl.java @@ -3,6 +3,8 @@ import com.codingapi.tx.aop.bean.TxTransactionInfo; import com.codingapi.tx.aop.service.TransactionServer; import org.aspectj.lang.ProceedingJoinPoint; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; /** @@ -11,10 +13,11 @@ @Service(value = "txDefaultTransactionServer") public class TxDefaultTransactionServerImpl implements TransactionServer { - + private Logger logger = LoggerFactory.getLogger(getClass()); @Override public Object execute(ProceedingJoinPoint point, TxTransactionInfo info) throws Throwable { + logger.info("默认事务管理器..."); return point.proceed(); } } diff --git a/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxRunningNoTransactionServerImpl.java b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxRunningNoTransactionServerImpl.java index b38579a0e..0ce99a013 100644 --- a/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxRunningNoTransactionServerImpl.java +++ b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxRunningNoTransactionServerImpl.java @@ -23,6 +23,8 @@ public class TxRunningNoTransactionServerImpl implements TransactionServer { @Override public Object execute(final ProceedingJoinPoint point, final TxTransactionInfo info) throws Throwable { + logger.info("无事务模块..."); + String kid = KidUtils.generateShortUuid(); String txGroupId = info.getTxGroupId(); logger.debug("--->begin readonly transaction, groupId: " + txGroupId); diff --git a/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxRunningTransactionServerImpl.java b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxRunningTransactionServerImpl.java index 24e81e454..68ec4add4 100644 --- a/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxRunningTransactionServerImpl.java +++ b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxRunningTransactionServerImpl.java @@ -26,20 +26,19 @@ @Service(value = "txRunningTransactionServer") public class TxRunningTransactionServerImpl implements TransactionServer { - @Autowired private MQTxManagerService txManagerService; - @Autowired private ILCNTransactionControl transactionControl; - private Logger logger = LoggerFactory.getLogger(TxRunningTransactionServerImpl.class); @Override public Object execute(final ProceedingJoinPoint point, final TxTransactionInfo info) throws Throwable { + logger.info("事务参与方..."); + String kid = KidUtils.generateShortUuid(); String txGroupId = info.getTxGroupId(); logger.debug("--->begin running transaction,groupId:" + txGroupId); @@ -47,7 +46,6 @@ public Object execute(final ProceedingJoinPoint point, final TxTransactionInfo i boolean isHasIsGroup = transactionControl.hasGroup(txGroupId); - TxTransactionLocal txTransactionLocal = new TxTransactionLocal(); txTransactionLocal.setGroupId(txGroupId); txTransactionLocal.setHasStart(false); @@ -57,7 +55,6 @@ public Object execute(final ProceedingJoinPoint point, final TxTransactionInfo i txTransactionLocal.setMode(info.getMode()); TxTransactionLocal.setCurrent(txTransactionLocal); - try { Object res = point.proceed(); diff --git a/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxStartTransactionServerImpl.java b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxStartTransactionServerImpl.java index 69d90bf07..7dcdbcb1f 100644 --- a/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxStartTransactionServerImpl.java +++ b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxStartTransactionServerImpl.java @@ -35,7 +35,9 @@ public class TxStartTransactionServerImpl implements TransactionServer { public Object execute(ProceedingJoinPoint point,final TxTransactionInfo info) throws Throwable { //分布式事务开始执行 - logger.debug("--->begin start transaction"); + logger.info("事务发起方..."); + + logger.debug("--->分布式事务开始执行 begin start transaction"); final long start = System.currentTimeMillis(); @@ -44,18 +46,17 @@ public Object execute(ProceedingJoinPoint point,final TxTransactionInfo info) th final String groupId = TxCompensateLocal.current()==null?KidUtils.generateShortUuid():TxCompensateLocal.current().getGroupId(); //创建事务组 + logger.debug("创建事务组并发送消息"); txManagerService.createTransactionGroup(groupId); - TxTransactionLocal txTransactionLocal = new TxTransactionLocal(); txTransactionLocal.setGroupId(groupId); txTransactionLocal.setHasStart(true); txTransactionLocal.setMaxTimeOut(Constants.txServer.getCompensateMaxWaitTime()); - txTransactionLocal.setMode(info.getTransaction().mode()); - txTransactionLocal.setReadOnly(info.getTransaction().readOnly()); + txTransactionLocal.setMode(info.getTxTransaction().mode()); + txTransactionLocal.setReadOnly(info.getTxTransaction().readOnly()); TxTransactionLocal.setCurrent(txTransactionLocal); - try { Object obj = point.proceed(); state = 1; @@ -101,7 +102,7 @@ public Object execute(ProceedingJoinPoint point,final TxTransactionInfo info) th long end = System.currentTimeMillis(); long time = end - start; if ((executeConnectionError == 1&&rs == 1)||(lastState == 1 && rs == 0)) { - //记录补偿日志 + logger.debug("记录补偿日志"); txManagerService.sendCompensateMsg(groupId, time, info,executeConnectionError); } }else{ @@ -113,7 +114,7 @@ public Object execute(ProceedingJoinPoint point,final TxTransactionInfo info) th } TxTransactionLocal.setCurrent(null); - logger.debug("<---end start transaction"); + logger.debug("<---分布式事务 end start transaction"); logger.debug("start transaction over, res -> groupId:" + groupId + ", now state:" + (lastState == 1 ? "commit" : "rollback")); } @@ -132,7 +133,7 @@ private int rollbackException(TxTransactionInfo info,Throwable throwable){ } //回滚异常检测. - for(Class rollbackFor:info.getTransaction().rollbackFor()){ + for(Class rollbackFor:info.getTxTransaction().rollbackFor()){ //存在关系 if(rollbackFor.isAssignableFrom(throwable.getClass())){ @@ -142,7 +143,7 @@ private int rollbackException(TxTransactionInfo info,Throwable throwable){ } //不回滚异常检测. - for(Class rollbackFor:info.getTransaction().noRollbackFor()){ + for(Class rollbackFor:info.getTxTransaction().noRollbackFor()){ //存在关系 if(rollbackFor.isAssignableFrom(throwable.getClass())){ diff --git a/tx-client/src/main/java/com/codingapi/tx/config/ConfigReader.java b/tx-client/src/main/java/com/codingapi/tx/config/ConfigReader.java deleted file mode 100644 index 63e90b257..000000000 --- a/tx-client/src/main/java/com/codingapi/tx/config/ConfigReader.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.codingapi.tx.config; - -import com.codingapi.tx.config.service.TxManagerTxUrlService; -import com.lorne.core.framework.utils.config.ConfigUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.stereotype.Component; - -/** - * create by lorne on 2017/11/13 - */ -@Component -public class ConfigReader { - - - private Logger logger = LoggerFactory.getLogger(ConfigReader.class); - - - private TxManagerTxUrlService txManagerTxUrlService; - - @Autowired - private ApplicationContext spring; - - - public String getTxUrl() { - - try { - txManagerTxUrlService = spring.getBean(TxManagerTxUrlService.class); - }catch (Exception e){ - logger.debug("load default txManagerTxUrlService "); - } - - if(txManagerTxUrlService == null){ - txManagerTxUrlService = new TxManagerTxUrlService() { - - private final String configName = "tx.properties"; - - private final String configKey = "url"; - - @Override - public String getTxUrl() { - return ConfigUtils.getString(configName,configKey); - } - }; - - logger.debug("load default txManagerTxUrlService"); - }else{ - logger.debug("load txManagerTxUrlService"); - } - - return txManagerTxUrlService.getTxUrl(); - } - - -} diff --git a/tx-client/src/main/java/com/codingapi/tx/config/service/TxManagerTxUrlService.java b/tx-client/src/main/java/com/codingapi/tx/config/service/TxManagerTxUrlService.java deleted file mode 100644 index 3d8004658..000000000 --- a/tx-client/src/main/java/com/codingapi/tx/config/service/TxManagerTxUrlService.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.codingapi.tx.config.service; - -/** - * create by lorne on 2017/11/18 - */ -public interface TxManagerTxUrlService { - - String getTxUrl(); -} diff --git a/tx-client/src/main/java/com/codingapi/tx/netty/service/MQTxManagerFeginService.java b/tx-client/src/main/java/com/codingapi/tx/netty/service/MQTxManagerFeginService.java new file mode 100644 index 000000000..d1f0314ce --- /dev/null +++ b/tx-client/src/main/java/com/codingapi/tx/netty/service/MQTxManagerFeginService.java @@ -0,0 +1,38 @@ +package com.codingapi.tx.netty.service; + +/** + * @author yizhishang + */ +public interface MQTxManagerFeginService { + + /** + * 检查并清理事务数据 + * @param groupId 事务组id + * @param waitTaskId 任务id + * @return 事务状态 + */ + String cleanNotifyTransactionHttp(String groupId, String waitTaskId); + + /** + * 记录补偿事务数据到tm + * @param currentTime 时间 + * @param groupId 事务组id + * @param model 模块名称 + * @param address 模块地址 + * @param uniqueKey 唯一标示 + * @param className 事务启动类 + * @param methodStr 事务启动方法 + * @param data 切面数据 + * @param time 执行时间 + * @param startError 启动模块异常 + * @return 是否保存成功 + */ + String sendCompensateMsg(long currentTime, String groupId, String model, String address, String uniqueKey, String className, String methodStr, String data, long time,int startError); + + /** + * 获取TM服务地址 + * @return txServer + */ + String getServer(); + +} diff --git a/tx-client/src/main/java/com/codingapi/tx/netty/service/TxManagerHttpRequestHelper.java b/tx-client/src/main/java/com/codingapi/tx/netty/service/TxManagerHttpRequestHelper.java deleted file mode 100644 index c3438938d..000000000 --- a/tx-client/src/main/java/com/codingapi/tx/netty/service/TxManagerHttpRequestHelper.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.codingapi.tx.netty.service; - - -import com.lorne.core.framework.utils.http.HttpUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.stereotype.Component; - -/** - * create by lorne on 2017/11/17 - */ -@Component -public class TxManagerHttpRequestHelper { - - - private TxManagerHttpRequestService httpRequestService; - - @Autowired - private ApplicationContext spring; - - private Logger logger = LoggerFactory.getLogger(TxManagerHttpRequestHelper.class); - - - private void reloadHttpRequestService(){ - try { - httpRequestService = spring.getBean(TxManagerHttpRequestService.class); - }catch (Exception e){ - logger.debug("load default httpRequestService "); - } - - if(httpRequestService==null){ - httpRequestService = new TxManagerHttpRequestService() { - @Override - public String httpGet(String url) { - return HttpUtils.get(url); - } - - @Override - public String httpPost(String url, String params) { - return HttpUtils.post(url, params); - } - }; - logger.info("load default HttpRequestService ."); - }else { - logger.info("load HttpRequestService ."); - } - } - - public String httpGet(String url) { - reloadHttpRequestService(); - return httpRequestService.httpGet(url); - } - - public String httpPost(String url, String params) { - reloadHttpRequestService(); - return httpRequestService.httpPost(url,params); - } - - -} diff --git a/tx-client/src/main/java/com/codingapi/tx/netty/service/TxManagerHttpRequestService.java b/tx-client/src/main/java/com/codingapi/tx/netty/service/TxManagerHttpRequestService.java deleted file mode 100644 index e8ae5769d..000000000 --- a/tx-client/src/main/java/com/codingapi/tx/netty/service/TxManagerHttpRequestService.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.codingapi.tx.netty.service; - -/** - * create by lorne on 2017/11/17 - */ -public interface TxManagerHttpRequestService { - - String httpGet(String url); - - String httpPost(String url, String params); - -} diff --git a/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerFeginServiceImpl.java b/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerFeginServiceImpl.java new file mode 100644 index 000000000..bc6a7c2c8 --- /dev/null +++ b/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerFeginServiceImpl.java @@ -0,0 +1,48 @@ +package com.codingapi.tx.netty.service.impl; + +import com.codingapi.tx.MQTxManagerFegin; +import com.codingapi.tx.netty.service.MQTxManagerFeginService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Service; + +/** + * @author yizhishang + */ +@Service +public class MQTxManagerFeginServiceImpl implements MQTxManagerFeginService { + + @Autowired + private MQTxManagerFegin mqTxManagerFegin; + + /** + * 检查并清理事务数据 + * + * @param groupId 事务组id + * @param waitTaskId 任务id + * @return 事务状态 + */ + @Override + public String cleanNotifyTransactionHttp(String groupId, String waitTaskId) { + return mqTxManagerFegin.cleanNotifyTransactionHttp(groupId, waitTaskId); + } + + /** + * 记录补偿事务数据到tm + */ + @Override + public String sendCompensateMsg(long currentTime, String groupId, String model, String address, String uniqueKey, String className, String methodStr, String data, long time,int startError) { + return mqTxManagerFegin.sendCompensateMsg(currentTime, groupId, model, address, uniqueKey, className, methodStr, data, time,startError); + } + + /** + * 获取TM服务地址 + * + * @return txServer + */ + @Override + public String getServer() { + return mqTxManagerFegin.getServer(); + } + +} diff --git a/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerServiceImpl.java b/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerServiceImpl.java index 5362b63d8..a6fbb4a10 100644 --- a/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerServiceImpl.java +++ b/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerServiceImpl.java @@ -1,18 +1,16 @@ package com.codingapi.tx.netty.service.impl; import com.alibaba.fastjson.JSONObject; -import com.codingapi.tx.aop.bean.TxCompensateLocal; import com.codingapi.tx.aop.bean.TxTransactionInfo; import com.codingapi.tx.compensate.model.CompensateInfo; import com.codingapi.tx.compensate.service.CompensateService; -import com.codingapi.tx.config.ConfigReader; import com.codingapi.tx.framework.utils.SerializerUtils; import com.codingapi.tx.framework.utils.SocketManager; import com.codingapi.tx.listener.service.ModelNameService; import com.codingapi.tx.model.Request; import com.codingapi.tx.model.TxGroup; +import com.codingapi.tx.netty.service.MQTxManagerFeginService; import com.codingapi.tx.netty.service.MQTxManagerService; -import com.codingapi.tx.netty.service.TxManagerHttpRequestHelper; import com.lorne.core.framework.utils.encode.Base64Utils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -27,15 +25,11 @@ public class MQTxManagerServiceImpl implements MQTxManagerService { @Autowired private ModelNameService modelNameService; - @Autowired - private ConfigReader configReader; - @Autowired private CompensateService compensateService; @Autowired - private TxManagerHttpRequestHelper managerHelper; - + private MQTxManagerFeginService mqTxManagerFeginService; @Override public void createTransactionGroup(String groupId) { @@ -57,7 +51,6 @@ public TxGroup addTransactionGroup(String groupId, String taskId, boolean isGrou return TxGroup.parser(json); } - @Override public int closeTransactionGroup(final String groupId, final int state) { JSONObject jsonObject = new JSONObject(); @@ -100,8 +93,7 @@ public int cleanNotifyTransaction(String groupId, String taskId) { @Override public int cleanNotifyTransactionHttp(String groupId, String waitTaskId) { - String url = configReader.getTxUrl() + "cleanNotifyTransactionHttp?groupId=" + groupId + "&taskId=" + waitTaskId; - String clearRes = managerHelper.httpGet(url); + String clearRes = mqTxManagerFeginService.cleanNotifyTransactionHttp(groupId, waitTaskId); if(clearRes==null){ return -1; } @@ -111,8 +103,7 @@ public int cleanNotifyTransactionHttp(String groupId, String waitTaskId) { @Override public String httpGetServer() { - String url = configReader.getTxUrl() + "getServer"; - return managerHelper.httpGet(url); + return mqTxManagerFeginService.getServer(); } @Override @@ -133,7 +124,7 @@ public void sendCompensateMsg(String groupId, long time, TxTransactionInfo info, CompensateInfo compensateInfo = new CompensateInfo(currentTime, modelName, uniqueKey, data, methodStr, className, groupId, address, time,startError); - String json = managerHelper.httpPost(configReader.getTxUrl() + "sendCompensateMsg", compensateInfo.toParamsString()); + String json = mqTxManagerFeginService.sendCompensateMsg(currentTime, groupId, modelName, address, uniqueKey, className, methodStr, data, time,startError); compensateInfo.setResJson(json); diff --git a/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/NettyControlServiceImpl.java b/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/NettyControlServiceImpl.java index 77b963f9e..24b57e348 100644 --- a/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/NettyControlServiceImpl.java +++ b/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/NettyControlServiceImpl.java @@ -52,18 +52,15 @@ public void restart() { @Override public void uploadModelInfo() { - new Thread(new Runnable() { - @Override - public void run() { - while (!SocketManager.getInstance().isNetState()|| !IpAddressUtils.isIpAddress(modelNameService.getIpAddress())) { - try { - Thread.sleep(1000 * 5); - } catch (InterruptedException e) { - e.printStackTrace(); - } + new Thread(() -> { + while (!SocketManager.getInstance().isNetState()|| !IpAddressUtils.isIpAddress(modelNameService.getIpAddress())) { + try { + Thread.sleep(1000 * 5); + } catch (InterruptedException e) { + e.printStackTrace(); } - mqTxManagerService.uploadModelInfo(); } + mqTxManagerService.uploadModelInfo(); }).start(); } diff --git a/tx-manager/.gitignore b/tx-manager/.gitignore deleted file mode 100644 index 76331cfb8..000000000 --- a/tx-manager/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -target/ -!.mvn/wrapper/maven-wrapper.jar - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -nbproject/private/ -nbbuild/ -dist/ -nbdist/ -.nb-gradle/ \ No newline at end of file diff --git a/tx-manager/.mvn/wrapper/maven-wrapper.jar b/tx-manager/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 9cc84ea9b..000000000 Binary files a/tx-manager/.mvn/wrapper/maven-wrapper.jar and /dev/null differ diff --git a/tx-manager/.mvn/wrapper/maven-wrapper.properties b/tx-manager/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index c31504370..000000000 --- a/tx-manager/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1 +0,0 @@ -distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.0/apache-maven-3.5.0-bin.zip diff --git a/tx-manager/mvnw b/tx-manager/mvnw deleted file mode 100644 index 5bf251c07..000000000 --- a/tx-manager/mvnw +++ /dev/null @@ -1,225 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven2 Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Migwn, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" - # TODO classpath? -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -echo $MAVEN_PROJECTBASEDIR -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/tx-manager/mvnw.cmd b/tx-manager/mvnw.cmd deleted file mode 100644 index 019bd74d7..000000000 --- a/tx-manager/mvnw.cmd +++ /dev/null @@ -1,143 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM http://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven2 Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" - -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% diff --git a/tx-manager/pom.xml b/tx-manager/pom.xml index a0c5f052a..684aee77a 100644 --- a/tx-manager/pom.xml +++ b/tx-manager/pom.xml @@ -5,7 +5,7 @@ com.codingapi tx-manager - 4.2.0-SNAPSHOT + 4.2.0 jar tx-manager @@ -14,24 +14,35 @@ org.springframework.boot spring-boot-starter-parent - 1.5.4.RELEASE + 2.0.4.RELEASE UTF-8 UTF-8 - 1.7 - 1.7 - 1.7 + 1.8 + 1.8 + 1.8 19.0 - Dalston.SR1 + Finchley.RELEASE true true - + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + @@ -46,7 +57,6 @@ - io.netty netty-all @@ -55,31 +65,34 @@ org.springframework.cloud - spring-cloud-starter-eureka-server + spring-cloud-starter-netflix-eureka-client + 2.0.0.RELEASE + + + + org.springframework.boot + spring-boot-starter-web - com.google.guava - guava + org.springframework.boot + spring-boot-starter-tomcat - - - - - - - org.springframework.boot - spring-boot-starter-web + spring-boot-starter-undertow - org.springframework.boot - spring-boot-starter-redis - 1.3.8.RELEASE + spring-boot-starter-data-redis + + + + com.alibaba + fastjson + 1.2.47 @@ -90,19 +103,6 @@ - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - - @@ -147,26 +147,6 @@ - - maven-assembly-plugin - - false - - src/main/build/package.xml - - - - - make-assembly - package - - single - - - - - - org.springframework.boot spring-boot-maven-plugin diff --git a/tx-manager/src/main/build/package.xml b/tx-manager/src/main/build/package.xml deleted file mode 100644 index 5b5cf98ea..000000000 --- a/tx-manager/src/main/build/package.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - package - - zip - - true - - - bin - / - - - src/main/resources - / - - - ${project.build.directory} - / - - *.jar - - - - - - lib - runtime - - ${groupId}:${artifactId} - - - - diff --git a/tx-manager/src/main/java/com/codingapi/tm/ServletInitializer.java b/tx-manager/src/main/java/com/codingapi/tm/ServletInitializer.java index f9ee98fd9..dbf897b36 100644 --- a/tx-manager/src/main/java/com/codingapi/tm/ServletInitializer.java +++ b/tx-manager/src/main/java/com/codingapi/tm/ServletInitializer.java @@ -1,18 +1,16 @@ package com.codingapi.tm; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; /** * Created by lorne on 2017/7/3. */ public class ServletInitializer extends SpringBootServletInitializer { - @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(TxManagerApplication.class); } - } diff --git a/tx-manager/src/main/java/com/codingapi/tm/TxManagerApplication.java b/tx-manager/src/main/java/com/codingapi/tm/TxManagerApplication.java index 156b2821f..e4b8112d8 100644 --- a/tx-manager/src/main/java/com/codingapi/tm/TxManagerApplication.java +++ b/tx-manager/src/main/java/com/codingapi/tm/TxManagerApplication.java @@ -2,15 +2,12 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; - +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +@EnableEurekaClient @SpringBootApplication -@EnableDiscoveryClient public class TxManagerApplication { - - public static void main(String[] args) { SpringApplication.run(TxManagerApplication.class, args); } diff --git a/tx-manager/src/main/java/com/codingapi/tm/compensate/dao/impl/CompensateDaoImpl.java b/tx-manager/src/main/java/com/codingapi/tm/compensate/dao/impl/CompensateDaoImpl.java index 46b7c2278..2969da2cf 100644 --- a/tx-manager/src/main/java/com/codingapi/tm/compensate/dao/impl/CompensateDaoImpl.java +++ b/tx-manager/src/main/java/com/codingapi/tm/compensate/dao/impl/CompensateDaoImpl.java @@ -6,6 +6,8 @@ import com.codingapi.tm.config.ConfigReader; import com.codingapi.tm.redis.service.RedisServerService; import com.lorne.core.framework.utils.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -18,6 +20,7 @@ @Service public class CompensateDaoImpl implements CompensateDao { + Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private RedisServerService redisServerService; @@ -33,6 +36,7 @@ public String saveCompensateMsg(TransactionCompensateMsg transactionCompensateMs String json = JSON.toJSONString(transactionCompensateMsg); + logger.debug("保存补偿数据至redis: {}", json); redisServerService.saveCompensateMsg(name, json); return name; diff --git a/tx-manager/src/main/java/com/codingapi/tm/compensate/service/impl/CompensateServiceImpl.java b/tx-manager/src/main/java/com/codingapi/tm/compensate/service/impl/CompensateServiceImpl.java index 84d183bd6..398455aa7 100644 --- a/tx-manager/src/main/java/com/codingapi/tm/compensate/service/impl/CompensateServiceImpl.java +++ b/tx-manager/src/main/java/com/codingapi/tm/compensate/service/impl/CompensateServiceImpl.java @@ -114,6 +114,7 @@ public void autoCompensate(final String compensateKey, TransactionCompensateMsg final String json = JSON.toJSONString(transactionCompensateMsg); logger.info("Auto Compensate->" + json); //自动补偿业务执行... + logger.debug("自动补偿业务执行..."); final int tryTime = configReader.getCompensateTryTime(); boolean autoExecuteRes = false; try { @@ -278,9 +279,11 @@ public void reloadCompensate(TxGroup txGroup) { } } } + logger.info("重新加载补偿数据..."); logger.info("Compensate Loaded->"+JSON.toJSONString(txGroup)); } + @Override public TxGroup getCompensateByGroupId(String groupId) { String json = compensateDao.getCompensateByGroupId(groupId); if (json == null) { diff --git a/tx-manager/src/main/java/com/codingapi/tm/listener/ApplicationStartListener.java b/tx-manager/src/main/java/com/codingapi/tm/listener/ApplicationStartListener.java index ecb20d049..3d86c4918 100644 --- a/tx-manager/src/main/java/com/codingapi/tm/listener/ApplicationStartListener.java +++ b/tx-manager/src/main/java/com/codingapi/tm/listener/ApplicationStartListener.java @@ -1,7 +1,7 @@ package com.codingapi.tm.listener; import com.codingapi.tm.Constants; -import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent; +import org.springframework.boot.web.context.WebServerInitializedEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; @@ -12,12 +12,12 @@ * create by lorne on 2017/8/7 */ @Component -public class ApplicationStartListener implements ApplicationListener { +public class ApplicationStartListener implements ApplicationListener { @Override - public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) { - int serverPort = event.getEmbeddedServletContainer().getPort(); + public void onApplicationEvent(WebServerInitializedEvent event) { + int serverPort = event.getWebServer().getPort(); String ip = getIp(); Constants.address = ip+":"+serverPort; } diff --git a/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/MicroServiceImpl.java b/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/MicroServiceImpl.java index 5a74ac913..5855b14bb 100644 --- a/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/MicroServiceImpl.java +++ b/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/MicroServiceImpl.java @@ -6,10 +6,14 @@ import com.codingapi.tm.manager.service.MicroService; import com.codingapi.tm.model.TxServer; import com.codingapi.tm.model.TxState; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; import java.util.ArrayList; @@ -23,6 +27,7 @@ @Service public class MicroServiceImpl implements MicroService { + private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private RestTemplate restTemplate; @@ -34,7 +39,11 @@ public class MicroServiceImpl implements MicroService { @Autowired private DiscoveryClient discoveryClient; - + /** + * 服务注册 + */ + @Autowired + private Registration registration; private boolean isIp(String ipAddress) { String ip = "([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}"; @@ -43,15 +52,14 @@ private boolean isIp(String ipAddress) { return matcher.matches(); } - - @Override public TxState getState() { TxState state = new TxState(); - String ipAddress = discoveryClient.getLocalServiceInstance().getHost(); + String ipAddress = registration.getHost(); if(!isIp(ipAddress)){ ipAddress = "127.0.0.1"; } + logger.info("ipAddress: {}, port: {}", ipAddress, Constants.socketPort); state.setIp(ipAddress); state.setPort(Constants.socketPort); state.setMaxConnection(SocketManager.getInstance().getMaxConnection()); diff --git a/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/TxManagerSenderServiceImpl.java b/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/TxManagerSenderServiceImpl.java index e5ee4e270..2edae671a 100644 --- a/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/TxManagerSenderServiceImpl.java +++ b/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/TxManagerSenderServiceImpl.java @@ -110,13 +110,11 @@ private void setChannel(List list) { /** * 事务提交或回归 * - * @param checkSate + * @param checkSate 1-提交事务 */ private boolean transaction(final TxGroup txGroup, final int checkSate) { - - if (checkSate == 1) { - + logger.info("事务提交"); //补偿请求,加载历史数据 if (txGroup.getIsCompensate() == 1) { compensateService.reloadCompensate(txGroup); @@ -135,8 +133,8 @@ public Boolean execute() { final JSONObject jsonObject = new JSONObject(); jsonObject.put("a", "t"); - - if (txGroup.getIsCompensate() == 1) { //补偿请求 + /** 补偿请求 **/ + if (txGroup.getIsCompensate() == 1) { jsonObject.put("c", txInfo.getIsCommit()); } else { //正常业务 jsonObject.put("c", checkSate); @@ -193,24 +191,25 @@ public Boolean execute() { } logger.info("--->" + hasOk + ",group:" + txGroup.getGroupId() + ",state:" + checkSate + ",list:" + txGroup.toJsonString()); return hasOk; - }else{ - //回滚操作只发送通过不需要等待确认 - for (TxInfo txInfo : txGroup.getList()) { - if(txInfo.getChannel()!=null) { - if (txInfo.getIsGroup() == 0) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("a", "t"); - jsonObject.put("c", checkSate); - jsonObject.put("t", txInfo.getKid()); - String key = KidUtils.generateShortUuid(); - jsonObject.put("k", key); - txInfo.getChannel().send(jsonObject.toJSONString()); - } + } + + logger.info("事务回滚"); + //回滚操作只发送通过不需要等待确认 + for (TxInfo txInfo : txGroup.getList()) { + if(txInfo.getChannel()!=null) { + if (txInfo.getIsGroup() == 0) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("a", "t"); + jsonObject.put("c", checkSate); + jsonObject.put("t", txInfo.getKid()); + String key = KidUtils.generateShortUuid(); + jsonObject.put("k", key); + txInfo.getChannel().send(jsonObject.toJSONString()); } } - txManagerService.deleteTxGroup(txGroup); - return true; } + txManagerService.deleteTxGroup(txGroup); + return true; } diff --git a/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/TxManagerServiceImpl.java b/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/TxManagerServiceImpl.java index da6e1360f..76700de76 100644 --- a/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/TxManagerServiceImpl.java +++ b/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/TxManagerServiceImpl.java @@ -23,8 +23,6 @@ @Service public class TxManagerServiceImpl implements TxManagerService { - - @Autowired private ConfigReader configReader; @@ -42,12 +40,12 @@ public class TxManagerServiceImpl implements TxManagerService { @Autowired private CompensateService compensateService; - private Logger logger = LoggerFactory.getLogger(TxManagerServiceImpl.class); @Override public TxGroup createTransactionGroup(String groupId) { + logger.info("创建事物组"); TxGroup txGroup = new TxGroup(); if (compensateService.getCompensateByGroupId(groupId)!=null) { txGroup.setIsCompensate(1); @@ -65,6 +63,8 @@ public TxGroup createTransactionGroup(String groupId) { @Override public TxGroup addTransactionGroup(String groupId, String taskId, int isGroup, String channelAddress, String methodStr) { + + logger.info("添加事务组子对象..."); String key = getTxGroupKey(groupId); TxGroup txGroup = getTxGroup(groupId); if (txGroup==null) { @@ -77,7 +77,6 @@ public TxGroup addTransactionGroup(String groupId, String taskId, int isGroup, S txInfo.setIsGroup(isGroup); txInfo.setMethodStr(methodStr); - ModelInfo modelInfo = ModelInfoManager.getInstance().getModelByChannelName(channelAddress); if(modelInfo!=null) { txInfo.setUniqueKey(modelInfo.getUniqueKey()); @@ -94,6 +93,7 @@ public TxGroup addTransactionGroup(String groupId, String taskId, int isGroup, S @Override public boolean rollbackTransactionGroup(String groupId) { + logger.info("设置强制回滚事务..."); String key = getTxGroupKey(groupId); TxGroup txGroup = getTxGroup(groupId); if (txGroup==null) { @@ -106,6 +106,7 @@ public boolean rollbackTransactionGroup(String groupId) { @Override public int cleanNotifyTransaction(String groupId, String taskId) { + logger.info("检查事务组数据..."); int res = 0; logger.info("start-cleanNotifyTransaction->groupId:"+groupId+",taskId:"+taskId); String key = getTxGroupKey(groupId); @@ -169,6 +170,7 @@ public int cleanNotifyTransaction(String groupId, String taskId) { @Override public int closeTransactionGroup(String groupId,int state) { + logger.info("关闭事务组"); String key = getTxGroupKey(groupId); TxGroup txGroup = getTxGroup(groupId); if(txGroup==null){ diff --git a/tx-manager/src/main/java/com/codingapi/tm/redis/JedisClusterConfig.java b/tx-manager/src/main/java/com/codingapi/tm/redis/JedisClusterConfig.java deleted file mode 100644 index 6f7112431..000000000 --- a/tx-manager/src/main/java/com/codingapi/tm/redis/JedisClusterConfig.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.codingapi.tm.redis; - - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.core.env.MapPropertySource; -import org.springframework.data.redis.connection.RedisClusterConfiguration; -import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import redis.clients.jedis.HostAndPort; -import redis.clients.jedis.JedisCluster; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -/** - * Created by lorne on 2017/10/31. - */ -@ConditionalOnClass({JedisCluster.class}) -@EnableConfigurationProperties(RedisProperties.class) -public class JedisClusterConfig { - - @Autowired - private RedisProperties redisProperties; - - @Bean - public JedisCluster jedisClusterFactory() { - String[] serverArray = redisProperties.getNodes().split(","); - Set nodes = new HashSet(); - for (String ipPort: serverArray) { - String[] ipPortPair = ipPort.split(":"); - nodes.add(new HostAndPort(ipPortPair[0].trim(),Integer.valueOf(ipPortPair[1].trim()))); - } - return new JedisCluster(nodes, redisProperties.getCommandTimeout()); - } - - @Bean - public RedisTemplate redisTemplateFactory(){ - RedisTemplate redisTemplate =new RedisTemplate(); - redisTemplate.setConnectionFactory(jedisConnectionFactory()); - - //指定具体序列化方式 不过这种方式不是很好,一个系统中可能对应值的类型不一样,如果全部使用StringRedisSerializer 序列化 - //会照成其他类型报错,所以还是推荐使用第一种,直接指定泛型的类型,spring 会根据指定类型序列化。 -// redisTemplate.setKeySerializer( new StringRedisSerializer()); -// redisTemplate.setValueSerializer(new StringRedisSerializer()); -// redisTemplate.setHashKeySerializer(new StringRedisSerializer()); -// redisTemplate.setHashValueSerializer(new StringRedisSerializer()); - return redisTemplate; - } - - - /** - * redisCluster配置 - * @return - */ - @Bean - public RedisClusterConfiguration redisClusterConfiguration() { - Map source = new HashMap(); - source.put("spring.redis.cluster.nodes", redisProperties.getNodes()); - source.put("spring.redis.cluster.timeout", redisProperties.getCommandTimeout()); - return new RedisClusterConfiguration(new MapPropertySource("RedisClusterConfiguration", source)); - } - - - /** - * 其实在JedisConnectionFactory的afterPropertiesSet()方法 中 - * if(cluster !=null) this.cluster =createCluster(); - * 也就是当 - * spring.redis.cluster.nodes 配置好的情况下,就可以实例化 JedisCluster. - * 也就是说,我们使用JedisCluster 的方式只需要在application.properties 配置文件中 - * - * #redis cluster - * spring.redis.cluster.nodes=127.0.0.1:7000,127.0.0.1:7001,127.0.0.1:7002 - * - * RedisTemplate.afterPropertiesSet() 中查看到最终方法中使用了JedisCluster 对象。 - * 也就是说 redisTemplate依赖jedis ,内部操作的就是jedis,同理内部也操作jedisCluster. - * - * - * @return - */ - @Bean - public JedisConnectionFactory jedisConnectionFactory() { - return new JedisConnectionFactory(redisClusterConfiguration()); - } -} \ No newline at end of file diff --git a/tx-manager/src/main/java/com/codingapi/tm/redis/RedisConfig.java b/tx-manager/src/main/java/com/codingapi/tm/redis/RedisConfig.java deleted file mode 100644 index 81ceae8f6..000000000 --- a/tx-manager/src/main/java/com/codingapi/tm/redis/RedisConfig.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.codingapi.tm.redis; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.StringRedisTemplate; -import redis.clients.jedis.JedisPoolConfig; - -/** - * Created by lorne on 2017/7/5. - */ - -@EnableAutoConfiguration -public class RedisConfig { - - private static Logger logger = LoggerFactory.getLogger(RedisConfig.class); - - @Bean - @ConfigurationProperties(prefix = "spring.redis") - public JedisPoolConfig getRedisConfig() { - JedisPoolConfig config = new JedisPoolConfig(); - return config; - } - - @Bean - @ConfigurationProperties(prefix = "spring.redis") - public JedisConnectionFactory getConnectionFactory() { - JedisConnectionFactory factory = new JedisConnectionFactory(); - JedisPoolConfig config = getRedisConfig(); - factory.setPoolConfig(config); - logger.info("JedisConnectionFactory bean init success."); - return factory; - } - - - @Bean - public RedisTemplate getRedisTemplate() { - return new StringRedisTemplate(getConnectionFactory()); - } -} diff --git a/tx-manager/src/main/java/com/codingapi/tm/redis/RedisProperties.java b/tx-manager/src/main/java/com/codingapi/tm/redis/RedisProperties.java deleted file mode 100644 index bd1815c95..000000000 --- a/tx-manager/src/main/java/com/codingapi/tm/redis/RedisProperties.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.codingapi.tm.redis; - - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - * Created by lorne on 2017/10/31. - */ - -@Component -@ConfigurationProperties(prefix = "spring.redis.cluster") -public class RedisProperties { - - - private String nodes; - - private Integer commandTimeout; - - public String getNodes() { - return nodes; - } - - public void setNodes(String nodes) { - this.nodes = nodes; - } - - public Integer getCommandTimeout() { - return commandTimeout; - } - - public void setCommandTimeout(Integer commandTimeout) { - this.commandTimeout = commandTimeout; - } -} diff --git a/tx-manager/src/main/java/com/codingapi/tm/redis/configuration/RedisTemplateConfig.java b/tx-manager/src/main/java/com/codingapi/tm/redis/configuration/RedisTemplateConfig.java new file mode 100644 index 000000000..e1322625f --- /dev/null +++ b/tx-manager/src/main/java/com/codingapi/tm/redis/configuration/RedisTemplateConfig.java @@ -0,0 +1,52 @@ +package com.codingapi.tm.redis.configuration; + +import com.alibaba.fastjson.parser.ParserConfig; +import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.stereotype.Component; + +/** + * @author yizhishhang + * @description 使用一个Transfer类间接注入RedisConnectionFactory + * Created on 2018/4/18 0018 10:21 + */ +@Component +public class RedisTemplateConfig +{ + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) + { + logger.info("redis...初始化"); + + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + + FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); + + ParserConfig.getGlobalInstance().addAccept("com.codingapi.tm."); + + /** + * 设置值(value)的序列化采用FastJsonRedisSerializer。 + */ + redisTemplate.setValueSerializer(fastJsonRedisSerializer); + redisTemplate.setHashValueSerializer(fastJsonRedisSerializer); + + + /** + * 设置键(key)的序列化采用StringRedisSerializer + */ + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.setHashKeySerializer(new StringRedisSerializer()); + + redisTemplate.afterPropertiesSet(); + + return redisTemplate; + } +} diff --git a/tx-manager/src/main/java/com/codingapi/tm/redis/service/impl/RedisServerServiceImpl.java b/tx-manager/src/main/java/com/codingapi/tm/redis/service/impl/RedisServerServiceImpl.java index 2b28ff360..c004dbd28 100644 --- a/tx-manager/src/main/java/com/codingapi/tm/redis/service/impl/RedisServerServiceImpl.java +++ b/tx-manager/src/main/java/com/codingapi/tm/redis/service/impl/RedisServerServiceImpl.java @@ -30,6 +30,7 @@ public class RedisServerServiceImpl implements RedisServerService{ private ConfigReader configReader; + @Override public String loadNotifyJson() { Set keys = redisTemplate.keys(configReader.getKeyPrefixCompensate()+"*"); ValueOperations value = redisTemplate.opsForValue(); diff --git a/tx-manager/src/main/resources/application.properties b/tx-manager/src/main/resources/application.properties index b12f29015..e54d24f90 100644 --- a/tx-manager/src/main/resources/application.properties +++ b/tx-manager/src/main/resources/application.properties @@ -1,9 +1,9 @@ #######################################txmanager-start################################################# -#服务端口 -server.port=7000 +#\u670D\u52A1\u7AEF\u53E3 +server.port=9010 -#tx-manager不得修改 +#tx-manager\u4E0D\u5F97\u4FEE\u6539 spring.application.name=tx-manager spring.mvc.static-path-pattern=/** @@ -11,86 +11,84 @@ spring.resources.static-locations=classpath:/static/ #######################################txmanager-end################################################# -#zookeeper地址 +#zookeeper\u5730\u5740 #spring.cloud.zookeeper.connect-string=127.0.0.1:2181 #spring.cloud.zookeeper.discovery.preferIpAddress = true -#eureka 地址 -eureka.client.service-url.defaultZone=http://127.0.0.1:7000/eureka/ +#eureka \u5730\u5740 +eureka.client.service-url.defaultZone=http://127.0.0.1:1111/eureka/ eureka.instance.prefer-ip-address=true #######################################redis-start################################################# -#redis 配置文件,根据情况选择集群或者单机模式 +#redis \u914D\u7F6E\u6587\u4EF6\uFF0C\u6839\u636E\u60C5\u51B5\u9009\u62E9\u96C6\u7FA4\u6216\u8005\u5355\u673A\u6A21\u5F0F -##redis 集群环境配置 +##redis \u96C6\u7FA4\u73AF\u5883\u914D\u7F6E ##redis cluster -#spring.redis.cluster.nodes=127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003 +#spring.redis.cluster.nodes=127.0.0.1:6380,127.0.0.1:6381,127.0.0.1:6382 #spring.redis.cluster.commandTimeout=5000 -##redis 单点环境配置 +##redis \u5355\u70B9\u73AF\u5883\u914D\u7F6E #redis -#redis主机地址 -spring.redis.host=172.26.8.150 -#redis主机端口 -spring.redis.port=6379 -#redis链接密码 -spring.redis.password= -spring.redis.pool.maxActive=10 -spring.redis.pool.maxWait=-1 -spring.redis.pool.maxIdle=5 -spring.redis.pool.minIdle=0 -spring.redis.timeout=0 +#redis\u4E3B\u673A\u5730\u5740 +#spring.redis.host=localhost +#redis\u4E3B\u673A\u7AEF\u53E3 +#spring.redis.port=6379 +#redis\u94FE\u63A5\u5BC6\u7801 +#spring.redis.password= +spring.redis.jedis.pool.max-idle=8 +spring.redis.jedis.pool.max-wait= +spring.redis.jedis.pool.min-idle=0 #####################################redis-end################################################### #######################################LCN-start################################################# -#业务模块与TxManager之间通讯的最大等待时间(单位:秒) -#通讯时间是指:发起方与响应方之间完成一次的通讯时间。 -#该字段代表的是Tx-Client模块与TxManager模块之间的最大通讯时间,超过该时间未响应本次请求失败。 +#\u4E1A\u52A1\u6A21\u5757\u4E0ETxManager\u4E4B\u95F4\u901A\u8BAF\u7684\u6700\u5927\u7B49\u5F85\u65F6\u95F4\uFF08\u5355\u4F4D\uFF1A\u79D2\uFF09 +#\u901A\u8BAF\u65F6\u95F4\u662F\u6307\uFF1A\u53D1\u8D77\u65B9\u4E0E\u54CD\u5E94\u65B9\u4E4B\u95F4\u5B8C\u6210\u4E00\u6B21\u7684\u901A\u8BAF\u65F6\u95F4\u3002 +#\u8BE5\u5B57\u6BB5\u4EE3\u8868\u7684\u662FTx-Client\u6A21\u5757\u4E0ETxManager\u6A21\u5757\u4E4B\u95F4\u7684\u6700\u5927\u901A\u8BAF\u65F6\u95F4\uFF0C\u8D85\u8FC7\u8BE5\u65F6\u95F4\u672A\u54CD\u5E94\u672C\u6B21\u8BF7\u6C42\u5931\u8D25\u3002 tm.transaction.netty.delaytime = 5 -#业务模块与TxManager之间通讯的心跳时间(单位:秒) +#\u4E1A\u52A1\u6A21\u5757\u4E0ETxManager\u4E4B\u95F4\u901A\u8BAF\u7684\u5FC3\u8DF3\u65F6\u95F4\uFF08\u5355\u4F4D\uFF1A\u79D2\uFF09 tm.transaction.netty.hearttime = 15 -#存储到redis下的数据最大保存时间(单位:秒) -#该字段仅代表的事务模块数据的最大保存时间,补偿数据会永久保存。 +#\u5B58\u50A8\u5230redis\u4E0B\u7684\u6570\u636E\u6700\u5927\u4FDD\u5B58\u65F6\u95F4\uFF08\u5355\u4F4D\uFF1A\u79D2\uFF09 +#\u8BE5\u5B57\u6BB5\u4EC5\u4EE3\u8868\u7684\u4E8B\u52A1\u6A21\u5757\u6570\u636E\u7684\u6700\u5927\u4FDD\u5B58\u65F6\u95F4\uFF0C\u8865\u507F\u6570\u636E\u4F1A\u6C38\u4E45\u4FDD\u5B58\u3002 tm.redis.savemaxtime=30 -#socket server Socket对外服务端口 -#TxManager的LCN协议的端口 +#socket server Socket\u5BF9\u5916\u670D\u52A1\u7AEF\u53E3 +#TxManager\u7684LCN\u534F\u8BAE\u7684\u7AEF\u53E3 tm.socket.port=9999 -#最大socket连接数 -#TxManager最大允许的建立连接数量 +#\u6700\u5927socket\u8FDE\u63A5\u6570 +#TxManager\u6700\u5927\u5141\u8BB8\u7684\u5EFA\u7ACB\u8FDE\u63A5\u6570\u91CF tm.socket.maxconnection=100 -#事务自动补偿 (true:开启,false:关闭) -# 说明: -# 开启自动补偿以后,必须要配置 tm.compensate.notifyUrl 地址,仅当tm.compensate.notifyUrl 在请求补偿确认时返回success或者SUCCESS时,才会执行自动补偿,否则不会自动补偿。 -# 关闭自动补偿,当出现数据时也会 tm.compensate.notifyUrl 地址。 -# 当tm.compensate.notifyUrl 无效时,不影响TxManager运行,仅会影响自动补偿。 +#\u4E8B\u52A1\u81EA\u52A8\u8865\u507F (true:\u5F00\u542F\uFF0Cfalse:\u5173\u95ED) +# \u8BF4\u660E\uFF1A +# \u5F00\u542F\u81EA\u52A8\u8865\u507F\u4EE5\u540E\uFF0C\u5FC5\u987B\u8981\u914D\u7F6E tm.compensate.notifyUrl \u5730\u5740\uFF0C\u4EC5\u5F53tm.compensate.notifyUrl \u5728\u8BF7\u6C42\u8865\u507F\u786E\u8BA4\u65F6\u8FD4\u56DEsuccess\u6216\u8005SUCCESS\u65F6\uFF0C\u624D\u4F1A\u6267\u884C\u81EA\u52A8\u8865\u507F\uFF0C\u5426\u5219\u4E0D\u4F1A\u81EA\u52A8\u8865\u507F\u3002 +# \u5173\u95ED\u81EA\u52A8\u8865\u507F\uFF0C\u5F53\u51FA\u73B0\u6570\u636E\u65F6\u4E5F\u4F1A tm.compensate.notifyUrl \u5730\u5740\u3002 +# \u5F53tm.compensate.notifyUrl \u65E0\u6548\u65F6\uFF0C\u4E0D\u5F71\u54CDTxManager\u8FD0\u884C\uFF0C\u4EC5\u4F1A\u5F71\u54CD\u81EA\u52A8\u8865\u507F\u3002 tm.compensate.auto=false -#事务补偿记录回调地址(rest api 地址,post json格式) -#请求补偿是在开启自动补偿时才会请求的地址。请求分为两种:1.补偿决策,2.补偿结果通知,可通过通过action参数区分compensate为补偿请求、notify为补偿通知。 -#*注意当请求补偿决策时,需要补偿服务返回"SUCCESS"字符串以后才可以执行自动补偿。 -#请求补偿结果通知则只需要接受通知即可。 -#请求补偿的样例数据格式: +#\u4E8B\u52A1\u8865\u507F\u8BB0\u5F55\u56DE\u8C03\u5730\u5740(rest api \u5730\u5740\uFF0Cpost json\u683C\u5F0F) +#\u8BF7\u6C42\u8865\u507F\u662F\u5728\u5F00\u542F\u81EA\u52A8\u8865\u507F\u65F6\u624D\u4F1A\u8BF7\u6C42\u7684\u5730\u5740\u3002\u8BF7\u6C42\u5206\u4E3A\u4E24\u79CD\uFF1A1.\u8865\u507F\u51B3\u7B56\uFF0C2.\u8865\u507F\u7ED3\u679C\u901A\u77E5\uFF0C\u53EF\u901A\u8FC7\u901A\u8FC7action\u53C2\u6570\u533A\u5206compensate\u4E3A\u8865\u507F\u8BF7\u6C42\u3001notify\u4E3A\u8865\u507F\u901A\u77E5\u3002 +#*\u6CE8\u610F\u5F53\u8BF7\u6C42\u8865\u507F\u51B3\u7B56\u65F6\uFF0C\u9700\u8981\u8865\u507F\u670D\u52A1\u8FD4\u56DE"SUCCESS"\u5B57\u7B26\u4E32\u4EE5\u540E\u624D\u53EF\u4EE5\u6267\u884C\u81EA\u52A8\u8865\u507F\u3002 +#\u8BF7\u6C42\u8865\u507F\u7ED3\u679C\u901A\u77E5\u5219\u53EA\u9700\u8981\u63A5\u53D7\u901A\u77E5\u5373\u53EF\u3002 +#\u8BF7\u6C42\u8865\u507F\u7684\u6837\u4F8B\u6570\u636E\u683C\u5F0F: #{"groupId":"TtQxTwJP","action":"compensate","json":"{\"address\":\"133.133.5.100:8081\",\"className\":\"com.example.demo.service.impl.DemoServiceImpl\",\"currentTime\":1511356150413,\"data\":\"C5IBLWNvbS5leGFtcGxlLmRlbW8uc2VydmljZS5pbXBsLkRlbW9TZXJ2aWNlSW1wbAwSBHNhdmUbehBqYXZhLmxhbmcuT2JqZWN0GAAQARwjeg9qYXZhLmxhbmcuQ2xhc3MYABABJCo/cHVibGljIGludCBjb20uZXhhbXBsZS5kZW1vLnNlcnZpY2UuaW1wbC5EZW1vU2VydmljZUltcGwuc2F2ZSgp\",\"groupId\":\"TtQxTwJP\",\"methodStr\":\"public int com.example.demo.service.impl.DemoServiceImpl.save()\",\"model\":\"demo1\",\"state\":0,\"time\":36,\"txGroup\":{\"groupId\":\"TtQxTwJP\",\"hasOver\":1,\"isCompensate\":0,\"list\":[{\"address\":\"133.133.5.100:8899\",\"isCompensate\":0,\"isGroup\":0,\"kid\":\"wnlEJoSl\",\"methodStr\":\"public int com.example.demo.service.impl.DemoServiceImpl.save()\",\"model\":\"demo2\",\"modelIpAddress\":\"133.133.5.100:8082\",\"channelAddress\":\"/133.133.5.100:64153\",\"notify\":1,\"uniqueKey\":\"bc13881a5d2ab2ace89ae5d34d608447\"}],\"nowTime\":0,\"startTime\":1511356150379,\"state\":1},\"uniqueKey\":\"be6eea31e382f1f0878d07cef319e4d7\"}"} -#请求补偿的返回数据样例数据格式: +#\u8BF7\u6C42\u8865\u507F\u7684\u8FD4\u56DE\u6570\u636E\u6837\u4F8B\u6570\u636E\u683C\u5F0F: #SUCCESS -#请求补偿结果通知的样例数据格式: +#\u8BF7\u6C42\u8865\u507F\u7ED3\u679C\u901A\u77E5\u7684\u6837\u4F8B\u6570\u636E\u683C\u5F0F: #{"resState":true,"groupId":"TtQxTwJP","action":"notify"} -tm.compensate.notifyUrl=http://ip:port/path +tm.compensate.notifyUrl=http://yizhishang:8081/demo/notifyResult -#补偿失败,再次尝试间隔(秒),最大尝试次数3次,当超过3次即为补偿失败,失败的数据依旧还会存在TxManager下。 +#\u8865\u507F\u5931\u8D25\uFF0C\u518D\u6B21\u5C1D\u8BD5\u95F4\u9694\uFF08\u79D2\uFF09\uFF0C\u6700\u5927\u5C1D\u8BD5\u6B21\u65703\u6B21\uFF0C\u5F53\u8D85\u8FC73\u6B21\u5373\u4E3A\u8865\u507F\u5931\u8D25,\u5931\u8D25\u7684\u6570\u636E\u4F9D\u65E7\u8FD8\u4F1A\u5B58\u5728TxManager\u4E0B\u3002 tm.compensate.tryTime=30 -#各事务模块自动补偿的时间上限(毫秒) -#指的是模块执行自动超时的最大时间,该最大时间若过段会导致事务机制异常,该时间必须要模块之间通讯的最大超过时间。 -#例如,若模块A与模块B,请求超时的最大时间是5秒,则建议改时间至少大于5秒。 +#\u5404\u4E8B\u52A1\u6A21\u5757\u81EA\u52A8\u8865\u507F\u7684\u65F6\u95F4\u4E0A\u9650(\u6BEB\u79D2) +#\u6307\u7684\u662F\u6A21\u5757\u6267\u884C\u81EA\u52A8\u8D85\u65F6\u7684\u6700\u5927\u65F6\u95F4\uFF0C\u8BE5\u6700\u5927\u65F6\u95F4\u82E5\u8FC7\u6BB5\u4F1A\u5BFC\u81F4\u4E8B\u52A1\u673A\u5236\u5F02\u5E38\uFF0C\u8BE5\u65F6\u95F4\u5FC5\u987B\u8981\u6A21\u5757\u4E4B\u95F4\u901A\u8BAF\u7684\u6700\u5927\u8D85\u8FC7\u65F6\u95F4\u3002 +#\u4F8B\u5982\uFF0C\u82E5\u6A21\u5757A\u4E0E\u6A21\u5757B\uFF0C\u8BF7\u6C42\u8D85\u65F6\u7684\u6700\u5927\u65F6\u95F4\u662F5\u79D2\uFF0C\u5219\u5EFA\u8BAE\u6539\u65F6\u95F4\u81F3\u5C11\u5927\u4E8E5\u79D2\u3002 tm.compensate.maxWaitTime=5000 #######################################LCN-end################################################# diff --git a/tx-manager/src/main/resources/banner.txt b/tx-manager/src/main/resources/banner.txt index 879248ac5..c4b440e01 100644 --- a/tx-manager/src/main/resources/banner.txt +++ b/tx-manager/src/main/resources/banner.txt @@ -7,7 +7,7 @@ >=> >=> >=> >=> >>=> >=======> >===> >=> >=> - LCN-TxManager version:4.1.0 + LCN-TxManager version:4.2.0 diff --git a/tx-manager/src/main/resources/static/index.html b/tx-manager/src/main/resources/static/index.html index 4e8e32149..baa9c2d89 100644 --- a/tx-manager/src/main/resources/static/index.html +++ b/tx-manager/src/main/resources/static/index.html @@ -1,8 +1,8 @@ - + - TxManager v4.1.0 + TxManager v4.2.0 @@ -24,7 +24,7 @@
-

TxManagerV4.1.0 服务已启动

+

TxManagerV4.2.0 服务已启动

diff --git a/tx-plugins-db/pom.xml b/tx-plugins-db/pom.xml index 836925d8e..51c8bd738 100644 --- a/tx-plugins-db/pom.xml +++ b/tx-plugins-db/pom.xml @@ -6,12 +6,10 @@ com.codingapi tx-lcn - 4.2.0-SNAPSHOT + 4.2.0 - com.codingapitx-plugins-db - ${lcn.last.version}tx-plugins-dbhttps://github.com/codingapi/tx-lcn @@ -37,5 +35,4 @@ - diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/LCNDBConnection.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/LCNDBConnection.java index 6a7f231b2..b73469bb8 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/LCNDBConnection.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/LCNDBConnection.java @@ -22,7 +22,6 @@ /** * create by lorne on 2017/7/29 */ - public class LCNDBConnection extends AbstractTransactionThread implements LCNConnection { @@ -88,6 +87,7 @@ public void rollback() throws SQLException { isClose.set(true); } + @Override protected void closeConnection() throws SQLException { runnable.close(this); connection.close(); @@ -138,6 +138,7 @@ protected void rollbackConnection() throws SQLException { connection.rollback(); } + @Override public void transaction() throws SQLException { if (waitTask == null) { rollbackConnection(); @@ -152,7 +153,7 @@ public void transaction() throws SQLException { timer.schedule(new TimerTask() { @Override public void run() { - System.out.println("auto execute ,groupId:" + getGroupId()); + logger.info("auto execute ,groupId:" + getGroupId()); dataSourceService.schedule(getGroupId(), waitTask); } }, maxOutTime); @@ -186,10 +187,12 @@ public void run() { } + @Override public String getGroupId() { return groupId; } + @Override public TxTask getWaitTask() { return waitTask; } diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/LCNStartConnection.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/LCNStartConnection.java index 536cb5b29..c3408bf5f 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/LCNStartConnection.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/LCNStartConnection.java @@ -44,8 +44,6 @@ public LCNStartConnection(Connection connection, ICallClose subNow this.connection = connection; this.subNowCount = subNowCount; - - if(TxCompensateLocal.current()!=null){ isCompensate = true; logger.info("transaction is compensate-connection."); @@ -140,6 +138,7 @@ protected void rollbackConnection() throws SQLException { connection.rollback(); } + @Override public void transaction()throws SQLException{ if (waitTask == null) { rollbackConnection(); @@ -184,6 +183,7 @@ public void transaction()throws SQLException{ } + @Override protected void closeConnection() throws SQLException{ subNowCount.close(this); diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/ColumnInfo.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/ColumnInfo.java index 06f8fd42a..8b5e66eb7 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/ColumnInfo.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/ColumnInfo.java @@ -4,7 +4,6 @@ * [类描述] * * @author caican - * @date 17/12/23 */ public class ColumnInfo { private String tableName; diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/ITxcStatement.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/ITxcStatement.java index 0fa72f2d1..8e4f96b33 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/ITxcStatement.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/ITxcStatement.java @@ -6,7 +6,6 @@ * [类描述] * * @author caican - * @date 17/12/4 */ public interface ITxcStatement extends Statement { /** 返回执行的SQL diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/IndexInfo.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/IndexInfo.java index 2822dae85..036767a41 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/IndexInfo.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/IndexInfo.java @@ -4,7 +4,6 @@ * [类描述] * * @author caican - * @date 17/12/23 */ public class IndexInfo { } diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TableMetaInfo.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TableMetaInfo.java index 731b71c0f..ae68d640d 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TableMetaInfo.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TableMetaInfo.java @@ -7,7 +7,6 @@ * [表描述] * * @author caican - * @date 17/12/23 */ public class TableMetaInfo { /** @@ -32,10 +31,6 @@ public class TableMetaInfo { public TableMetaInfo() { } - /** - * @param name - * @return - */ public ColumnInfo getColumnByName(String name) { String str = name.toUpperCase(); ColumnInfo ret = this.columnInfoMap.get(str); diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TableMetaUtils.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TableMetaUtils.java index c82e13866..dde523efd 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TableMetaUtils.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TableMetaUtils.java @@ -17,7 +17,6 @@ * [类描述] * * @author caican - * @date 17/12/23 */ public class TableMetaUtils { diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcPreparedStatement.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcPreparedStatement.java index 9e20512ce..780a460dc 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcPreparedStatement.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcPreparedStatement.java @@ -32,8 +32,6 @@ * [类描述] * * @author caican - * @date 17/11/28 - * @title [confluence页面的title] */ public class TxcPreparedStatement extends TxcStatement implements PreparedStatement { diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcRuntimeContextService.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcRuntimeContextService.java index 822ee6683..65b36193f 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcRuntimeContextService.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcRuntimeContextService.java @@ -5,7 +5,6 @@ /** * @author jsy. - * 17/12/7. */ public interface TxcRuntimeContextService { diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcSqlExecutor.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcSqlExecutor.java index 97bcd4067..5d5f95149 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcSqlExecutor.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcSqlExecutor.java @@ -13,8 +13,6 @@ /** * @author jsy. - * @title - * @time 17/12/26. */ public class TxcSqlExecutor { diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcStatement.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcStatement.java index c9c961880..2e0829730 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcStatement.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcStatement.java @@ -15,8 +15,6 @@ * [类描述] * * @author caican - * @date 17/11/28 - * @title [confluence页面的title] */ public class TxcStatement implements ITxcStatement { diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/AbstractParser.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/AbstractParser.java index ad554d033..986af3b9d 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/AbstractParser.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/AbstractParser.java @@ -14,8 +14,6 @@ /** * @author jsy. - * @title - * @time 17/12/11. */ public abstract class AbstractParser{ diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/DeleteParser.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/DeleteParser.java index 9dcdb1a2e..1afbb2506 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/DeleteParser.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/DeleteParser.java @@ -8,8 +8,6 @@ /** * @author jsy. - * @title - * @time 17/12/22. */ public class DeleteParser extends AbstractParser { private static DeleteParser instance = null; diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/ExecutePaser.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/ExecutePaser.java index fca522e22..8a2729b3e 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/ExecutePaser.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/ExecutePaser.java @@ -20,8 +20,6 @@ * [类描述] * * @author caican - * @date 17/11/28 - * @title [confluence页面的title] */ public class ExecutePaser { diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/InsertParser.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/InsertParser.java index 734521bed..ac0bc5fcd 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/InsertParser.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/InsertParser.java @@ -10,8 +10,6 @@ /** * @author jsy. - * @title - * @time 17/12/22. */ public class InsertParser extends AbstractParser{ diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/ResultConvertUtils.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/ResultConvertUtils.java index a97d8adee..6b61481ff 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/ResultConvertUtils.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/ResultConvertUtils.java @@ -11,8 +11,6 @@ /** * @author jsy. - * @title - * @time 17/12/26. */ public class ResultConvertUtils { diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/SqlUtils.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/SqlUtils.java index 9f53384c4..18da1c3a5 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/SqlUtils.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/SqlUtils.java @@ -5,8 +5,6 @@ /** * @author jsy. - * @title - * @time 17/12/15. */ public class SqlUtils { diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/UpdateParser.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/UpdateParser.java index 0bba4a28f..217de50b6 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/UpdateParser.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/UpdateParser.java @@ -13,8 +13,6 @@ /** * @author jsy. - * @title - * @time 17/12/11. */ public class UpdateParser extends AbstractParser { private static final Logger logger = LoggerFactory.getLogger(UpdateParser.class); diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/AbstractRollback.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/AbstractRollback.java index 974c9a8bd..cce3ebc18 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/AbstractRollback.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/AbstractRollback.java @@ -11,8 +11,6 @@ /** * @author jsy. - * @title - * @time 17/12/26. */ public abstract class AbstractRollback { private Logger logger = LoggerFactory.getLogger(AbstractRollback.class); diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/DeleteRollback.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/DeleteRollback.java index 2a7f63251..f421c1797 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/DeleteRollback.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/DeleteRollback.java @@ -15,8 +15,6 @@ /** * @author jsy. - * @title - * @time 17/12/26. */ public class DeleteRollback extends AbstractRollback { diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/DiffUtils.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/DiffUtils.java index 7a93961bc..9b5bc94dd 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/DiffUtils.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/DiffUtils.java @@ -16,8 +16,6 @@ /** * @author jsy. - * @title - * @time 17/12/14. */ public class DiffUtils { diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/InsertRollback.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/InsertRollback.java index c222d2fd6..332626235 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/InsertRollback.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/InsertRollback.java @@ -15,8 +15,6 @@ /** * @author jsy. - * @title - * @time 17/12/25. */ public class InsertRollback extends AbstractRollback{ diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackDataSource.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackDataSource.java index cb1c4accf..09b910fdb 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackDataSource.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackDataSource.java @@ -10,8 +10,6 @@ /** * @author jsy. - * @title - * @time 17/12/26. */ @Component public class TxcRollbackDataSource { diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackService.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackService.java index d4a30480d..19ec2793a 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackService.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackService.java @@ -5,8 +5,6 @@ /** * @author jsy. - * @title - * @time 17/12/22. */ public interface TxcRollbackService { diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackServiceImpl.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackServiceImpl.java index e2f651e13..bae64aa7b 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackServiceImpl.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackServiceImpl.java @@ -12,8 +12,6 @@ /** * @author jsy. - * @title - * @time 17/12/22. */ @Component public class TxcRollbackServiceImpl implements TxcRollbackService { diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/UpdateRollback.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/UpdateRollback.java index 8dab1a16c..5785ff892 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/UpdateRollback.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/UpdateRollback.java @@ -19,8 +19,6 @@ /** * @author jsy. - * @title - * @time 17/12/14. */ public class UpdateRollback extends AbstractRollback{