From ed2956dd36e4bbb5a402d3c3f443d05890e8c16f Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Wed, 28 Nov 2018 17:27:27 +0800 Subject: [PATCH 01/71] springcloud2.0.4 --- pom.xml | 24 ++---- transaction-springcloud/pom.xml | 44 ++++++++--- .../springcloud/listener/ServerListener.java | 11 +-- tx-client/pom.xml | 2 +- .../main/java/com/codingapi/tx/Constants.java | 3 - tx-manager/pom.xml | 6 +- .../src/main/resources/application.properties | 78 +++++++++---------- tx-plugins-db/pom.xml | 1 - .../datasource/relational/txc/ColumnInfo.java | 1 - .../relational/txc/ITxcStatement.java | 1 - .../datasource/relational/txc/IndexInfo.java | 1 - .../relational/txc/TableMetaInfo.java | 5 -- .../relational/txc/TableMetaUtils.java | 1 - .../relational/txc/TxcPreparedStatement.java | 2 - .../txc/TxcRuntimeContextService.java | 1 - .../relational/txc/TxcSqlExecutor.java | 2 - .../relational/txc/TxcStatement.java | 2 - .../relational/txc/parser/AbstractParser.java | 2 - .../relational/txc/parser/DeleteParser.java | 2 - .../relational/txc/parser/ExecutePaser.java | 2 - .../relational/txc/parser/InsertParser.java | 2 - .../txc/parser/ResultConvertUtils.java | 2 - .../relational/txc/parser/SqlUtils.java | 2 - .../relational/txc/parser/UpdateParser.java | 2 - .../txc/rollback/AbstractRollback.java | 2 - .../txc/rollback/DeleteRollback.java | 2 - .../relational/txc/rollback/DiffUtils.java | 2 - .../txc/rollback/InsertRollback.java | 2 - .../txc/rollback/TxcRollbackDataSource.java | 2 - .../txc/rollback/TxcRollbackService.java | 2 - .../txc/rollback/TxcRollbackServiceImpl.java | 2 - .../txc/rollback/UpdateRollback.java | 2 - 32 files changed, 86 insertions(+), 129 deletions(-) diff --git a/pom.xml b/pom.xml index 840e7f088..b98bce26b 100644 --- a/pom.xml +++ b/pom.xml @@ -16,9 +16,9 @@ tx-client tx-manager - transaction-dubbo + transaction-springcloud - transaction-motan + tx-plugins-db @@ -27,9 +27,9 @@ yyyyMMddHHmmss UTF-8 UTF-8 - 1.7 - 1.7 - 1.7 + 1.8 + 1.8 + 1.8 3.6.0 4.2.0-SNAPSHOT @@ -61,20 +61,6 @@ 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/ - - - - - diff --git a/transaction-springcloud/pom.xml b/transaction-springcloud/pom.xml index d5f04dcfe..c3c8eff3d 100644 --- a/transaction-springcloud/pom.xml +++ b/transaction-springcloud/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 @@ -9,7 +10,6 @@ 4.2.0-SNAPSHOT - com.codingapi transaction-springcloud ${lcn.last.version} @@ -20,8 +20,8 @@ transaction-springcloud project for Spring Boot - 1.3.2.RELEASE - 4.3.7.RELEASE + 2.0.4.RELEASE + 5.0.8.RELEASE @@ -35,14 +35,8 @@ org.springframework.cloud - spring-cloud-starter-feign - ${spring-cloud.version} - - - com.google.guava - guava - - + spring-cloud-starter-openfeign + 2.0.0.RELEASE @@ -51,6 +45,32 @@ ${org.springframework-version} + + com.netflix.ribbon + ribbon-core + 2.2.5 + + + org.springframework + 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/springcloud/listener/ServerListener.java b/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/listener/ServerListener.java index c6dab85f1..9b542ae19 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,13 +4,14 @@ 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.boot.context.embedded.EmbeddedServletContainerInitializedEvent; +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); @@ -20,9 +21,9 @@ public class ServerListener implements ApplicationListener onApplicationEvent. "+event.getEmbeddedServletContainer()); - this.serverPort = event.getEmbeddedServletContainer().getPort(); + public void onApplicationEvent(WebServerInitializedEvent event) { + logger.info("onApplicationEvent -> onApplicationEvent. "+event.getWebServer()); + this.serverPort = event.getWebServer().getPort(); Thread thread = new Thread(new Runnable() { @Override diff --git a/tx-client/pom.xml b/tx-client/pom.xml index 7f206d268..8c918e8c2 100644 --- a/tx-client/pom.xml +++ b/tx-client/pom.xml @@ -20,7 +20,7 @@ - 4.3.7.RELEASE + 5.0.8.RELEASE 19.0 4.0.38 1.1.3 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-manager/pom.xml b/tx-manager/pom.xml index a0c5f052a..2c611bac6 100644 --- a/tx-manager/pom.xml +++ b/tx-manager/pom.xml @@ -21,9 +21,9 @@ UTF-8 UTF-8 - 1.7 - 1.7 - 1.7 + 1.8 + 1.8 + 1.8 19.0 Dalston.SR1 diff --git a/tx-manager/src/main/resources/application.properties b/tx-manager/src/main/resources/application.properties index b12f29015..991c354c4 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,29 +11,29 @@ 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.commandTimeout=5000 -##redis 单点环境配置 +##redis \u5355\u70B9\u73AF\u5883\u914D\u7F6E #redis -#redis主机地址 -spring.redis.host=172.26.8.150 -#redis主机端口 +#redis\u4E3B\u673A\u5730\u5740 +spring.redis.host=localhost +#redis\u4E3B\u673A\u7AEF\u53E3 spring.redis.port=6379 -#redis链接密码 +#redis\u94FE\u63A5\u5BC6\u7801 spring.redis.password= spring.redis.pool.maxActive=10 spring.redis.pool.maxWait=-1 @@ -46,51 +46,51 @@ spring.redis.timeout=0 #######################################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 -#补偿失败,再次尝试间隔(秒),最大尝试次数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-plugins-db/pom.xml b/tx-plugins-db/pom.xml index 836925d8e..a0d1612ef 100644 --- a/tx-plugins-db/pom.xml +++ b/tx-plugins-db/pom.xml @@ -9,7 +9,6 @@ 4.2.0-SNAPSHOT - com.codingapi tx-plugins-db ${lcn.last.version} 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{ From a92e2db07a79dab83935898a3910d69686c07ad6 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Wed, 28 Nov 2018 18:05:30 +0800 Subject: [PATCH 02/71] =?UTF-8?q?=E4=BF=AE=E6=94=B9tx-manager=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tx-manager/.gitignore | 23 -- tx-manager/.mvn/wrapper/maven-wrapper.jar | Bin 47610 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 - tx-manager/mvnw | 225 ------------------ tx-manager/mvnw.cmd | 143 ----------- tx-manager/src/main/resources/banner.txt | 2 +- 6 files changed, 1 insertion(+), 393 deletions(-) delete mode 100644 tx-manager/.gitignore delete mode 100644 tx-manager/.mvn/wrapper/maven-wrapper.jar delete mode 100644 tx-manager/.mvn/wrapper/maven-wrapper.properties delete mode 100644 tx-manager/mvnw delete mode 100644 tx-manager/mvnw.cmd 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 9cc84ea9b4d95453115d0c26488d6a78694e0bc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47610 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 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/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 From a974dbb30af70087fb437204564878d019218d7b Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Wed, 28 Nov 2018 18:24:51 +0800 Subject: [PATCH 03/71] =?UTF-8?q?=E4=BF=AE=E6=94=B9tx-manager=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tx-manager/pom.xml | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/tx-manager/pom.xml b/tx-manager/pom.xml index 2c611bac6..50e11798b 100644 --- a/tx-manager/pom.xml +++ b/tx-manager/pom.xml @@ -29,9 +29,20 @@ Dalston.SR1 true true - + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + @@ -75,7 +86,6 @@ spring-boot-starter-web - org.springframework.boot spring-boot-starter-redis @@ -90,19 +100,6 @@ - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - - From 05f36bef0c760ef6a8fe4b5dd80a36be3558d24b Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Wed, 28 Nov 2018 18:26:14 +0800 Subject: [PATCH 04/71] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E6=96=87=E4=BB=B6=EF=BC=9Adubbo=E5=92=8Cmotan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- transaction-dubbo/.gitignore | 19 ---- transaction-dubbo/README.md | 3 - transaction-dubbo/pom.xml | 57 ----------- .../ConsistentHashLoadBalanceProxy.java | 22 ----- .../tx/dubbo/balance/LCNBalanceProxy.java | 88 ----------------- .../balance/LeastActiveLoadBalanceProxy.java | 22 ----- .../dubbo/balance/RandomLoadBalanceProxy.java | 21 ---- .../balance/RoundRobinLoadBalanceProxy.java | 21 ---- .../tx/dubbo/filter/TransactionFilter.java | 34 ------- .../dubbo/interceptor/TransactionAspect.java | 53 ---------- .../interceptor/TxManagerInterceptor.java | 33 ------- .../listener/TransactionSocketListener.java | 34 ------- .../service/impl/ModelNameServiceImpl.java | 99 ------------------- .../dubbo/com.alibaba.dubbo.rpc.Filter | 1 - .../com.alibaba.dubbo.rpc.cluster.LoadBalance | 4 - .../src/main/resources/banner.txt | 13 --- transaction-motan/pom.xml | 62 ------------ .../balance/ActiveWeightLoadBalanceProxy.java | 34 ------- .../ConfigurableWeightLoadBalanceProxy.java | 34 ------- .../ConsistentHashLoadBalanceProxy.java | 34 ------- .../tx/motan/balance/LCNBalanceProxy.java | 88 ----------------- .../balance/LocalFirstLoadBalanceProxy.java | 34 ------- .../motan/balance/RandomLoadBalanceProxy.java | 34 ------- .../balance/RoundRobinLoadBalanceProxy.java | 34 ------- .../tx/motan/filter/TransactionFilter.java | 55 ----------- .../motan/interceptor/TransactionAspect.java | 51 ---------- .../interceptor/TxManagerInterceptor.java | 34 ------- .../listener/TransactionSocketListener.java | 34 ------- .../service/impl/ModelNameServiceImpl.java | 72 -------------- .../com.weibo.api.motan.cluster.LoadBalance | 6 -- .../com.weibo.api.motan.filter.Filter | 1 - .../src/main/resources/banner.txt | 13 --- 32 files changed, 1144 deletions(-) delete mode 100644 transaction-dubbo/.gitignore delete mode 100644 transaction-dubbo/README.md delete mode 100644 transaction-dubbo/pom.xml delete mode 100644 transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/ConsistentHashLoadBalanceProxy.java delete mode 100644 transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/LCNBalanceProxy.java delete mode 100644 transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/LeastActiveLoadBalanceProxy.java delete mode 100644 transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/RandomLoadBalanceProxy.java delete mode 100644 transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/balance/RoundRobinLoadBalanceProxy.java delete mode 100644 transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/filter/TransactionFilter.java delete mode 100644 transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/interceptor/TransactionAspect.java delete mode 100644 transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/interceptor/TxManagerInterceptor.java delete mode 100644 transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/listener/TransactionSocketListener.java delete mode 100644 transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/service/impl/ModelNameServiceImpl.java delete mode 100644 transaction-dubbo/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter delete mode 100644 transaction-dubbo/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance delete mode 100644 transaction-dubbo/src/main/resources/banner.txt delete mode 100644 transaction-motan/pom.xml delete mode 100644 transaction-motan/src/main/java/com/codingapi/tx/motan/balance/ActiveWeightLoadBalanceProxy.java delete mode 100644 transaction-motan/src/main/java/com/codingapi/tx/motan/balance/ConfigurableWeightLoadBalanceProxy.java delete mode 100644 transaction-motan/src/main/java/com/codingapi/tx/motan/balance/ConsistentHashLoadBalanceProxy.java delete mode 100644 transaction-motan/src/main/java/com/codingapi/tx/motan/balance/LCNBalanceProxy.java delete mode 100644 transaction-motan/src/main/java/com/codingapi/tx/motan/balance/LocalFirstLoadBalanceProxy.java delete mode 100644 transaction-motan/src/main/java/com/codingapi/tx/motan/balance/RandomLoadBalanceProxy.java delete mode 100644 transaction-motan/src/main/java/com/codingapi/tx/motan/balance/RoundRobinLoadBalanceProxy.java delete mode 100644 transaction-motan/src/main/java/com/codingapi/tx/motan/filter/TransactionFilter.java delete mode 100644 transaction-motan/src/main/java/com/codingapi/tx/motan/interceptor/TransactionAspect.java delete mode 100644 transaction-motan/src/main/java/com/codingapi/tx/motan/interceptor/TxManagerInterceptor.java delete mode 100644 transaction-motan/src/main/java/com/codingapi/tx/motan/listener/TransactionSocketListener.java delete mode 100644 transaction-motan/src/main/java/com/codingapi/tx/motan/service/impl/ModelNameServiceImpl.java delete mode 100644 transaction-motan/src/main/resources/META-INF/services/com.weibo.api.motan.cluster.LoadBalance delete mode 100644 transaction-motan/src/main/resources/META-INF/services/com.weibo.api.motan.filter.Filter delete mode 100644 transaction-motan/src/main/resources/banner.txt 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 - - - From 48c605f0716d3875050b2effbf82fc7b9ee3e7c4 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Wed, 28 Nov 2018 18:28:25 +0800 Subject: [PATCH 05/71] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E6=96=87=E4=BB=B6=EF=BC=9Adubbo=E5=92=8Cmotan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/codingapi/tm/TxManagerApplication.java | 2 -- 1 file changed, 2 deletions(-) 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..e61237911 100644 --- a/tx-manager/src/main/java/com/codingapi/tm/TxManagerApplication.java +++ b/tx-manager/src/main/java/com/codingapi/tm/TxManagerApplication.java @@ -9,8 +9,6 @@ @EnableDiscoveryClient public class TxManagerApplication { - - public static void main(String[] args) { SpringApplication.run(TxManagerApplication.class, args); } From b6dc20e7b0bc8e34cd36875b8bc5b87fc123f21f Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Wed, 28 Nov 2018 20:16:00 +0800 Subject: [PATCH 06/71] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E6=96=87=E4=BB=B6=EF=BC=9Adubbo=E5=92=8Cmotan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- transaction-springcloud/.gitignore | 19 ------------------- tx-client/.editorconfig | 9 --------- tx-client/.gitignore | 19 ------------------- 3 files changed, 47 deletions(-) delete mode 100644 transaction-springcloud/.gitignore delete mode 100644 tx-client/.editorconfig delete mode 100644 tx-client/.gitignore 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/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 From 04bfa6c820e1645a12bf3c8c835b44520a1f97bd Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Wed, 28 Nov 2018 20:20:50 +0800 Subject: [PATCH 07/71] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E6=96=87=E4=BB=B6=EF=BC=9Adubbo=E5=92=8Cmotan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 30 ---------------------- transaction-springcloud/pom.xml | 2 -- tx-manager/pom.xml | 26 ------------------- tx-manager/src/main/build/package.xml | 37 --------------------------- 4 files changed, 95 deletions(-) delete mode 100644 tx-manager/src/main/build/package.xml diff --git a/pom.xml b/pom.xml index b98bce26b..a641accdd 100644 --- a/pom.xml +++ b/pom.xml @@ -16,10 +16,7 @@ tx-client tx-manager - transaction-springcloud - - tx-plugins-db @@ -35,8 +32,6 @@ 4.2.0-SNAPSHOT
- - The Apache License, Version 2.0 @@ -54,13 +49,6 @@ - - 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} - - @@ -112,24 +100,6 @@ - - - - - - - - - - - - - - - - - - diff --git a/transaction-springcloud/pom.xml b/transaction-springcloud/pom.xml index c3c8eff3d..96e9c4ccc 100644 --- a/transaction-springcloud/pom.xml +++ b/transaction-springcloud/pom.xml @@ -13,7 +13,6 @@ transaction-springcloud ${lcn.last.version} - transaction-springcloud https://github.com/codingapi/tx-lcn @@ -24,7 +23,6 @@ 5.0.8.RELEASE - diff --git a/tx-manager/pom.xml b/tx-manager/pom.xml index 50e11798b..896c075b8 100644 --- a/tx-manager/pom.xml +++ b/tx-manager/pom.xml @@ -57,7 +57,6 @@ - io.netty netty-all @@ -76,11 +75,6 @@ - - - - - org.springframework.boot spring-boot-starter-web @@ -144,26 +138,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} - - - - From 604ec597f8c9d4a45ada6805696280f43f0ee0ce Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Wed, 28 Nov 2018 20:32:14 +0800 Subject: [PATCH 08/71] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E6=96=87=E4=BB=B6=EF=BC=9Adubbo=E5=92=8Cmotan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 17 ----------------- tx-client/pom.xml | 2 -- 2 files changed, 19 deletions(-) diff --git a/pom.xml b/pom.xml index a641accdd..93017f457 100644 --- a/pom.xml +++ b/pom.xml @@ -32,23 +32,6 @@ 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 - - - diff --git a/tx-client/pom.xml b/tx-client/pom.xml index 8c918e8c2..e82d12fee 100644 --- a/tx-client/pom.xml +++ b/tx-client/pom.xml @@ -18,7 +18,6 @@ tx-client project for Spring Boot - 5.0.8.RELEASE 19.0 @@ -28,7 +27,6 @@ 1.7.7 - From 3aeda5426e51c84fb11fb4b232e96551d6c0134a Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Thu, 29 Nov 2018 10:42:34 +0800 Subject: [PATCH 09/71] tx-manager/index.html --- tx-manager/src/main/resources/static/index.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 服务已启动

From fefb1c822d62caa8cd7e17bb8e01625a42d5474d Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Fri, 30 Nov 2018 09:37:46 +0800 Subject: [PATCH 10/71] tx-manager/index.html --- .../interceptor/TransactionAspect.java | 21 +++++++------ .../TransactionServerFactoryServiceImpl.java | 31 +++++++++---------- 2 files changed, 26 insertions(+), 26 deletions(-) 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/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..d6bf4bc10 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,6 +1,5 @@ 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; @@ -13,13 +12,13 @@ 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 { +public class TransactionServerFactoryServiceImpl implements TransactionServerFactoryService +{ private Logger logger = LoggerFactory.getLogger(TransactionServerFactoryServiceImpl.class); @@ -35,21 +34,19 @@ public class TransactionServerFactoryServiceImpl implements TransactionServerFac @Autowired private TransactionServer txRunningNoTransactionServer; - @Autowired - private NettyService nettyService; - @Autowired private ILCNTransactionControl transactionControl; - - public TransactionServer createTransactionServer(TxTransactionInfo info) throws Throwable { - + @Override + public TransactionServer createTransactionServer(TxTransactionInfo info) throws Throwable + { if (!SocketManager.getInstance().isNetState()) { logger.warn("tx-manager not connected."); return txDefaultTransactionServer; } - /*********分布式事务处理逻辑*开始***********/ + /*********分布式事务处理逻辑***********/ + logger.info("分布式事务处理逻辑...createTransactionServer"); /** 尽当Transaction注解不为空,其他都为空时。表示分布式事务开始启动 **/ if (info.getTransaction() != null && info.getTransaction().isStart() && info.getTxTransactionLocal() == null && StringUtils.isEmpty(info.getTxGroupId())) { @@ -62,18 +59,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.getTransaction().readOnly()) { return txRunningNoTransactionServer; - }else { + } else { return txRunningTransactionServer; } } @@ -83,7 +80,7 @@ public TransactionServer createTransactionServer(TxTransactionInfo info) throws } } /*********分布式事务处理逻辑*结束***********/ - + logger.debug("分布式事务处理逻辑*结束"); return txDefaultTransactionServer; } } From b4c6bd032141b4b8af61a27ad27b71bb41e004e8 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Fri, 30 Nov 2018 10:03:31 +0800 Subject: [PATCH 11/71] add two demo --- pom.xml | 2 + springcloud-lcn-demo/pom.xml | 123 ++++++++++++++++++ .../springcloud-mybatis-demo1/pom.xml | 52 ++++++++ .../example/demo/MybatisDemo1Application.java | 46 +++++++ .../com/example/demo/client/Demo2Client.java | 23 ++++ .../demo/client/Demo2ClientHystric.java | 24 ++++ .../demo/controller/DemoController.java | 36 +++++ .../java/com/example/demo/dao/TestMapper.java | 24 ++++ .../java/com/example/demo/entity/Test.java | 29 +++++ .../com/example/demo/service/DemoService.java | 16 +++ .../demo/service/impl/DemoServiceImpl.java | 50 +++++++ .../impl/TxManagerHttpRequestServiceImpl.java | 29 +++++ .../impl/TxManagerTxUrlServiceImpl.java | 22 ++++ .../src/main/resources/application.properties | 30 +++++ .../springcloud-mybatis-demo2/pom.xml | 54 ++++++++ .../example/demo/MybatisDemo2Application.java | 47 +++++++ .../demo/controller/DemoController.java | 36 +++++ .../java/com/example/demo/dao/TestMapper.java | 24 ++++ .../java/com/example/demo/entity/Test.java | 28 ++++ .../com/example/demo/service/DemoService.java | 16 +++ .../demo/service/impl/DemoServiceImpl.java | 37 ++++++ .../impl/TxManagerTxUrlServiceImpl.java | 22 ++++ .../src/main/resources/application.properties | 22 ++++ 23 files changed, 792 insertions(+) create mode 100644 springcloud-lcn-demo/pom.xml create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/pom.xml create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/MybatisDemo1Application.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/client/Demo2Client.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/client/Demo2ClientHystric.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/controller/DemoController.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/dao/TestMapper.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/entity/Test.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/DemoService.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/DemoServiceImpl.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerHttpRequestServiceImpl.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/resources/application.properties create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo2/pom.xml create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/MybatisDemo2Application.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/controller/DemoController.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/dao/TestMapper.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/entity/Test.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/DemoService.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/DemoServiceImpl.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/resources/application.properties diff --git a/pom.xml b/pom.xml index 93017f457..f2357a3f7 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,8 @@ transaction-springcloudtx-plugins-db + + springcloud-lcn-demo diff --git a/springcloud-lcn-demo/pom.xml b/springcloud-lcn-demo/pom.xml new file mode 100644 index 000000000..14984b730 --- /dev/null +++ b/springcloud-lcn-demo/pom.xml @@ -0,0 +1,123 @@ + + + 4.0.0 + + com.codingapi + springcloud-lcn-demo + 4.1.0 + pom + + springcloud-lcn-demo + + + springcloud-mybatis-demo1 + springcloud-mybatis-demo2 + + + + + org.springframework.boot + spring-boot-starter-parent + 2.0.4.RELEASE + + + + + UTF-8 + UTF-8 + + 1.7 + 1.7 + 1.7 + Finchley.RELEASE + + 4.2.0-SNAPSHOT + + + + + + + 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.cloud + spring-cloud-starter-openfeign + 2.0.0.RELEASE + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + 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..0a29dcada --- /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.1.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..f5d96476b --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/MybatisDemo1Application.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 +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..e1f6f3064 --- /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 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(); +} 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..c13a6f507 --- /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() { + 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..941745160 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/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-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..ecf199308 --- /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(); + +} 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..75d4ab433 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/DemoServiceImpl.java @@ -0,0 +1,50 @@ +package com.example.demo.service.impl; + +import com.codingapi.tx.annotation.TxTransaction; +import com.example.demo.client.Demo2Client; +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 TestMapper testMapper; + + private Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class); + + @Override + public List list() { + return testMapper.findAll(); + } + + @Override + @TxTransaction(isStart = true) + @Transactional + public int save() { + + int rs1 = testMapper.save("mybatis-hello-1"); + + int rs2 = demo2Client.save(); + + + + return rs1+rs2; + } +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerHttpRequestServiceImpl.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerHttpRequestServiceImpl.java new file mode 100644 index 000000000..004b86dd9 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerHttpRequestServiceImpl.java @@ -0,0 +1,29 @@ +package com.example.demo.service.impl; + +import com.codingapi.tx.netty.service.TxManagerHttpRequestService; +import com.lorne.core.framework.utils.http.HttpUtils; +import org.springframework.stereotype.Service; + +/** + * create by lorne on 2017/11/18 + */ + +@Service +public class TxManagerHttpRequestServiceImpl implements TxManagerHttpRequestService{ + + @Override + public String httpGet(String url) { + System.out.println("httpGet-start"); + String res = HttpUtils.get(url); + System.out.println("httpGet-end"); + return res; + } + + @Override + public String httpPost(String url, String params) { + System.out.println("httpPost-start"); + String res = HttpUtils.post(url,params); + System.out.println("httpPost-end"); + return res; + } +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java new file mode 100644 index 000000000..7332ff60f --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java @@ -0,0 +1,22 @@ +package com.example.demo.service.impl; + +import com.codingapi.tx.config.service.TxManagerTxUrlService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +/** + * create by lorne on 2017/11/18 + */ +@Service +public class TxManagerTxUrlServiceImpl implements TxManagerTxUrlService{ + + + @Value("${tm.manager.url}") + private String url; + + @Override + public String getTxUrl() { + System.out.println("load tm.manager.url "); + return url; + } +} 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..3f369a4ca --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/resources/application.properties @@ -0,0 +1,30 @@ +#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 +ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule +ribbon.MaxAutoRetriesNextServer=0 + +ribbon.eureka.enabled=true + +#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..2a53f7ccf --- /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.1.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..69a9c9747 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/MybatisDemo2Application.java @@ -0,0 +1,47 @@ +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 +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..941745160 --- /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(){ + return demoService.save(); + } +} 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..4a0148fc7 --- /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(NAME) VALUES(#{name})") + int save(@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..ecf199308 --- /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(); + +} 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..180697586 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo2/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; + +/** + * 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() { + + int rs = testMapper.save("mybatis-hello-2"); +// int v = 100/0; + return rs; + } +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java new file mode 100644 index 000000000..7332ff60f --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java @@ -0,0 +1,22 @@ +package com.example.demo.service.impl; + +import com.codingapi.tx.config.service.TxManagerTxUrlService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +/** + * create by lorne on 2017/11/18 + */ +@Service +public class TxManagerTxUrlServiceImpl implements TxManagerTxUrlService{ + + + @Value("${tm.manager.url}") + private String url; + + @Override + public String getTxUrl() { + System.out.println("load tm.manager.url "); + return url; + } +} 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..47a5e4cfc --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo2/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.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 +ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule +ribbon.MaxAutoRetriesNextServer=0 + +ribbon.eureka.enabled=true + +#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 From 42611b2044b2ab39f82593a7e7ce1f71ab714b95 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Fri, 30 Nov 2018 10:03:44 +0800 Subject: [PATCH 12/71] add two demo --- transaction-springcloud/src/main/resources/banner.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From a59fe9c8363c097bdcb4b94bbd2d012bd22d4216 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Fri, 30 Nov 2018 10:05:08 +0800 Subject: [PATCH 13/71] add two demo --- springcloud-lcn-demo/pom.xml | 2 +- springcloud-lcn-demo/springcloud-mybatis-demo1/pom.xml | 2 +- springcloud-lcn-demo/springcloud-mybatis-demo2/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/springcloud-lcn-demo/pom.xml b/springcloud-lcn-demo/pom.xml index 14984b730..2b7f475cd 100644 --- a/springcloud-lcn-demo/pom.xml +++ b/springcloud-lcn-demo/pom.xml @@ -5,7 +5,7 @@ com.codingapi springcloud-lcn-demo - 4.1.0 + 4.2.0 pom springcloud-lcn-demo diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/pom.xml b/springcloud-lcn-demo/springcloud-mybatis-demo1/pom.xml index 0a29dcada..db80dd3d1 100644 --- a/springcloud-lcn-demo/springcloud-mybatis-demo1/pom.xml +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/pom.xml @@ -14,7 +14,7 @@ com.codingapi springcloud-lcn-demo - 4.1.0 + 4.2.0 diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo2/pom.xml b/springcloud-lcn-demo/springcloud-mybatis-demo2/pom.xml index 2a53f7ccf..98724199f 100644 --- a/springcloud-lcn-demo/springcloud-mybatis-demo2/pom.xml +++ b/springcloud-lcn-demo/springcloud-mybatis-demo2/pom.xml @@ -14,7 +14,7 @@ com.codingapi springcloud-lcn-demo - 4.1.0 + 4.2.0 From 9110ded7ba6d8422bd1992d7a2aad0f1000518aa Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Fri, 30 Nov 2018 14:31:09 +0800 Subject: [PATCH 14/71] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/TxStartTransactionServerImpl.java | 7 ++-- .../impl/TxManagerSenderServiceImpl.java | 39 +++++++++---------- .../relational/LCNStartConnection.java | 4 +- 3 files changed, 24 insertions(+), 26 deletions(-) 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..655780c5b 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,7 @@ public class TxStartTransactionServerImpl implements TransactionServer { public Object execute(ProceedingJoinPoint point,final TxTransactionInfo info) throws Throwable { //分布式事务开始执行 - logger.debug("--->begin start transaction"); + logger.debug("--->分布式事务开始执行 begin start transaction"); final long start = System.currentTimeMillis(); @@ -46,7 +46,6 @@ public Object execute(ProceedingJoinPoint point,final TxTransactionInfo info) th //创建事务组 txManagerService.createTransactionGroup(groupId); - TxTransactionLocal txTransactionLocal = new TxTransactionLocal(); txTransactionLocal.setGroupId(groupId); txTransactionLocal.setHasStart(true); @@ -55,7 +54,6 @@ public Object execute(ProceedingJoinPoint point,final TxTransactionInfo info) th txTransactionLocal.setReadOnly(info.getTransaction().readOnly()); TxTransactionLocal.setCurrent(txTransactionLocal); - try { Object obj = point.proceed(); state = 1; @@ -102,6 +100,7 @@ public Object execute(ProceedingJoinPoint point,final TxTransactionInfo info) th long time = end - start; if ((executeConnectionError == 1&&rs == 1)||(lastState == 1 && rs == 0)) { //记录补偿日志 + logger.debug("记录补偿日志"); txManagerService.sendCompensateMsg(groupId, time, info,executeConnectionError); } }else{ @@ -113,7 +112,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")); } 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..846f13121 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 @@ -113,10 +113,8 @@ private void setChannel(List list) { * @param checkSate */ 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-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); From 67fc180e2eb542226a6fda1d6d0fe9c4489a7a34 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Fri, 30 Nov 2018 14:56:59 +0800 Subject: [PATCH 15/71] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aop/service/impl/TransactionServerFactoryServiceImpl.java | 2 +- .../tx/aop/service/impl/TxStartTransactionServerImpl.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) 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 d6bf4bc10..69db11c9f 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 @@ -48,7 +48,7 @@ public TransactionServer createTransactionServer(TxTransactionInfo info) throws /*********分布式事务处理逻辑***********/ logger.info("分布式事务处理逻辑...createTransactionServer"); - /** 尽当Transaction注解不为空,其他都为空时。表示分布式事务开始启动 **/ + /** 仅当Transaction注解不为空,其他都为空时。表示分布式事务开始启动 **/ if (info.getTransaction() != null && info.getTransaction().isStart() && info.getTxTransactionLocal() == null && StringUtils.isEmpty(info.getTxGroupId())) { //检查socket通讯是否正常 (当启动事务的主业务方法执行完以后,再执行其他业务方法时将进入txInServiceTransactionServer业务处理) if (SocketManager.getInstance().isNetState()) { 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 655780c5b..9c1a5f91b 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 @@ -44,6 +44,7 @@ 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(); From 52a986452ac366f0ac11ad0f5c21bae8bce2f67f Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 3 Dec 2018 09:09:54 +0800 Subject: [PATCH 16/71] format --- .../demo/service/impl/TxManagerTxUrlServiceImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java index 7332ff60f..83d1df328 100644 --- a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java @@ -8,14 +8,16 @@ * create by lorne on 2017/11/18 */ @Service -public class TxManagerTxUrlServiceImpl implements TxManagerTxUrlService{ +public class TxManagerTxUrlServiceImpl implements TxManagerTxUrlService +{ @Value("${tm.manager.url}") private String url; @Override - public String getTxUrl() { + public String getTxUrl() + { System.out.println("load tm.manager.url "); return url; } From ab67d577ef963b8d0c8edfe3ed030964e754a9e9 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 3 Dec 2018 09:15:36 +0800 Subject: [PATCH 17/71] format --- tx-client/pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/tx-client/pom.xml b/tx-client/pom.xml index e82d12fee..193a0dd33 100644 --- a/tx-client/pom.xml +++ b/tx-client/pom.xml @@ -75,8 +75,6 @@ ${org.slf4j-version} - - javax.servlet javax.servlet-api From 86fb974db0693bd6de9d4e60f5f5609156c8b457 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 3 Dec 2018 10:11:19 +0800 Subject: [PATCH 18/71] format --- .../tx/aop/service/impl/TxStartTransactionServerImpl.java | 1 - 1 file changed, 1 deletion(-) 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 9c1a5f91b..d8b39d852 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 @@ -100,7 +100,6 @@ 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); } From be0e64cf1bf546c9aeb7a78b0468b7190d1ea5cd Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 3 Dec 2018 15:10:31 +0800 Subject: [PATCH 19/71] add log for compensate --- .../codingapi/tm/compensate/dao/impl/CompensateDaoImpl.java | 4 ++++ .../tm/compensate/service/impl/CompensateServiceImpl.java | 1 + 2 files changed, 5 insertions(+) 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..ced09a7d9 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 { From 7ee69668d216746ec3cdaa5b638d19234cba7f2f Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 3 Dec 2018 15:11:18 +0800 Subject: [PATCH 20/71] =?UTF-8?q?=E4=BF=AE=E6=94=B9demo2=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=8F=82=E6=95=B0(id,=20name)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/client/Demo2Client.java | 10 +++++----- .../example/demo/client/Demo2ClientHystric.java | 2 +- .../example/demo/controller/DemoController.java | 16 ++++++++++++++-- .../com/example/demo/service/DemoService.java | 2 +- .../demo/service/impl/DemoServiceImpl.java | 10 ++++------ .../example/demo/controller/DemoController.java | 4 ++-- .../java/com/example/demo/dao/TestMapper.java | 4 ++-- .../com/example/demo/service/DemoService.java | 2 +- .../demo/service/impl/DemoServiceImpl.java | 9 +++------ 9 files changed, 33 insertions(+), 26 deletions(-) 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 index e1f6f3064..dae430696 100644 --- 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 @@ -4,20 +4,20 @@ 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) +@FeignClient(value = "demo2", fallback = Demo2ClientHystric.class) public interface Demo2Client { - - @RequestMapping(value = "/demo/list",method = RequestMethod.GET) + @RequestMapping(value = "/demo/list", method = RequestMethod.GET) List list(); - @RequestMapping(value = "/demo/save",method = RequestMethod.GET) - int save(); + @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 index c13a6f507..8e4796335 100644 --- 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 @@ -17,7 +17,7 @@ public List list() { } @Override - public int save() { + 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/controller/DemoController.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/controller/DemoController.java index 941745160..e0a25934d 100644 --- 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 @@ -1,9 +1,12 @@ package com.example.demo.controller; +import com.alibaba.druid.support.json.JSONUtils; +import com.codingapi.tx.compensate.model.CompensateInfo; 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.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; @@ -30,7 +33,16 @@ public List list(){ @RequestMapping("/save") @ResponseBody - public int save(){ - return demoService.save(); + public int save(String id, String name){ + return demoService.save(id, name); + } + + @GetMapping("notifyResult") + public String notifyResult(String jsonStr) + { + System.out.println("通知地址..."); + CompensateInfo compensateInfo = (CompensateInfo)JSONUtils.parse(jsonStr); + System.out.println(compensateInfo); + return null; } } 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 index ecf199308..979dccf67 100644 --- 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 @@ -11,6 +11,6 @@ public interface DemoService { List list(); - int save(); + 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 index 75d4ab433..06668b105 100644 --- 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 @@ -37,14 +37,12 @@ public List list() { @Override @TxTransaction(isStart = true) @Transactional - public int save() { + public int save(String id, String name) { - int rs1 = testMapper.save("mybatis-hello-1"); + testMapper.save("mybatis1"); - int rs2 = demo2Client.save(); + demo2Client.save(id, name); - - - return rs1+rs2; + return 2; } } 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 index 941745160..832188de9 100644 --- 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 @@ -30,7 +30,7 @@ public List list(){ @RequestMapping("/save") @ResponseBody - public int save(){ - return demoService.save(); + 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 index 4a0148fc7..648d9ac2f 100644 --- 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 @@ -18,7 +18,7 @@ public interface TestMapper { @Select("SELECT * FROM T_TEST") List findAll(); - @Insert("INSERT INTO T_TEST(NAME) VALUES(#{name})") - int save(@Param("name") String name); + @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/service/DemoService.java b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/DemoService.java index ecf199308..979dccf67 100644 --- 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 @@ -11,6 +11,6 @@ public interface DemoService { List list(); - int save(); + 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 index 180697586..deb941fdb 100644 --- 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 @@ -15,7 +15,7 @@ * Created by lorne on 2017/6/26. */ @Service -public class DemoServiceImpl implements DemoService ,ITxTransaction{ +public class DemoServiceImpl implements DemoService, ITxTransaction { @Autowired private TestMapper testMapper; @@ -28,10 +28,7 @@ public List list() { @Override @TxTransaction @Transactional - public int save() { - - int rs = testMapper.save("mybatis-hello-2"); -// int v = 100/0; - return rs; + public int save(String id, String name) { + return testMapper.save(id, name); } } From e1f83a9fa2995c98f42d6465b2e39670cf5bbadb Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 3 Dec 2018 15:30:55 +0800 Subject: [PATCH 21/71] add markdown for demo --- springcloud-lcn-demo/README.md | 44 ++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 springcloud-lcn-demo/README.md diff --git a/springcloud-lcn-demo/README.md b/springcloud-lcn-demo/README.md new file mode 100644 index 000000000..a4807a43a --- /dev/null +++ b/springcloud-lcn-demo/README.md @@ -0,0 +1,44 @@ +>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地址和Txmanager地址,其中eureka地址与Txmanager的eureka地址保持一致 +```properties +tm.manager.url=http://127.0.0.1:8899/tx/manager/ +eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/ +``` + +>3.实现TxManagerHttpRequestService和TxManagerTxUrlService,参考service下的实现 + +>4.事务参与方(事务发起方不需要)中的业务service要实现ITxTransaction接口 + +>5.事务发起方(事务参与方不需要)中的涉及分布式事务的方法要添加@TxTransaction(isStart = true)注解 + +>6.无论事务发起方还是事务参与方的业务方法都需要实现本地事务添加@Transactional注解 + +>7.txmanager启动前要配置redis + + +注意事项:避免事务发起方和调用方操作一张表的数据,会导致锁表 \ No newline at end of file From 02ecbad8023ebd72b930edc0716b204808bd03e4 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 3 Dec 2018 17:49:49 +0800 Subject: [PATCH 22/71] =?UTF-8?q?=E6=8F=90=E7=A4=BA=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- springcloud-lcn-demo/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/springcloud-lcn-demo/README.md b/springcloud-lcn-demo/README.md index a4807a43a..8331486df 100644 --- a/springcloud-lcn-demo/README.md +++ b/springcloud-lcn-demo/README.md @@ -38,7 +38,7 @@ eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/ >6.无论事务发起方还是事务参与方的业务方法都需要实现本地事务添加@Transactional注解 ->7.txmanager启动前要配置redis +>7.tx-manager启动前要配置redis 注意事项:避免事务发起方和调用方操作一张表的数据,会导致锁表 \ No newline at end of file From 166cd4686a0017758c6371bc237de59559f71e7a Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 3 Dec 2018 18:53:29 +0800 Subject: [PATCH 23/71] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- springcloud-lcn-demo/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/springcloud-lcn-demo/README.md b/springcloud-lcn-demo/README.md index 8331486df..dbf6113b5 100644 --- a/springcloud-lcn-demo/README.md +++ b/springcloud-lcn-demo/README.md @@ -36,7 +36,7 @@ eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/ >5.事务发起方(事务参与方不需要)中的涉及分布式事务的方法要添加@TxTransaction(isStart = true)注解 ->6.无论事务发起方还是事务参与方的业务方法都需要实现本地事务添加@Transactional注解 +>6.无论事务发起方还是事务参与方的业务方法都需要实现本地事务添加@Transactional注解和@TxTransaction注解 >7.tx-manager启动前要配置redis From 055c67d8e548a7a8f0809c109835ea49d68aec7b Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 3 Dec 2018 20:27:28 +0800 Subject: [PATCH 24/71] =?UTF-8?q?tx-manager=20=E5=8D=87=E7=BA=A7=E5=88=B02?= =?UTF-8?q?.0.4=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tx-manager/pom.xml | 14 ++++------- .../com/codingapi/tm/ServletInitializer.java | 2 +- .../codingapi/tm/TxManagerApplication.java | 5 ++-- .../tm/listener/ApplicationStartListener.java | 8 +++---- .../service/impl/MicroServiceImpl.java | 23 +++++++++++++++---- 5 files changed, 29 insertions(+), 23 deletions(-) diff --git a/tx-manager/pom.xml b/tx-manager/pom.xml index 896c075b8..a1ffc0a69 100644 --- a/tx-manager/pom.xml +++ b/tx-manager/pom.xml @@ -14,7 +14,7 @@ org.springframework.boot spring-boot-starter-parent - 1.5.4.RELEASE + 2.0.4.RELEASE @@ -26,7 +26,7 @@ 1.8 19.0 - Dalston.SR1 + Finchley.RELEASE true true @@ -65,16 +65,10 @@ org.springframework.cloud - spring-cloud-starter-eureka-server - - - com.google.guava - guava - - + spring-cloud-starter-netflix-eureka-client + 2.0.0.RELEASE - org.springframework.boot spring-boot-starter-web 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..466d28de7 100644 --- a/tx-manager/src/main/java/com/codingapi/tm/ServletInitializer.java +++ b/tx-manager/src/main/java/com/codingapi/tm/ServletInitializer.java @@ -1,7 +1,7 @@ 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. 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 e61237911..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,11 +2,10 @@ 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) { 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..8ccfbae75 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 @@ -9,7 +9,9 @@ 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; @@ -34,7 +36,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 +49,22 @@ private boolean isIp(String ipAddress) { return matcher.matches(); } - - @Override public TxState getState() { TxState state = new TxState(); - String ipAddress = discoveryClient.getLocalServiceInstance().getHost(); - if(!isIp(ipAddress)){ + List list = discoveryClient.getInstances(registration.getServiceId()); + String ipAddress; + if(CollectionUtils.isEmpty(list)) + { ipAddress = "127.0.0.1"; + }else{ + ServiceInstance serviceInstance = list.get(0); + ipAddress = serviceInstance.getHost(); + if(!isIp(ipAddress)){ + ipAddress = "127.0.0.1"; + } } + state.setIp(ipAddress); state.setPort(Constants.socketPort); state.setMaxConnection(SocketManager.getInstance().getMaxConnection()); From b404a29f6c29bebb945ab5be957733804d2293f2 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 3 Dec 2018 20:29:55 +0800 Subject: [PATCH 25/71] =?UTF-8?q?tx-manager=20=E5=8D=87=E7=BA=A7=E5=88=B02?= =?UTF-8?q?.0.4=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- springcloud-lcn-demo/pom.xml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/springcloud-lcn-demo/pom.xml b/springcloud-lcn-demo/pom.xml index 2b7f475cd..c4ef8f9bb 100644 --- a/springcloud-lcn-demo/pom.xml +++ b/springcloud-lcn-demo/pom.xml @@ -36,6 +36,18 @@ + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + @@ -87,18 +99,6 @@ - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - - From caecf11f02542682e8703b60395ea386ba08291c Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 3 Dec 2018 20:32:40 +0800 Subject: [PATCH 26/71] format --- .../src/main/java/com/codingapi/tm/ServletInitializer.java | 2 -- 1 file changed, 2 deletions(-) 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 466d28de7..dbf897b36 100644 --- a/tx-manager/src/main/java/com/codingapi/tm/ServletInitializer.java +++ b/tx-manager/src/main/java/com/codingapi/tm/ServletInitializer.java @@ -8,11 +8,9 @@ */ public class ServletInitializer extends SpringBootServletInitializer { - @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(TxManagerApplication.class); } - } From 02b2d8f7bb922667f775e86450a649503b87b2a1 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 3 Dec 2018 20:38:03 +0800 Subject: [PATCH 27/71] format --- README.md | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/README.md b/README.md index 8962f1404..f877211ee 100644 --- a/README.md +++ b/README.md @@ -30,12 +30,8 @@ ## 目录说明 -transaction-dubbo LCN dubbo rpc框架扩展支持 - transaction-springcloud LCN springcloud rpc框架扩展支持 -transaction-motan LCN motan rpc框架扩展支持 - tx-client 是LCN核心tx模块端控制框架 tx-manager 是LCN 分布式事务协调器 @@ -148,19 +144,8 @@ 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) From beda82f75a0273c252488c75be559fd064a245b6 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 3 Dec 2018 20:44:11 +0800 Subject: [PATCH 28/71] =?UTF-8?q?tx-manager=20=E5=8D=87=E7=BA=A7=E5=88=B02?= =?UTF-8?q?.0.4=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index f877211ee..343e003d0 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,4 @@ tx-plugins-db 是LCN 对关系型数据库的插件支持 ## demo演示教程 -每个demo下有区分为 jdbc/hibernate/mybatis不同框架的版本demo - [springcloud版本](https://github.com/yizhishang/tx-lcn/tree/springcloud-2.0.4/springcloud-lcn-demo) From 877da02788b65fddfe41fa69d0afbe551c6911b3 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Tue, 4 Dec 2018 09:05:17 +0800 Subject: [PATCH 29/71] =?UTF-8?q?=E6=B7=BB=E5=8A=A0RestTemplate=20?= =?UTF-8?q?=E6=8B=A6=E6=88=AA=E5=99=A8=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tx/RequestInterceptorConfiguration.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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; + } } From 14847efe0a51d3bcb2571a7cfe05a864edcb2dcf Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Tue, 4 Dec 2018 15:38:59 +0800 Subject: [PATCH 30/71] format --- tx-client/pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tx-client/pom.xml b/tx-client/pom.xml index 193a0dd33..0e53719b8 100644 --- a/tx-client/pom.xml +++ b/tx-client/pom.xml @@ -41,7 +41,6 @@ 4.1.12.Final - org.aspectj aspectjweaver @@ -53,7 +52,6 @@ 1.8.4 - org.slf4j slf4j-api @@ -81,14 +79,12 @@ 3.1.0 - org.springframework spring-context ${org.springframework-version} - com.caucho hessian From cbff588d06edea34c538a2c08ea1988b29c2ec9d Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Tue, 4 Dec 2018 15:43:28 +0800 Subject: [PATCH 31/71] =?UTF-8?q?=E8=B0=83=E6=95=B4pom=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- springcloud-lcn-demo/pom.xml | 6 ------ transaction-springcloud/pom.xml | 6 ------ tx-client/pom.xml | 6 ++++++ 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/springcloud-lcn-demo/pom.xml b/springcloud-lcn-demo/pom.xml index c4ef8f9bb..083465aa2 100644 --- a/springcloud-lcn-demo/pom.xml +++ b/springcloud-lcn-demo/pom.xml @@ -85,12 +85,6 @@ spring-boot-starter-web - - org.springframework.cloud - spring-cloud-starter-openfeign - 2.0.0.RELEASE - - org.springframework.boot spring-boot-starter-test diff --git a/transaction-springcloud/pom.xml b/transaction-springcloud/pom.xml index 96e9c4ccc..805515790 100644 --- a/transaction-springcloud/pom.xml +++ b/transaction-springcloud/pom.xml @@ -31,12 +31,6 @@ ${lcn.last.version} - - org.springframework.cloud - spring-cloud-starter-openfeign - 2.0.0.RELEASE - - org.springframework spring-context diff --git a/tx-client/pom.xml b/tx-client/pom.xml index 0e53719b8..e7cc44607 100644 --- a/tx-client/pom.xml +++ b/tx-client/pom.xml @@ -29,6 +29,12 @@ + + org.springframework.cloud + spring-cloud-starter-openfeign + 2.0.0.RELEASE + + com.github.1991wangliang lorne_core From da3b66c7f5805bb0be8a27348b440002ad474a4d Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Wed, 5 Dec 2018 16:56:27 +0800 Subject: [PATCH 32/71] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/example/demo/MybatisDemo1Application.java | 5 ++--- .../main/java/com/example/demo/MybatisDemo2Application.java | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) 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 index f5d96476b..1f00d833d 100644 --- 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 @@ -25,14 +25,13 @@ public static void main(String[] 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.setUsername(env.getProperty("spring.datasource.username")); + dataSource.setPassword(env.getProperty("spring.datasource.password")); dataSource.setInitialSize(10); dataSource.setMaxActive(50); dataSource.setMinIdle(0); 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 index 69a9c9747..192d798ab 100644 --- 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 @@ -12,7 +12,6 @@ import javax.sql.DataSource; - @Configuration @SpringBootApplication @EnableEurekaClient @@ -31,8 +30,8 @@ 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.setUsername(env.getProperty("spring.datasource.username")); + dataSource.setPassword(env.getProperty("spring.datasource.password")); dataSource.setInitialSize(2); dataSource.setMaxActive(20); dataSource.setMinIdle(0); From 62f653238634a68c7885f4585014821a664dcddb Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Wed, 5 Dec 2018 16:56:58 +0800 Subject: [PATCH 33/71] =?UTF-8?q?notifyResult=E8=AF=B7=E6=B1=82=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E4=BF=AE=E6=94=B9=E6=88=90post?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/demo/controller/DemoController.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) 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 index e0a25934d..34d59cbd5 100644 --- 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 @@ -6,10 +6,7 @@ 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.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -37,7 +34,7 @@ public int save(String id, String name){ return demoService.save(id, name); } - @GetMapping("notifyResult") + @PostMapping("notifyResult") public String notifyResult(String jsonStr) { System.out.println("通知地址..."); From a215cf829706e123d8b6cdf992fef10f13fa3962 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Wed, 5 Dec 2018 16:58:32 +0800 Subject: [PATCH 34/71] =?UTF-8?q?tx-manager=E6=B7=BB=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codingapi/tm/manager/service/impl/MicroServiceImpl.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 8ccfbae75..6c300fdb7 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,6 +6,8 @@ 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; @@ -25,6 +27,7 @@ @Service public class MicroServiceImpl implements MicroService { + private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private RestTemplate restTemplate; @@ -64,7 +67,7 @@ public TxState getState() { ipAddress = "127.0.0.1"; } } - + logger.info("ipAddress: {}, port: {}", ipAddress, Constants.socketPort); state.setIp(ipAddress); state.setPort(Constants.socketPort); state.setMaxConnection(SocketManager.getInstance().getMaxConnection()); From abd6f675b876ff96a6a8764284c7f10fed9073e8 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Wed, 5 Dec 2018 16:59:51 +0800 Subject: [PATCH 35/71] =?UTF-8?q?=E6=B7=BB=E5=8A=A0ribbon=E8=B6=85?= =?UTF-8?q?=E6=97=B6=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.properties | 2 ++ .../src/main/resources/application.properties | 2 ++ 2 files changed, 4 insertions(+) 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 index 3f369a4ca..a3f4ec419 100644 --- a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/resources/application.properties +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/resources/application.properties @@ -23,6 +23,8 @@ ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule 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/ 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 index 47a5e4cfc..43d3f1d03 100644 --- a/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/resources/application.properties +++ b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/resources/application.properties @@ -15,6 +15,8 @@ ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule 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/ From a3742be1690830de6e572d71cbed3cdd11c64d30 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Wed, 5 Dec 2018 17:00:24 +0800 Subject: [PATCH 36/71] =?UTF-8?q?tx-client=E5=BC=95=E5=85=A5ribbon=20?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tx-client/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tx-client/pom.xml b/tx-client/pom.xml index e7cc44607..f21b6b168 100644 --- a/tx-client/pom.xml +++ b/tx-client/pom.xml @@ -34,6 +34,11 @@ spring-cloud-starter-openfeign 2.0.0.RELEASE + + org.springframework.cloud + spring-cloud-starter-ribbon + 1.4.4.RELEASE + com.github.1991wangliang From dfdc70ba92c28aa1e702ee1ffb52c7950196e034 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Wed, 5 Dec 2018 17:02:29 +0800 Subject: [PATCH 37/71] =?UTF-8?q?=E4=B8=BA=E6=BB=A1=E8=B6=B3tx-manager?= =?UTF-8?q?=E9=9B=86=E7=BE=A4=EF=BC=9A=E4=BD=BF=E7=94=A8feign=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/service/impl/MQTxManagerFegin.java | 41 +++++++++++++ .../impl/MQTxManagerFeginServiceImpl.java | 59 +++++++++++++++++++ .../demo/service/impl/MQTxManagerFegin.java | 41 +++++++++++++ .../impl/MQTxManagerFeginServiceImpl.java | 59 +++++++++++++++++++ .../service/MQTxManagerFeginService.java | 38 ++++++++++++ .../service/impl/MQTxManagerServiceImpl.java | 17 ++++-- 6 files changed, 249 insertions(+), 6 deletions(-) create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java create mode 100644 tx-client/src/main/java/com/codingapi/tx/netty/service/MQTxManagerFeginService.java diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java new file mode 100644 index 000000000..783528da8 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java @@ -0,0 +1,41 @@ +package com.example.demo.service.impl; + +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/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java new file mode 100644 index 000000000..8397361f7 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java @@ -0,0 +1,59 @@ +package com.example.demo.service.impl; + +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 ApplicationContext spring; + + @Autowired + private MQTxManagerFegin mqTxManagerFegin; + + public void reloadMqTxManagerFegin() { +// if(mqTxManagerFegin == null){ +// this.mqTxManagerFegin = spring.getBean(MQTxManagerFegin.class); +// } + } + + /** + * 检查并清理事务数据 + * + * @param groupId 事务组id + * @param waitTaskId 任务id + * @return 事务状态 + */ + @Override + public String cleanNotifyTransactionHttp(String groupId, String waitTaskId) { + reloadMqTxManagerFegin(); + 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) { + reloadMqTxManagerFegin(); + return mqTxManagerFegin.sendCompensateMsg(currentTime, groupId, model, address, uniqueKey, className, methodStr, data, time,startError); + } + + /** + * 获取TM服务地址 + * + * @return txServer + */ + @Override + public String getServer() { + reloadMqTxManagerFegin(); + return mqTxManagerFegin.getServer(); + } + +} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java new file mode 100644 index 000000000..f54068a8c --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java @@ -0,0 +1,41 @@ +package com.example.demo.service.impl; + +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/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java new file mode 100644 index 000000000..8397361f7 --- /dev/null +++ b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java @@ -0,0 +1,59 @@ +package com.example.demo.service.impl; + +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 ApplicationContext spring; + + @Autowired + private MQTxManagerFegin mqTxManagerFegin; + + public void reloadMqTxManagerFegin() { +// if(mqTxManagerFegin == null){ +// this.mqTxManagerFegin = spring.getBean(MQTxManagerFegin.class); +// } + } + + /** + * 检查并清理事务数据 + * + * @param groupId 事务组id + * @param waitTaskId 任务id + * @return 事务状态 + */ + @Override + public String cleanNotifyTransactionHttp(String groupId, String waitTaskId) { + reloadMqTxManagerFegin(); + 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) { + reloadMqTxManagerFegin(); + return mqTxManagerFegin.sendCompensateMsg(currentTime, groupId, model, address, uniqueKey, className, methodStr, data, time,startError); + } + + /** + * 获取TM服务地址 + * + * @return txServer + */ + @Override + public String getServer() { + reloadMqTxManagerFegin(); + return mqTxManagerFegin.getServer(); + } + +} 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/impl/MQTxManagerServiceImpl.java b/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerServiceImpl.java index 5362b63d8..f74422a78 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,7 +1,6 @@ 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; @@ -11,6 +10,7 @@ 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; @@ -36,6 +36,9 @@ public class MQTxManagerServiceImpl implements MQTxManagerService { @Autowired private TxManagerHttpRequestHelper managerHelper; + @Autowired + private MQTxManagerFeginService mqTxManagerFeginService; + @Override public void createTransactionGroup(String groupId) { @@ -57,7 +60,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(); @@ -101,7 +103,8 @@ 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 = managerHelper.httpGet(url); + String clearRes = mqTxManagerFeginService.cleanNotifyTransactionHttp(groupId, waitTaskId); if(clearRes==null){ return -1; } @@ -111,8 +114,9 @@ public int cleanNotifyTransactionHttp(String groupId, String waitTaskId) { @Override public String httpGetServer() { - String url = configReader.getTxUrl() + "getServer"; - return managerHelper.httpGet(url); +// String url = configReader.getTxUrl() + "getServer"; +// return managerHelper.httpGet(url); + return mqTxManagerFeginService.getServer(); } @Override @@ -133,7 +137,8 @@ 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 = managerHelper.httpPost(configReader.getTxUrl() + "sendCompensateMsg", compensateInfo.toParamsString()); + String json = mqTxManagerFeginService.sendCompensateMsg(currentTime, groupId, modelName, address, uniqueKey, className, methodStr, data, time,startError); compensateInfo.setResJson(json); From 9292748d6339d0083909eef6275abcf3b5ab63a7 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Thu, 6 Dec 2018 13:45:23 +0800 Subject: [PATCH 38/71] =?UTF-8?q?=E4=B8=BA=E6=BB=A1=E8=B6=B3tx-manager?= =?UTF-8?q?=E9=9B=86=E7=BE=A4=EF=BC=9A=E4=BD=BF=E7=94=A8feign=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/service/impl/MQTxManagerFegin.java | 6 +++--- .../service/impl/MQTxManagerFeginServiceImpl.java | 7 +++++++ .../netty/service/impl/MQTxManagerServiceImpl.java | 14 -------------- tx-manager/pom.xml | 10 ++++++++++ .../src/main/resources/application.properties | 2 +- 5 files changed, 21 insertions(+), 18 deletions(-) diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java index 783528da8..f34407607 100644 --- a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java @@ -14,11 +14,11 @@ public interface MQTxManagerFegin { /** * 检查并清理事务数据 * @param groupId 事务组id - * @param waitTaskId 任务id + * @param taskId 任务id * @return 事务状态 */ - @GetMapping("/tx/manager/cleanNotifyTransactionHttp") - String cleanNotifyTransactionHttp(@RequestParam(value = "groupId") String groupId, @RequestParam(value = "waitTaskId") String waitTaskId); + @GetMapping("/tx/manager/cleanNotifyTransaction") + String cleanNotifyTransactionHttp(@RequestParam(value = "groupId") String groupId, @RequestParam(value = "taskId") String taskId); /** * 记录补偿事务数据到tm diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java index 8397361f7..22d5027ea 100644 --- a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java @@ -1,6 +1,8 @@ package com.example.demo.service.impl; import com.codingapi.tx.netty.service.MQTxManagerFeginService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; @@ -11,6 +13,8 @@ @Service public class MQTxManagerFeginServiceImpl implements MQTxManagerFeginService { + private Logger logger = LoggerFactory.getLogger(getClass()); + @Autowired private ApplicationContext spring; @@ -33,6 +37,7 @@ public void reloadMqTxManagerFegin() { @Override public String cleanNotifyTransactionHttp(String groupId, String waitTaskId) { reloadMqTxManagerFegin(); + logger.info("检查并清理事务数据...groupId:{}, waitTaskId:{}", groupId, waitTaskId); return mqTxManagerFegin.cleanNotifyTransactionHttp(groupId, waitTaskId); } @@ -42,6 +47,7 @@ public String cleanNotifyTransactionHttp(String groupId, String waitTaskId) { @Override public String sendCompensateMsg(long currentTime, String groupId, String model, String address, String uniqueKey, String className, String methodStr, String data, long time,int startError) { reloadMqTxManagerFegin(); + logger.info("记录补偿事务数据到tm"); return mqTxManagerFegin.sendCompensateMsg(currentTime, groupId, model, address, uniqueKey, className, methodStr, data, time,startError); } @@ -53,6 +59,7 @@ public String sendCompensateMsg(long currentTime, String groupId, String model, @Override public String getServer() { reloadMqTxManagerFegin(); + logger.info("获取TM服务地址"); 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 f74422a78..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 @@ -4,7 +4,6 @@ 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; @@ -12,7 +11,6 @@ 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,19 +25,12 @@ public class MQTxManagerServiceImpl implements MQTxManagerService { @Autowired private ModelNameService modelNameService; - @Autowired - private ConfigReader configReader; - @Autowired private CompensateService compensateService; - @Autowired - private TxManagerHttpRequestHelper managerHelper; - @Autowired private MQTxManagerFeginService mqTxManagerFeginService; - @Override public void createTransactionGroup(String groupId) { JSONObject jsonObject = new JSONObject(); @@ -102,8 +93,6 @@ 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; @@ -114,8 +103,6 @@ public int cleanNotifyTransactionHttp(String groupId, String waitTaskId) { @Override public String httpGetServer() { -// String url = configReader.getTxUrl() + "getServer"; -// return managerHelper.httpGet(url); return mqTxManagerFeginService.getServer(); } @@ -137,7 +124,6 @@ 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-manager/pom.xml b/tx-manager/pom.xml index a1ffc0a69..38d14dd99 100644 --- a/tx-manager/pom.xml +++ b/tx-manager/pom.xml @@ -72,6 +72,16 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.boot + spring-boot-starter-undertow diff --git a/tx-manager/src/main/resources/application.properties b/tx-manager/src/main/resources/application.properties index 991c354c4..957ac29ea 100644 --- a/tx-manager/src/main/resources/application.properties +++ b/tx-manager/src/main/resources/application.properties @@ -83,7 +83,7 @@ tm.compensate.auto=false #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 #\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 From a29242b224acacc4dd3a481f91d49ba4e5ce7626 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Thu, 6 Dec 2018 14:21:03 +0800 Subject: [PATCH 39/71] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compensate/service/impl/CompensateServiceImpl.java | 2 ++ .../service/impl/TxManagerSenderServiceImpl.java | 2 +- .../tm/manager/service/impl/TxManagerServiceImpl.java | 10 ++++++---- 3 files changed, 9 insertions(+), 5 deletions(-) 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 ced09a7d9..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 @@ -279,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/manager/service/impl/TxManagerSenderServiceImpl.java b/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/TxManagerSenderServiceImpl.java index 846f13121..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,7 +110,7 @@ private void setChannel(List list) { /** * 事务提交或回归 * - * @param checkSate + * @param checkSate 1-提交事务 */ private boolean transaction(final TxGroup txGroup, final int checkSate) { if (checkSate == 1) { 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){ From 2b1c666ccd28445796aff5d90a8adde07eeb3437 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Thu, 6 Dec 2018 15:30:53 +0800 Subject: [PATCH 40/71] =?UTF-8?q?=E6=94=B9=E9=80=A0=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springcloud/listener/ServerListener.java | 22 +++++++------------ .../service/impl/ModelNameServiceImpl.java | 4 ++-- .../service/impl/MicroServiceImpl.java | 12 ++-------- 3 files changed, 12 insertions(+), 26 deletions(-) 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 9b542ae19..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,8 +4,8 @@ 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.boot.web.context.WebServerInitializedEvent; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.context.WebServerInitializedEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; @@ -15,6 +15,7 @@ public class ServerListener implements ApplicationListener onApplicationEvent. "+event.getWebServer()); this.serverPort = event.getWebServer().getPort(); - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - // 若连接不上txmanager start()方法将阻塞 - initService.start(); - } + 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/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 6c300fdb7..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 @@ -55,17 +55,9 @@ private boolean isIp(String ipAddress) { @Override public TxState getState() { TxState state = new TxState(); - List list = discoveryClient.getInstances(registration.getServiceId()); - String ipAddress; - if(CollectionUtils.isEmpty(list)) - { + String ipAddress = registration.getHost(); + if(!isIp(ipAddress)){ ipAddress = "127.0.0.1"; - }else{ - ServiceInstance serviceInstance = list.get(0); - ipAddress = serviceInstance.getHost(); - if(!isIp(ipAddress)){ - ipAddress = "127.0.0.1"; - } } logger.info("ipAddress: {}, port: {}", ipAddress, Constants.socketPort); state.setIp(ipAddress); From 19c44bbc444704081eab280898ce98cc643c5cb4 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Thu, 6 Dec 2018 15:52:11 +0800 Subject: [PATCH 41/71] =?UTF-8?q?=E6=94=B9=E9=80=A0=E6=88=90=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=8F=91=E7=8E=B0=E5=90=8E=EF=BC=8C=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=86=97=E4=BD=99=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/TxManagerHttpRequestServiceImpl.java | 29 --------- .../impl/TxManagerTxUrlServiceImpl.java | 24 ------- .../impl/TxManagerTxUrlServiceImpl.java | 22 ------- .../com/codingapi/tx/config/ConfigReader.java | 57 ----------------- .../service/TxManagerHttpRequestHelper.java | 62 ------------------- .../service/TxManagerHttpRequestService.java | 12 ---- 6 files changed, 206 deletions(-) delete mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerHttpRequestServiceImpl.java delete mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java delete mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java delete mode 100644 tx-client/src/main/java/com/codingapi/tx/config/ConfigReader.java delete mode 100644 tx-client/src/main/java/com/codingapi/tx/netty/service/TxManagerHttpRequestHelper.java delete mode 100644 tx-client/src/main/java/com/codingapi/tx/netty/service/TxManagerHttpRequestService.java diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerHttpRequestServiceImpl.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerHttpRequestServiceImpl.java deleted file mode 100644 index 004b86dd9..000000000 --- a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerHttpRequestServiceImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.example.demo.service.impl; - -import com.codingapi.tx.netty.service.TxManagerHttpRequestService; -import com.lorne.core.framework.utils.http.HttpUtils; -import org.springframework.stereotype.Service; - -/** - * create by lorne on 2017/11/18 - */ - -@Service -public class TxManagerHttpRequestServiceImpl implements TxManagerHttpRequestService{ - - @Override - public String httpGet(String url) { - System.out.println("httpGet-start"); - String res = HttpUtils.get(url); - System.out.println("httpGet-end"); - return res; - } - - @Override - public String httpPost(String url, String params) { - System.out.println("httpPost-start"); - String res = HttpUtils.post(url,params); - System.out.println("httpPost-end"); - return res; - } -} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java deleted file mode 100644 index 83d1df328..000000000 --- a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.demo.service.impl; - -import com.codingapi.tx.config.service.TxManagerTxUrlService; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -/** - * create by lorne on 2017/11/18 - */ -@Service -public class TxManagerTxUrlServiceImpl implements TxManagerTxUrlService -{ - - - @Value("${tm.manager.url}") - private String url; - - @Override - public String getTxUrl() - { - System.out.println("load tm.manager.url "); - return url; - } -} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java deleted file mode 100644 index 7332ff60f..000000000 --- a/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/TxManagerTxUrlServiceImpl.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.example.demo.service.impl; - -import com.codingapi.tx.config.service.TxManagerTxUrlService; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -/** - * create by lorne on 2017/11/18 - */ -@Service -public class TxManagerTxUrlServiceImpl implements TxManagerTxUrlService{ - - - @Value("${tm.manager.url}") - private String url; - - @Override - public String getTxUrl() { - System.out.println("load tm.manager.url "); - return url; - } -} 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/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); - -} From 0a271edef6905d11c263d79050733dddc7a831cc Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Thu, 6 Dec 2018 16:41:16 +0800 Subject: [PATCH 42/71] =?UTF-8?q?maven=E4=B8=AD=E5=88=A0=E9=99=A4javadoc?= =?UTF-8?q?=E7=9A=84=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/pom.xml b/pom.xml index f2357a3f7..7fe4e1463 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,6 @@ - org.sonatype.plugins nexus-staging-maven-plugin @@ -72,19 +71,6 @@ true - - org.apache.maven.plugins - maven-javadoc-plugin - 2.10.3 - - - attach-javadocs - - jar - - - - From 457f1abc2a9c87254547f434ebfd2584fdf76cc7 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Thu, 6 Dec 2018 18:41:33 +0800 Subject: [PATCH 43/71] =?UTF-8?q?=E5=B0=86feign=E7=A7=BB=E6=A4=8D=E5=88=B0?= =?UTF-8?q?tx-client=E4=B8=AD=EF=BC=8C=E4=BF=9D=E6=8C=81=E5=92=8Cdemo?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E4=B8=80=E6=A0=B7=E7=9A=84=E5=8C=85=E7=BB=93?= =?UTF-8?q?=E6=9E=84=EF=BC=8C=E8=BF=99=E6=A0=B7=E6=89=8D=E8=83=BD=E6=89=AB?= =?UTF-8?q?=E6=8F=8F=E5=88=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/service/impl/MQTxManagerFegin.java | 41 ------------ .../impl/MQTxManagerFeginServiceImpl.java | 66 ------------------- .../impl/MQTxManagerFeginServiceImpl.java | 3 +- .../com/example/demo}/MQTxManagerFegin.java | 2 +- 4 files changed, 3 insertions(+), 109 deletions(-) delete mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java delete mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java rename {springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo => tx-client/src/main/java/com/codingapi/tx/netty}/service/impl/MQTxManagerFeginServiceImpl.java (95%) rename {springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl => tx-client/src/main/java/com/example/demo}/MQTxManagerFegin.java (97%) diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java deleted file mode 100644 index f34407607..000000000 --- a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.example.demo.service.impl; - -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 taskId 任务id - * @return 事务状态 - */ - @GetMapping("/tx/manager/cleanNotifyTransaction") - String cleanNotifyTransactionHttp(@RequestParam(value = "groupId") String groupId, @RequestParam(value = "taskId") String taskId); - - /** - * 记录补偿事务数据到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/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java deleted file mode 100644 index 22d5027ea..000000000 --- a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.example.demo.service.impl; - -import com.codingapi.tx.netty.service.MQTxManagerFeginService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -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 { - - private Logger logger = LoggerFactory.getLogger(getClass()); - - @Autowired - private ApplicationContext spring; - - @Autowired - private MQTxManagerFegin mqTxManagerFegin; - - public void reloadMqTxManagerFegin() { -// if(mqTxManagerFegin == null){ -// this.mqTxManagerFegin = spring.getBean(MQTxManagerFegin.class); -// } - } - - /** - * 检查并清理事务数据 - * - * @param groupId 事务组id - * @param waitTaskId 任务id - * @return 事务状态 - */ - @Override - public String cleanNotifyTransactionHttp(String groupId, String waitTaskId) { - reloadMqTxManagerFegin(); - logger.info("检查并清理事务数据...groupId:{}, waitTaskId:{}", groupId, 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) { - reloadMqTxManagerFegin(); - logger.info("记录补偿事务数据到tm"); - return mqTxManagerFegin.sendCompensateMsg(currentTime, groupId, model, address, uniqueKey, className, methodStr, data, time,startError); - } - - /** - * 获取TM服务地址 - * - * @return txServer - */ - @Override - public String getServer() { - reloadMqTxManagerFegin(); - logger.info("获取TM服务地址"); - return mqTxManagerFegin.getServer(); - } - -} diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java b/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerFeginServiceImpl.java similarity index 95% rename from springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java rename to tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerFeginServiceImpl.java index 8397361f7..0ab315f9c 100644 --- a/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/MQTxManagerFeginServiceImpl.java +++ b/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerFeginServiceImpl.java @@ -1,5 +1,6 @@ -package com.example.demo.service.impl; +package com.codingapi.tx.netty.service.impl; +import com.example.demo.MQTxManagerFegin; import com.codingapi.tx.netty.service.MQTxManagerFeginService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; diff --git a/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java b/tx-client/src/main/java/com/example/demo/MQTxManagerFegin.java similarity index 97% rename from springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java rename to tx-client/src/main/java/com/example/demo/MQTxManagerFegin.java index f54068a8c..592074eaa 100644 --- a/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/java/com/example/demo/service/impl/MQTxManagerFegin.java +++ b/tx-client/src/main/java/com/example/demo/MQTxManagerFegin.java @@ -1,4 +1,4 @@ -package com.example.demo.service.impl; +package com.example.demo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; From 4c540fe68f51baf565fa6e89dea529be81872538 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Thu, 6 Dec 2018 18:53:38 +0800 Subject: [PATCH 44/71] =?UTF-8?q?=E7=BC=96=E5=86=99demo=E5=BC=95=E7=94=A8?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- springcloud-lcn-demo/README.md | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/springcloud-lcn-demo/README.md b/springcloud-lcn-demo/README.md index dbf6113b5..b0e42026d 100644 --- a/springcloud-lcn-demo/README.md +++ b/springcloud-lcn-demo/README.md @@ -24,21 +24,16 @@ ```` ->2.application.properties文件配置eureka地址和Txmanager地址,其中eureka地址与Txmanager的eureka地址保持一致 +>2.application.properties文件配置eureka地址 ```properties -tm.manager.url=http://127.0.0.1:8899/tx/manager/ eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/ ``` ->3.实现TxManagerHttpRequestService和TxManagerTxUrlService,参考service下的实现 +>3.事务发起方(事务参与方不需要)中的涉及分布式事务的方法要添加@TxTransaction(isStart = true)注解 ->4.事务参与方(事务发起方不需要)中的业务service要实现ITxTransaction接口 +>4.无论事务发起方还是事务参与方的业务方法都需要实现本地事务添加@Transactional注解和@TxTransaction注解 ->5.事务发起方(事务参与方不需要)中的涉及分布式事务的方法要添加@TxTransaction(isStart = true)注解 - ->6.无论事务发起方还是事务参与方的业务方法都需要实现本地事务添加@Transactional注解和@TxTransaction注解 - ->7.tx-manager启动前要配置redis +>5.tx-manager启动前要配置redis 注意事项:避免事务发起方和调用方操作一张表的数据,会导致锁表 \ No newline at end of file From 50ef629bf1086e6759fd4589c7d2aabc8e639495 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Thu, 6 Dec 2018 18:55:39 +0800 Subject: [PATCH 45/71] =?UTF-8?q?=E7=BC=96=E5=86=99demo=E5=BC=95=E7=94=A8?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- springcloud-lcn-demo/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/springcloud-lcn-demo/README.md b/springcloud-lcn-demo/README.md index b0e42026d..3916048cb 100644 --- a/springcloud-lcn-demo/README.md +++ b/springcloud-lcn-demo/README.md @@ -29,9 +29,9 @@ eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/ ``` ->3.事务发起方(事务参与方不需要)中的涉及分布式事务的方法要添加@TxTransaction(isStart = true)注解 +>3.发起方和参与方的业务方法添加@Transactional注解和@TxTransaction注解 ->4.无论事务发起方还是事务参与方的业务方法都需要实现本地事务添加@Transactional注解和@TxTransaction注解 +>4.发起方中的涉及分布式事务的方法要添加@TxTransaction(isStart = true)注解 >5.tx-manager启动前要配置redis From de732b7cf14b8ed2a22016ee486b4e89dbee3ad2 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Thu, 6 Dec 2018 19:52:32 +0800 Subject: [PATCH 46/71] =?UTF-8?q?demo=E4=B8=AD=E5=8E=BB=E6=8E=89pom.xml=20?= =?UTF-8?q?=E4=B8=ADweb=E5=8C=85=E5=90=AB=E7=9A=84tomcat=E7=9A=84=E5=BC=95?= =?UTF-8?q?=E7=94=A8=EF=BC=8C=E4=BD=BF=E7=94=A8undertow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- springcloud-lcn-demo/pom.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/springcloud-lcn-demo/pom.xml b/springcloud-lcn-demo/pom.xml index 083465aa2..ce55ad7d8 100644 --- a/springcloud-lcn-demo/pom.xml +++ b/springcloud-lcn-demo/pom.xml @@ -83,6 +83,16 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.boot + spring-boot-starter-undertow From 189a515338a0557880373b5691c769e3b385d907 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Fri, 7 Dec 2018 10:49:25 +0800 Subject: [PATCH 47/71] =?UTF-8?q?=E4=BF=AE=E6=94=B9Ribbon=E8=B4=9F?= =?UTF-8?q?=E8=BD=BD=E5=9D=87=E8=A1=A1=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.properties | 4 ++-- .../src/main/resources/application.properties | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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 index a3f4ec419..a26c20ceb 100644 --- a/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/resources/application.properties +++ b/springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/resources/application.properties @@ -19,8 +19,8 @@ server.port = 8081 eureka.client.service-url.defaultZone=http://127.0.0.1:1111/eureka/ #Ribbon\u7684\u8D1F\u8F7D\u5747\u8861\u7B56\u7565 -ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule -ribbon.MaxAutoRetriesNextServer=0 +tx-manager.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule +tx-manager.ribbon.MaxAutoRetriesNextServer=0 ribbon.eureka.enabled=true ribbon.readTimeout=6000 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 index 43d3f1d03..e12fa5eb6 100644 --- a/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/resources/application.properties +++ b/springcloud-lcn-demo/springcloud-mybatis-demo2/src/main/resources/application.properties @@ -11,8 +11,8 @@ server.port = 8082 eureka.client.service-url.defaultZone=http://127.0.0.1:1111/eureka/ ##Ribbon\u7684\u8D1F\u8F7D\u5747\u8861\u7B56\u7565 -ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule -ribbon.MaxAutoRetriesNextServer=0 +tx-manager.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule +tx-manager.ribbon.MaxAutoRetriesNextServer=0 ribbon.eureka.enabled=true ribbon.readTimeout=6000 From 064768e204973152d503ffdfa332756f69936452 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 10 Dec 2018 10:06:55 +0800 Subject: [PATCH 48/71] =?UTF-8?q?=E4=BF=AE=E6=94=B9Ribbon=E8=B4=9F?= =?UTF-8?q?=E8=BD=BD=E5=9D=87=E8=A1=A1=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/pom.xml | 67 +++++++++++++++++++ .../com/example/demo/MQTxManagerFegin.java | 6 +- 2 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 extensions/pom.xml rename {tx-client => extensions}/src/main/java/com/example/demo/MQTxManagerFegin.java (86%) diff --git a/extensions/pom.xml b/extensions/pom.xml new file mode 100644 index 000000000..9b4fbb053 --- /dev/null +++ b/extensions/pom.xml @@ -0,0 +1,67 @@ + + + + + tx-lcn + com.codingapi + 4.2.0 + + 4.0.0 + + extensions + + extensions + + + + org.springframework.cloud + spring-cloud-openfeign-core + 2.0.0.RELEASE + compile + + + + org.springframework + spring-web + ${org.springframework-version} + compile + + + + + + + + maven-clean-plugin + 3.0.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.7.0 + + + maven-surefire-plugin + 2.20.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + + diff --git a/tx-client/src/main/java/com/example/demo/MQTxManagerFegin.java b/extensions/src/main/java/com/example/demo/MQTxManagerFegin.java similarity index 86% rename from tx-client/src/main/java/com/example/demo/MQTxManagerFegin.java rename to extensions/src/main/java/com/example/demo/MQTxManagerFegin.java index 592074eaa..861763b16 100644 --- a/tx-client/src/main/java/com/example/demo/MQTxManagerFegin.java +++ b/extensions/src/main/java/com/example/demo/MQTxManagerFegin.java @@ -24,11 +24,11 @@ public interface MQTxManagerFegin { * 记录补偿事务数据到tm */ @PostMapping("/tx/manager/sendCompensateMsg") - String sendCompensateMsg(@RequestParam("currentTime") long currentTime,@RequestParam("groupId") String groupId, + 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("className") String className, @RequestParam("methodStr") String methodStr, + @RequestParam("data") String data, @RequestParam("time") long time, @RequestParam("startError") int startError); /** From df629cad04eb73c19d9b4d8a189948feec599697 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 10 Dec 2018 10:07:23 +0800 Subject: [PATCH 49/71] =?UTF-8?q?=E6=95=B4=E7=90=86=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 16 ++++++++++++++-- springcloud-lcn-demo/pom.xml | 11 ++++------- transaction-springcloud/pom.xml | 8 +------- tx-client/pom.xml | 24 ++++++++++-------------- tx-manager/pom.xml | 2 +- tx-plugins-db/pom.xml | 4 +--- 6 files changed, 31 insertions(+), 34 deletions(-) diff --git a/pom.xml b/pom.xml index 7fe4e1463..8d257f195 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 @@ -20,6 +20,7 @@ tx-plugins-db springcloud-lcn-demo + extensions @@ -31,7 +32,18 @@ 1.8 3.6.0 - 4.2.0-SNAPSHOT + 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 diff --git a/springcloud-lcn-demo/pom.xml b/springcloud-lcn-demo/pom.xml index ce55ad7d8..8370bf071 100644 --- a/springcloud-lcn-demo/pom.xml +++ b/springcloud-lcn-demo/pom.xml @@ -15,7 +15,6 @@ springcloud-mybatis-demo2 - org.springframework.boot spring-boot-starter-parent @@ -26,14 +25,12 @@ UTF-8 UTF-8 + 1.8 + 1.8 + 1.8 - 1.7 - 1.7 - 1.7 + 4.2.0 Finchley.RELEASE - - 4.2.0-SNAPSHOT - diff --git a/transaction-springcloud/pom.xml b/transaction-springcloud/pom.xml index 805515790..4c890ce05 100644 --- a/transaction-springcloud/pom.xml +++ b/transaction-springcloud/pom.xml @@ -7,22 +7,16 @@ com.codingapi tx-lcn - 4.2.0-SNAPSHOT + 4.2.0 transaction-springcloud - ${lcn.last.version} transaction-springcloud https://github.com/codingapi/tx-lcn transaction-springcloud project for Spring Boot - - 2.0.4.RELEASE - 5.0.8.RELEASE - - diff --git a/tx-client/pom.xml b/tx-client/pom.xml index f21b6b168..e6178542d 100644 --- a/tx-client/pom.xml +++ b/tx-client/pom.xml @@ -6,33 +6,29 @@ 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 - - 5.0.8.RELEASE - 19.0 - 4.0.38 - 1.1.3 - 4.0.0 - 1.7.7 - - + + com.codingapi + extensions + 4.2.0 + + org.springframework.cloud spring-cloud-starter-openfeign - 2.0.0.RELEASE + ${spring-cloud-starter-openfeign.version} org.springframework.cloud @@ -55,12 +51,12 @@ org.aspectj aspectjweaver - 1.8.4 + ${org.aspectj.version} org.aspectj aspectjrt - 1.8.4 + ${org.aspectj.version} diff --git a/tx-manager/pom.xml b/tx-manager/pom.xml index 38d14dd99..ffcfc28aa 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 diff --git a/tx-plugins-db/pom.xml b/tx-plugins-db/pom.xml index a0d1612ef..51c8bd738 100644 --- a/tx-plugins-db/pom.xml +++ b/tx-plugins-db/pom.xml @@ -6,11 +6,10 @@ com.codingapi tx-lcn - 4.2.0-SNAPSHOT + 4.2.0 tx-plugins-db - ${lcn.last.version} tx-plugins-db https://github.com/codingapi/tx-lcn @@ -36,5 +35,4 @@ - From 5326cfe9622c0dd29ea5e4e88094c3fb843d9b51 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 10 Dec 2018 13:39:16 +0800 Subject: [PATCH 50/71] =?UTF-8?q?=E6=95=B4=E7=90=86=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/pom.xml | 2 +- tx-manager/pom.xml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/extensions/pom.xml b/extensions/pom.xml index 9b4fbb053..3e7d438f4 100644 --- a/extensions/pom.xml +++ b/extensions/pom.xml @@ -17,7 +17,7 @@ org.springframework.cloud spring-cloud-openfeign-core - 2.0.0.RELEASE + 2.0.2.RELEASE compile diff --git a/tx-manager/pom.xml b/tx-manager/pom.xml index ffcfc28aa..c8e37c9e7 100644 --- a/tx-manager/pom.xml +++ b/tx-manager/pom.xml @@ -86,8 +86,7 @@ org.springframework.boot - spring-boot-starter-redis - 1.3.8.RELEASE + spring-boot-starter-data-redis From 234280a2c63a7a8da32c9f3a68ece468faae6d5c Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 10 Dec 2018 15:39:48 +0800 Subject: [PATCH 51/71] =?UTF-8?q?=E6=95=B4=E7=90=86=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 343e003d0..1326b0f30 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,10 @@ ## 目录说明 +extensions feign扩展配置类 + +springcloud-lcn-demo demo案例 + transaction-springcloud LCN springcloud rpc框架扩展支持 tx-client 是LCN核心tx模块端控制框架 @@ -44,7 +48,6 @@ tx-plugins-db 是LCN 对关系型数据库的插件支持 分布式事务发起方: ``` - @Override @TxTransaction(isStart=true) @Transactional @@ -57,13 +60,10 @@ tx-plugins-db 是LCN 对关系型数据库的插件支持 int v = 100/0; return true; } - - ``` 分布式事务被调用方(test2Service的业务实现类) ``` - @Override @Transactional @TxTransaction @@ -72,7 +72,6 @@ tx-plugins-db 是LCN 对关系型数据库的插件支持 testDao.save(); return true; } - ``` 如上代码执行完成以后两个模块都将回滚事务。 From 01ff832dd5b6fd12b92203418801baf7a8adcc09 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 10 Dec 2018 15:43:28 +0800 Subject: [PATCH 52/71] =?UTF-8?q?=E6=95=B4=E7=90=86=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/README.md b/README.md index 1326b0f30..3bc051075 100644 --- a/README.md +++ b/README.md @@ -114,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 From fbe774983778082f95ed04cd5766069639b111d0 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Tue, 11 Dec 2018 10:46:20 +0800 Subject: [PATCH 53/71] =?UTF-8?q?=E6=95=B4=E7=90=86=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tx-manager/pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tx-manager/pom.xml b/tx-manager/pom.xml index c8e37c9e7..ffcfc28aa 100644 --- a/tx-manager/pom.xml +++ b/tx-manager/pom.xml @@ -86,7 +86,8 @@ org.springframework.boot - spring-boot-starter-data-redis + spring-boot-starter-redis + 1.3.8.RELEASE From 6694ed95eeed44a0093acdf0d24b9c8d12755775 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Tue, 11 Dec 2018 11:05:45 +0800 Subject: [PATCH 54/71] =?UTF-8?q?=E6=95=B4=E7=90=86=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/pom.xml | 67 ------------------- .../example/demo/MybatisDemo1Application.java | 2 +- tx-client/pom.xml | 6 -- .../com/codingapi/tx}/MQTxManagerFegin.java | 2 +- .../tx/aop/bean/TxTransactionLocal.java | 2 +- .../config/service/TxManagerTxUrlService.java | 9 --- .../impl/MQTxManagerFeginServiceImpl.java | 2 +- 7 files changed, 4 insertions(+), 86 deletions(-) delete mode 100644 extensions/pom.xml rename {extensions/src/main/java/com/example/demo => tx-client/src/main/java/com/codingapi/tx}/MQTxManagerFegin.java (98%) delete mode 100644 tx-client/src/main/java/com/codingapi/tx/config/service/TxManagerTxUrlService.java diff --git a/extensions/pom.xml b/extensions/pom.xml deleted file mode 100644 index 3e7d438f4..000000000 --- a/extensions/pom.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - tx-lcn - com.codingapi - 4.2.0 - - 4.0.0 - - extensions - - extensions - - - - org.springframework.cloud - spring-cloud-openfeign-core - 2.0.2.RELEASE - compile - - - - org.springframework - spring-web - ${org.springframework-version} - compile - - - - - - - - maven-clean-plugin - 3.0.0 - - - - maven-resources-plugin - 3.0.2 - - - maven-compiler-plugin - 3.7.0 - - - maven-surefire-plugin - 2.20.1 - - - maven-jar-plugin - 3.0.2 - - - maven-install-plugin - 2.5.2 - - - maven-deploy-plugin - 2.8.2 - - - - - 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 index 1f00d833d..913b8dd4e 100644 --- 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 @@ -15,7 +15,7 @@ @Configuration @SpringBootApplication @EnableEurekaClient -@EnableFeignClients +@EnableFeignClients(basePackages = {"com.codingapi.tx"}) public class MybatisDemo1Application { public static void main(String[] args) { diff --git a/tx-client/pom.xml b/tx-client/pom.xml index e6178542d..f185e56e5 100644 --- a/tx-client/pom.xml +++ b/tx-client/pom.xml @@ -19,12 +19,6 @@ - - com.codingapi - extensions - 4.2.0 - - org.springframework.cloud spring-cloud-starter-openfeign diff --git a/extensions/src/main/java/com/example/demo/MQTxManagerFegin.java b/tx-client/src/main/java/com/codingapi/tx/MQTxManagerFegin.java similarity index 98% rename from extensions/src/main/java/com/example/demo/MQTxManagerFegin.java rename to tx-client/src/main/java/com/codingapi/tx/MQTxManagerFegin.java index 861763b16..c6ca8ae9b 100644 --- a/extensions/src/main/java/com/example/demo/MQTxManagerFegin.java +++ b/tx-client/src/main/java/com/codingapi/tx/MQTxManagerFegin.java @@ -1,4 +1,4 @@ -package com.example.demo; +package com.codingapi.tx; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; 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/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/impl/MQTxManagerFeginServiceImpl.java b/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerFeginServiceImpl.java index 0ab315f9c..caeae9d7d 100644 --- 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 @@ -1,6 +1,6 @@ package com.codingapi.tx.netty.service.impl; -import com.example.demo.MQTxManagerFegin; +import com.codingapi.tx.MQTxManagerFegin; import com.codingapi.tx.netty.service.MQTxManagerFeginService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; From 5bd16ccdc3be52934546bea6855dac136889fa78 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Tue, 11 Dec 2018 11:06:22 +0800 Subject: [PATCH 55/71] =?UTF-8?q?=E6=95=B4=E7=90=86=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/example/demo/MybatisDemo2Application.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 192d798ab..f5f9133b1 100644 --- 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 @@ -15,7 +15,7 @@ @Configuration @SpringBootApplication @EnableEurekaClient -@EnableFeignClients +@@EnableFeignClients(basePackages = {"com.codingapi.tx"}) public class MybatisDemo2Application { public static void main(String[] args) { From 1586f801d21312b2fdc1ea3d6af8e3df241cd463 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Tue, 11 Dec 2018 11:07:35 +0800 Subject: [PATCH 56/71] =?UTF-8?q?=E6=95=B4=E7=90=86=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- springcloud-lcn-demo/README.md | 2 ++ .../src/main/java/com/example/demo/MybatisDemo2Application.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/springcloud-lcn-demo/README.md b/springcloud-lcn-demo/README.md index 3916048cb..a0b024d86 100644 --- a/springcloud-lcn-demo/README.md +++ b/springcloud-lcn-demo/README.md @@ -35,5 +35,7 @@ eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/ >5.tx-manager启动前要配置redis +>6. springboot启动类添加注解配置@EnableFeignClients(basePackages = {"com.codingapi.tx"}) + 注意事项:避免事务发起方和调用方操作一张表的数据,会导致锁表 \ No newline at end of file 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 index f5f9133b1..b4d943f83 100644 --- 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 @@ -15,7 +15,7 @@ @Configuration @SpringBootApplication @EnableEurekaClient -@@EnableFeignClients(basePackages = {"com.codingapi.tx"}) +@EnableFeignClients(basePackages = {"com.codingapi.tx"}) public class MybatisDemo2Application { public static void main(String[] args) { From 372a3c2eabae6cbe471880c5c8eab817474150bb Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Tue, 11 Dec 2018 11:27:09 +0800 Subject: [PATCH 57/71] =?UTF-8?q?=E6=95=B4=E7=90=86=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/example/demo/MybatisDemo1Application.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 913b8dd4e..904a1ad3d 100644 --- 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 @@ -15,7 +15,7 @@ @Configuration @SpringBootApplication @EnableEurekaClient -@EnableFeignClients(basePackages = {"com.codingapi.tx"}) +@EnableFeignClients(basePackages = {"com.codingapi.tx", "com.example.demo"}) public class MybatisDemo1Application { public static void main(String[] args) { From 1ed77e9c6338264147c3e1c9a6967273b0a35361 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Tue, 11 Dec 2018 16:20:11 +0800 Subject: [PATCH 58/71] =?UTF-8?q?=E6=95=B4=E7=90=86=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- springcloud-lcn-demo/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/springcloud-lcn-demo/README.md b/springcloud-lcn-demo/README.md index a0b024d86..b592b60f0 100644 --- a/springcloud-lcn-demo/README.md +++ b/springcloud-lcn-demo/README.md @@ -35,7 +35,7 @@ eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/ >5.tx-manager启动前要配置redis ->6. springboot启动类添加注解配置@EnableFeignClients(basePackages = {"com.codingapi.tx"}) +>6.springboot启动类添加注解配置@EnableFeignClients(basePackages = {"com.codingapi.tx"}) 注意事项:避免事务发起方和调用方操作一张表的数据,会导致锁表 \ No newline at end of file From aaaddeeaf528b561773b9be5a386dd7cb095e490 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Wed, 12 Dec 2018 15:58:24 +0800 Subject: [PATCH 59/71] =?UTF-8?q?=E6=95=B4=E7=90=86=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A=E8=AF=B4=E6=98=8E?= =?UTF-8?q?:=E5=88=A0=E9=99=A4extensions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8d257f195..900705dcc 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,6 @@ tx-plugins-db springcloud-lcn-demo - extensions From 0f1722f7dd135f27f0f8abccf444a414ce901045 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Wed, 12 Dec 2018 17:11:21 +0800 Subject: [PATCH 60/71] =?UTF-8?q?=E6=95=B4=E7=90=86=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A=E8=AF=B4=E6=98=8E?= =?UTF-8?q?=20--=E4=BF=AE=E6=94=B9pom=E6=96=87=E4=BB=B6=E4=B8=AD=E7=9A=84r?= =?UTF-8?q?edis=E5=BC=95=E7=94=A8=20--=E4=BF=AE=E6=94=B9redis=E4=B8=BA?= =?UTF-8?q?=E9=9B=86=E7=BE=A4=E4=BD=BF=E7=94=A8=20--=E6=B7=BB=E5=8A=A0Redi?= =?UTF-8?q?sTemplateConfig.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tx-manager/pom.xml | 9 +- .../tm/redis/JedisClusterConfig.java | 89 ------------------- .../com/codingapi/tm/redis/RedisConfig.java | 44 --------- .../codingapi/tm/redis/RedisProperties.java | 35 -------- .../configuration/RedisTemplateConfig.java | 52 +++++++++++ .../service/impl/RedisServerServiceImpl.java | 1 + .../src/main/resources/application.properties | 20 ++--- 7 files changed, 70 insertions(+), 180 deletions(-) delete mode 100644 tx-manager/src/main/java/com/codingapi/tm/redis/JedisClusterConfig.java delete mode 100644 tx-manager/src/main/java/com/codingapi/tm/redis/RedisConfig.java delete mode 100644 tx-manager/src/main/java/com/codingapi/tm/redis/RedisProperties.java create mode 100644 tx-manager/src/main/java/com/codingapi/tm/redis/configuration/RedisTemplateConfig.java diff --git a/tx-manager/pom.xml b/tx-manager/pom.xml index ffcfc28aa..684aee77a 100644 --- a/tx-manager/pom.xml +++ b/tx-manager/pom.xml @@ -86,8 +86,13 @@ org.springframework.boot - spring-boot-starter-redis - 1.3.8.RELEASE + spring-boot-starter-data-redis + + + + com.alibaba + fastjson + 1.2.47 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 957ac29ea..806dd97cd 100644 --- a/tx-manager/src/main/resources/application.properties +++ b/tx-manager/src/main/resources/application.properties @@ -24,22 +24,22 @@ eureka.instance.prefer-ip-address=true ##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.commandTimeout=5000 +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 \u5355\u70B9\u73AF\u5883\u914D\u7F6E #redis #redis\u4E3B\u673A\u5730\u5740 -spring.redis.host=localhost +#spring.redis.host=localhost #redis\u4E3B\u673A\u7AEF\u53E3 -spring.redis.port=6379 +#spring.redis.port=6379 #redis\u94FE\u63A5\u5BC6\u7801 -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 +#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-end################################################### From 0f75138ce0e82a4b627a220f0bb5a5adbaccb979 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Wed, 12 Dec 2018 17:12:02 +0800 Subject: [PATCH 61/71] =?UTF-8?q?=E8=BE=93=E5=87=BA=E6=97=A5=E5=BF=97?= =?UTF-8?q?=EF=BC=9A=E8=A1=A5=E5=81=BF=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo/controller/DemoController.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) 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 index 34d59cbd5..69d80a032 100644 --- 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 @@ -1,10 +1,12 @@ package com.example.demo.controller; -import com.alibaba.druid.support.json.JSONUtils; -import com.codingapi.tx.compensate.model.CompensateInfo; +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.*; @@ -35,11 +37,15 @@ public int save(String id, String name){ } @PostMapping("notifyResult") - public String notifyResult(String jsonStr) + public String notifyResult(@RequestBody String jsonStr) { - System.out.println("通知地址..."); - CompensateInfo compensateInfo = (CompensateInfo)JSONUtils.parse(jsonStr); - System.out.println(compensateInfo); + 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; } } From 81018898645396d4a55682e0128a7626651637d1 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Thu, 13 Dec 2018 09:30:12 +0800 Subject: [PATCH 62/71] =?UTF-8?q?=E8=BE=93=E5=87=BA=E6=97=A5=E5=BF=97?= =?UTF-8?q?=EF=BC=9A=E5=88=A0=E9=99=A4=E5=86=97=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/MQTxManagerFeginServiceImpl.java | 12 ------------ 1 file changed, 12 deletions(-) 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 index caeae9d7d..bc6a7c2c8 100644 --- 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 @@ -12,18 +12,9 @@ @Service public class MQTxManagerFeginServiceImpl implements MQTxManagerFeginService { - @Autowired - private ApplicationContext spring; - @Autowired private MQTxManagerFegin mqTxManagerFegin; - public void reloadMqTxManagerFegin() { -// if(mqTxManagerFegin == null){ -// this.mqTxManagerFegin = spring.getBean(MQTxManagerFegin.class); -// } - } - /** * 检查并清理事务数据 * @@ -33,7 +24,6 @@ public void reloadMqTxManagerFegin() { */ @Override public String cleanNotifyTransactionHttp(String groupId, String waitTaskId) { - reloadMqTxManagerFegin(); return mqTxManagerFegin.cleanNotifyTransactionHttp(groupId, waitTaskId); } @@ -42,7 +32,6 @@ public String cleanNotifyTransactionHttp(String groupId, String waitTaskId) { */ @Override public String sendCompensateMsg(long currentTime, String groupId, String model, String address, String uniqueKey, String className, String methodStr, String data, long time,int startError) { - reloadMqTxManagerFegin(); return mqTxManagerFegin.sendCompensateMsg(currentTime, groupId, model, address, uniqueKey, className, methodStr, data, time,startError); } @@ -53,7 +42,6 @@ public String sendCompensateMsg(long currentTime, String groupId, String model, */ @Override public String getServer() { - reloadMqTxManagerFegin(); return mqTxManagerFegin.getServer(); } From 8ce941b0e4c2865a819c25e63501aa81dc8c8ba6 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Thu, 13 Dec 2018 14:37:05 +0800 Subject: [PATCH 63/71] =?UTF-8?q?=E8=BE=93=E5=87=BA=E6=97=A5=E5=BF=97?= =?UTF-8?q?=EF=BC=9A=E5=88=A0=E9=99=A4=E5=86=97=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/codingapi/tx/aop/bean/TxTransactionInfo.java | 11 +++++------ .../service/impl/TxDefaultTransactionServerImpl.java | 5 ++++- .../impl/TxRunningNoTransactionServerImpl.java | 2 ++ .../service/impl/TxRunningTransactionServerImpl.java | 7 ++----- .../service/impl/TxStartTransactionServerImpl.java | 10 ++++++---- 5 files changed, 19 insertions(+), 16 deletions(-) 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/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 d8b39d852..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,6 +35,8 @@ public class TxStartTransactionServerImpl implements TransactionServer { public Object execute(ProceedingJoinPoint point,final TxTransactionInfo info) throws Throwable { //分布式事务开始执行 + logger.info("事务发起方..."); + logger.debug("--->分布式事务开始执行 begin start transaction"); final long start = System.currentTimeMillis(); @@ -51,8 +53,8 @@ public Object execute(ProceedingJoinPoint point,final TxTransactionInfo info) th 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 { @@ -131,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())){ @@ -141,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())){ From c403edf137415bd8c9b5381b768b6f8b22d03f45 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Thu, 13 Dec 2018 14:49:44 +0800 Subject: [PATCH 64/71] =?UTF-8?q?=E8=BE=93=E5=87=BA=E6=97=A5=E5=BF=97?= =?UTF-8?q?=EF=BC=9A=E5=88=A0=E9=99=A4=E5=86=97=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TransactionServerFactoryServiceImpl.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) 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 69db11c9f..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 @@ -5,7 +5,6 @@ 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; @@ -17,8 +16,7 @@ * @date 2017/6/8 */ @Service -public class TransactionServerFactoryServiceImpl implements TransactionServerFactoryService -{ +public class TransactionServerFactoryServiceImpl implements TransactionServerFactoryService { private Logger logger = LoggerFactory.getLogger(TransactionServerFactoryServiceImpl.class); @@ -38,18 +36,18 @@ public class TransactionServerFactoryServiceImpl implements TransactionServerFac private ILCNTransactionControl transactionControl; @Override - public TransactionServer createTransactionServer(TxTransactionInfo info) throws Throwable - { + public TransactionServer createTransactionServer(TxTransactionInfo info) throws Throwable { if (!SocketManager.getInstance().isNetState()) { + //检查socket通讯是否正常 (第一次执行时启动txRunningTransactionServer的业务处理控制,然后嵌套调用其他事务的业务方法时都并到txInServiceTransactionServer业务处理下) logger.warn("tx-manager not connected."); return txDefaultTransactionServer; } /*********分布式事务处理逻辑***********/ - logger.info("分布式事务处理逻辑...createTransactionServer"); + 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; @@ -59,8 +57,8 @@ public TransactionServer createTransactionServer(TxTransactionInfo info) throws } } - /** 分布式事务已经开启,业务进行中 **/ - logger.debug("分布式事务已经开启,业务进行中"); + /** 事务参与方:分布式事务已经开启,业务进行中 **/ + logger.debug("事务参与方:分布式事务已经开启,业务进行中"); if (info.getTxTransactionLocal() != null || StringUtils.isNotEmpty(info.getTxGroupId())) { //检查socket通讯是否正常 (第一次执行时启动txRunningTransactionServer的业务处理控制,然后嵌套调用其他事务的业务方法时都并到txInServiceTransactionServer业务处理下) if (SocketManager.getInstance().isNetState()) { @@ -68,7 +66,7 @@ public TransactionServer createTransactionServer(TxTransactionInfo info) throws return txDefaultTransactionServer; } else { /** 表示整个应用没有获取过DB连接 || 无事务业务的操作 **/ - if (transactionControl.isNoTransactionOperation() || info.getTransaction().readOnly()) { + if (transactionControl.isNoTransactionOperation() || info.getTxTransaction().readOnly()) { return txRunningNoTransactionServer; } else { return txRunningTransactionServer; From 20a3ea1512ed50b135757c75e80b9e5bd853aedf Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Sat, 15 Dec 2018 22:37:23 +0800 Subject: [PATCH 65/71] =?UTF-8?q?tx-manager:=E8=B0=83=E6=95=B4redis?= =?UTF-8?q?=E5=8D=95=E8=8A=82=E7=82=B9=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tx-manager/src/main/resources/application.properties | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/tx-manager/src/main/resources/application.properties b/tx-manager/src/main/resources/application.properties index 806dd97cd..e54d24f90 100644 --- a/tx-manager/src/main/resources/application.properties +++ b/tx-manager/src/main/resources/application.properties @@ -24,8 +24,8 @@ eureka.instance.prefer-ip-address=true ##redis \u96C6\u7FA4\u73AF\u5883\u914D\u7F6E ##redis cluster -spring.redis.cluster.nodes=127.0.0.1:6380,127.0.0.1:6381,127.0.0.1:6382 -spring.redis.cluster.commandTimeout=5000 +#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 \u5355\u70B9\u73AF\u5883\u914D\u7F6E #redis @@ -35,11 +35,9 @@ spring.redis.cluster.commandTimeout=5000 #spring.redis.port=6379 #redis\u94FE\u63A5\u5BC6\u7801 #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 +spring.redis.jedis.pool.max-idle=8 +spring.redis.jedis.pool.max-wait= +spring.redis.jedis.pool.min-idle=0 #####################################redis-end################################################### From 5b3c790a9de3eab02cee1d4867b08b22517a57e0 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Sat, 15 Dec 2018 23:22:37 +0800 Subject: [PATCH 66/71] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=8A=82=E7=82=B9demo3?= =?UTF-8?q?=20=E8=B0=83=E7=94=A8=E9=93=BE=20A->B=20A->C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- springcloud-lcn-demo/pom.xml | 1 + .../demo/service/impl/DemoServiceImpl.java | 5 ++ .../springcloud-mybatis-demo3/pom.xml | 54 +++++++++++++++++++ .../example/demo/MybatisDemo3Application.java | 46 ++++++++++++++++ .../demo/controller/DemoController.java | 36 +++++++++++++ .../java/com/example/demo/dao/TestMapper.java | 24 +++++++++ .../java/com/example/demo/entity/Test.java | 28 ++++++++++ .../com/example/demo/service/DemoService.java | 16 ++++++ .../demo/service/impl/DemoServiceImpl.java | 37 +++++++++++++ .../src/main/resources/application.properties | 22 ++++++++ 10 files changed, 269 insertions(+) create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo3/pom.xml create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/MybatisDemo3Application.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/controller/DemoController.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/dao/TestMapper.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/entity/Test.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/service/DemoService.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/java/com/example/demo/service/impl/DemoServiceImpl.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo3/src/main/resources/application.properties diff --git a/springcloud-lcn-demo/pom.xml b/springcloud-lcn-demo/pom.xml index 8370bf071..23919c8f7 100644 --- a/springcloud-lcn-demo/pom.xml +++ b/springcloud-lcn-demo/pom.xml @@ -13,6 +13,7 @@ springcloud-mybatis-demo1 springcloud-mybatis-demo2 + springcloud-mybatis-demo3 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 index 06668b105..f33a27d2b 100644 --- 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 @@ -2,6 +2,7 @@ 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; @@ -23,6 +24,8 @@ public class DemoServiceImpl implements DemoService { @Autowired private Demo2Client demo2Client; + @Autowired + private Demo3Client demo3Client; @Autowired private TestMapper testMapper; @@ -43,6 +46,8 @@ public int save(String id, String name) { demo2Client.save(id, name); + demo3Client.save(); + return 2; } } 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 From 445e6b0231fb7171fd15f458278e4ca64e8b3573 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Sat, 15 Dec 2018 23:23:13 +0800 Subject: [PATCH 67/71] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=8A=82=E7=82=B9demo3?= =?UTF-8?q?=20=E8=B0=83=E7=94=A8=E9=93=BE=20A->B=20A->C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/demo/client/Demo3Client.java | 19 +++++++++++++++++++ .../demo/client/Demo3ClientHystric.java | 17 +++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/client/Demo3Client.java create mode 100644 springcloud-lcn-demo/springcloud-mybatis-demo1/src/main/java/com/example/demo/client/Demo3ClientHystric.java 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 保存失败."); + } +} From 42e126e50318cfce3ce357a814bc6ed1fe7613f0 Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 17 Dec 2018 14:39:42 +0800 Subject: [PATCH 68/71] -- --- .../tx/aop/bean/TxCompensateLocal.java | 2 +- .../service/impl/NettyControlServiceImpl.java | 17 +++++++---------- .../datasource/relational/LCNDBConnection.java | 1 + 3 files changed, 9 insertions(+), 11 deletions(-) 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/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-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..6edc3f907 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 @@ -88,6 +88,7 @@ public void rollback() throws SQLException { isClose.set(true); } + @Override protected void closeConnection() throws SQLException { runnable.close(this); connection.close(); From ad100adf7e722d461f9464a03e3bd458b56dadfd Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 17 Dec 2018 19:07:31 +0800 Subject: [PATCH 69/71] -- --- .../com/codingapi/tx/datasource/relational/LCNDBConnection.java | 2 ++ 1 file changed, 2 insertions(+) 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 6edc3f907..c78a6cb6e 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 @@ -187,10 +187,12 @@ public void run() { } + @Override public String getGroupId() { return groupId; } + @Override public TxTask getWaitTask() { return waitTask; } From 23c7fe0a133e7c3b49106e9791df12777b4ad80e Mon Sep 17 00:00:00 2001 From: yizhishang <285206405@qq.com> Date: Mon, 17 Dec 2018 19:13:39 +0800 Subject: [PATCH 70/71] -- --- .../codingapi/tx/datasource/relational/LCNDBConnection.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 c78a6cb6e..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 { @@ -139,6 +138,7 @@ protected void rollbackConnection() throws SQLException { connection.rollback(); } + @Override public void transaction() throws SQLException { if (waitTask == null) { rollbackConnection(); @@ -153,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); From bcf995b99445583b3ba269e92dbe592bfc2110ac Mon Sep 17 00:00:00 2001 From: lorne <1991wangliang@gmail.com> Date: Mon, 31 Dec 2018 21:21:00 +0800 Subject: [PATCH 71/71] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 49d827226..de6726962 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# LCN分布式事务框架v4.0 +# LCN分布式事务框架v4.0 for springboot2.0.x "LCN并不生产事务,LCN只是本地事务的协调者"