From dc76943f9832b32ae19b9959febf44929bf3d49d Mon Sep 17 00:00:00 2001 From: ahao888 <354345001@qq.com> Date: Fri, 16 Mar 2018 12:16:00 +0800 Subject: [PATCH 01/83] Update ServerListener.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit springcloud 打成war包执行的时候,并不走EmbeddedServletContainerInitializedEvent这个事件,所以可以监听ApplicationReadyEvent事件,将ServerListener,InitService注入新的监听器中启动客户端。springcloud的端口号一般都会配置,所以可以从配置文件中获取。 --- .../com/codingapi/tx/springcloud/listener/ServerListener.java | 4 ++++ 1 file changed, 4 insertions(+) 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 b936ec38e..a8a77fb9a 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 @@ -30,4 +30,8 @@ public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) { public int getPort() { return this.serverPort; } + + public void setServerPort(int serverPort) { + this.serverPort = serverPort; + } } From 6bdb11c1ff7e081e22a5c4c61c5d4e04d496c56a Mon Sep 17 00:00:00 2001 From: wangliang <1991wangliang@gmail.com> Date: Fri, 16 Mar 2018 17:11:27 +0800 Subject: [PATCH 02/83] banner --- transaction-dubbo/src/main/resources/banner.txt | 13 +++++++++++++ transaction-motan/src/main/resources/banner.txt | 13 +++++++++++++ .../src/main/resources/banner.txt | 13 +++++++++++++ .../listener/service/impl/InitServiceImpl.java | 13 ------------- .../listener/service/impl/InitServiceImpl.java | 16 ---------------- tx-manager/src/main/resources/banner.txt | 13 +++++++++++++ 6 files changed, 52 insertions(+), 29 deletions(-) create mode 100644 transaction-dubbo/src/main/resources/banner.txt create mode 100644 transaction-motan/src/main/resources/banner.txt create mode 100644 transaction-springcloud/src/main/resources/banner.txt create mode 100644 tx-manager/src/main/resources/banner.txt diff --git a/transaction-dubbo/src/main/resources/banner.txt b/transaction-dubbo/src/main/resources/banner.txt new file mode 100644 index 000000000..51d683404 --- /dev/null +++ b/transaction-dubbo/src/main/resources/banner.txt @@ -0,0 +1,13 @@ + + >=> >=> >==> >=> + >=> >=> >=> >> >=> >=> + >=> >=> >=> >=> >=> + >=> >=> >=> >=>>=> + >=> >=> >=> > >=> + >=> >=> >=> >=> >>=> + >=======> >===> >=> >=> + + LCN-Client version:4.1.0 + + + diff --git a/transaction-motan/src/main/resources/banner.txt b/transaction-motan/src/main/resources/banner.txt new file mode 100644 index 000000000..51d683404 --- /dev/null +++ b/transaction-motan/src/main/resources/banner.txt @@ -0,0 +1,13 @@ + + >=> >=> >==> >=> + >=> >=> >=> >> >=> >=> + >=> >=> >=> >=> >=> + >=> >=> >=> >=>>=> + >=> >=> >=> > >=> + >=> >=> >=> >=> >>=> + >=======> >===> >=> >=> + + LCN-Client version:4.1.0 + + + diff --git a/transaction-springcloud/src/main/resources/banner.txt b/transaction-springcloud/src/main/resources/banner.txt new file mode 100644 index 000000000..51d683404 --- /dev/null +++ b/transaction-springcloud/src/main/resources/banner.txt @@ -0,0 +1,13 @@ + + >=> >=> >==> >=> + >=> >=> >=> >> >=> >=> + >=> >=> >=> >=> >=> + >=> >=> >=> >=>>=> + >=> >=> >=> > >=> + >=> >=> >=> >=> >>=> + >=======> >===> >=> >=> + + LCN-Client version:4.1.0 + + + diff --git a/tx-client/src/main/java/com/codingapi/tx/listener/service/impl/InitServiceImpl.java b/tx-client/src/main/java/com/codingapi/tx/listener/service/impl/InitServiceImpl.java index b16d8a2e5..a27b0499c 100644 --- a/tx-client/src/main/java/com/codingapi/tx/listener/service/impl/InitServiceImpl.java +++ b/tx-client/src/main/java/com/codingapi/tx/listener/service/impl/InitServiceImpl.java @@ -21,20 +21,7 @@ public class InitServiceImpl implements InitService { @Override public void start() { nettyService.start(); - welcome(); logger.info("socket-start.."); } - private void welcome(){ - System.out.println(); - System.out.println(); - System.out.println("\t\t** \t\t ****\t\t** **"); - System.out.println("\t\t** \t\t** \t\t*** **"); - System.out.println("\t\t** \t\t** \t\t** ***"); - System.out.println("\t\t*****\t\t ****\t\t** **"); - System.out.println(); - System.out.println("\t\tLCN-Client version:4.1.0"); - System.out.println(); - } - } diff --git a/tx-manager/src/main/java/com/codingapi/tm/listener/service/impl/InitServiceImpl.java b/tx-manager/src/main/java/com/codingapi/tm/listener/service/impl/InitServiceImpl.java index af3e803b2..e9f401841 100644 --- a/tx-manager/src/main/java/com/codingapi/tm/listener/service/impl/InitServiceImpl.java +++ b/tx-manager/src/main/java/com/codingapi/tm/listener/service/impl/InitServiceImpl.java @@ -28,24 +28,8 @@ public void start() { Constants.socketPort = configReader.getSocketPort(); Constants.maxConnection = configReader.getSocketMaxConnection(); nettyServerService.start(); - - welcome(); } - - private void welcome(){ - System.out.println(); - System.out.println(); - System.out.println("\t\t** \t\t ****\t\t** **"); - System.out.println("\t\t** \t\t** \t\t*** **"); - System.out.println("\t\t** \t\t** \t\t** ***"); - System.out.println("\t\t*****\t\t ****\t\t** **"); - System.out.println(); - System.out.println("\t\tLCN-TxManager version:4.1.0"); - System.out.println(); - } - - @Override public void close() { nettyServerService.close(); diff --git a/tx-manager/src/main/resources/banner.txt b/tx-manager/src/main/resources/banner.txt new file mode 100644 index 000000000..879248ac5 --- /dev/null +++ b/tx-manager/src/main/resources/banner.txt @@ -0,0 +1,13 @@ + + >=> >=> >==> >=> + >=> >=> >=> >> >=> >=> + >=> >=> >=> >=> >=> + >=> >=> >=> >=>>=> + >=> >=> >=> > >=> + >=> >=> >=> >=> >>=> + >=======> >===> >=> >=> + + LCN-TxManager version:4.1.0 + + + From b43d1f2c9e6a15faaf0c759220ed6c6e583ce5e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=94=A1=E7=81=BF?= Date: Wed, 18 Jul 2018 10:08:47 +0800 Subject: [PATCH 03/83] 4.2.0-SNAPSHOT --- pom.xml | 4 ++-- transaction-dubbo/pom.xml | 2 +- transaction-motan/pom.xml | 2 +- transaction-springcloud/pom.xml | 2 +- tx-client/pom.xml | 2 +- tx-manager/pom.xml | 2 +- tx-plugins-db/pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index b93c6d794..840e7f088 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.codingapi tx-lcn - 4.1.0 + 4.2.0-SNAPSHOT pom tx-lcn @@ -32,7 +32,7 @@ 1.7 3.6.0 - 4.1.0 + 4.2.0-SNAPSHOT diff --git a/transaction-dubbo/pom.xml b/transaction-dubbo/pom.xml index 29e9a600d..064d77314 100644 --- a/transaction-dubbo/pom.xml +++ b/transaction-dubbo/pom.xml @@ -8,7 +8,7 @@ com.codingapi tx-lcn - 4.1.0 + 4.2.0-SNAPSHOT com.codingapi diff --git a/transaction-motan/pom.xml b/transaction-motan/pom.xml index 9bdcbfa7b..a922488a5 100644 --- a/transaction-motan/pom.xml +++ b/transaction-motan/pom.xml @@ -8,7 +8,7 @@ com.codingapi tx-lcn - 4.1.0 + 4.2.0-SNAPSHOT com.codingapi diff --git a/transaction-springcloud/pom.xml b/transaction-springcloud/pom.xml index 5342e94ae..d5f04dcfe 100644 --- a/transaction-springcloud/pom.xml +++ b/transaction-springcloud/pom.xml @@ -6,7 +6,7 @@ com.codingapi tx-lcn - 4.1.0 + 4.2.0-SNAPSHOT com.codingapi diff --git a/tx-client/pom.xml b/tx-client/pom.xml index 08574c890..7f206d268 100644 --- a/tx-client/pom.xml +++ b/tx-client/pom.xml @@ -6,7 +6,7 @@ com.codingapi tx-lcn - 4.1.0 + 4.2.0-SNAPSHOT com.codingapi diff --git a/tx-manager/pom.xml b/tx-manager/pom.xml index 4d163f987..2a39b1cf9 100644 --- a/tx-manager/pom.xml +++ b/tx-manager/pom.xml @@ -5,7 +5,7 @@ com.codingapi tx-manager - 4.1.0 + 4.2.0-SNAPSHOT jar tx-manager diff --git a/tx-plugins-db/pom.xml b/tx-plugins-db/pom.xml index 747907e61..36a2b4d10 100644 --- a/tx-plugins-db/pom.xml +++ b/tx-plugins-db/pom.xml @@ -6,7 +6,7 @@ com.codingapi tx-lcn - 4.1.0 + 4.2.0-SNAPSHOT com.codingapi From a43073ca4957e64e2afee3c8aae13f6cb9e014a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=94=A1=E7=81=BF?= Date: Wed, 18 Jul 2018 15:26:26 +0800 Subject: [PATCH 04/83] dubbo filter bug --- .../java/com/codingapi/tx/dubbo/filter/TransactionFilter.java | 3 +++ 1 file changed, 3 insertions(+) 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 index 2a6ad0a26..c0c757164 100644 --- 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 @@ -1,5 +1,7 @@ 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; @@ -8,6 +10,7 @@ /** * Created by lorne on 2017/6/30. */ +@Activate(group = Constants.CONSUMER, order = -10001) public class TransactionFilter implements Filter { From 819d3a467e837500732cd4d56abe226a950d055c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=94=A1=E7=81=BF?= Date: Wed, 18 Jul 2018 15:27:35 +0800 Subject: [PATCH 05/83] =?UTF-8?q?=E5=88=87=E9=9D=A2order=E5=80=BC=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E3=80=82=E4=B8=BA=E8=87=AA=E5=AE=9A=E4=B9=89=E5=88=87?= =?UTF-8?q?=E9=9D=A2=E9=A2=84=E7=95=99=E5=88=87=E5=85=A5=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codingapi/tx/dubbo/interceptor/TransactionAspect.java | 3 ++- .../codingapi/tx/motan/interceptor/TransactionAspect.java | 3 ++- .../tx/springcloud/interceptor/TransactionAspect.java | 3 ++- tx-client/src/main/java/com/codingapi/tx/Constants.java | 8 ++++++++ tx-manager/pom.xml | 3 +++ 5 files changed, 17 insertions(+), 3 deletions(-) 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 index da7a70141..963c5bcb3 100644 --- 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 @@ -1,5 +1,6 @@ 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; @@ -45,7 +46,7 @@ public Object around(ProceedingJoinPoint point)throws Throwable{ @Override public int getOrder() { - return HIGHEST_PRECEDENCE; + return Constants.ASPECT_ORDER; } 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 index 74574604d..0d91a2e9f 100644 --- 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 @@ -1,5 +1,6 @@ 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; @@ -43,7 +44,7 @@ public Object around(ProceedingJoinPoint point)throws Throwable{ @Override public int getOrder() { - return HIGHEST_PRECEDENCE; + return Constants.ASPECT_ORDER; } 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 db649e382..1b33e9c6b 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 @@ -1,5 +1,6 @@ package com.codingapi.tx.springcloud.interceptor; +import com.codingapi.tx.Constants; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @@ -43,7 +44,7 @@ public Object around(ProceedingJoinPoint point)throws Throwable{ @Override public int getOrder() { - return HIGHEST_PRECEDENCE; + return Constants.ASPECT_ORDER; } 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 c7c8fb771..b4650b9b0 100644 --- a/tx-client/src/main/java/com/codingapi/tx/Constants.java +++ b/tx-client/src/main/java/com/codingapi/tx/Constants.java @@ -15,4 +15,12 @@ public class Constants { */ public static TxServer txServer; + /** + * 主切面的 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 2a39b1cf9..a0c5f052a 100644 --- a/tx-manager/pom.xml +++ b/tx-manager/pom.xml @@ -27,6 +27,9 @@ 19.0 Dalston.SR1 + true + true + From 38b0757fb3f26942558012053c0d5dc5daf44a1c Mon Sep 17 00:00:00 2001 From: caisirius Date: Thu, 19 Jul 2018 11:15:11 +0800 Subject: [PATCH 06/83] =?UTF-8?q?=E5=8A=A0=E6=97=A5=E5=BF=97=E3=80=82?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=B1=A0=E5=8A=A0=E5=90=8D=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/TransactionControlServiceImpl.java | 2 +- .../framework/thread/NamedThreadFactory.java | 55 +++++++++++++++++++ .../tx/framework/utils/SocketManager.java | 3 +- .../service/impl/NettyControlServiceImpl.java | 8 ++- .../netty/service/impl/NettyServiceImpl.java | 3 +- 5 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 tx-client/src/main/java/com/codingapi/tx/framework/thread/NamedThreadFactory.java diff --git a/tx-client/src/main/java/com/codingapi/tx/control/service/impl/TransactionControlServiceImpl.java b/tx-client/src/main/java/com/codingapi/tx/control/service/impl/TransactionControlServiceImpl.java index 85fd9fc4d..47021636e 100644 --- a/tx-client/src/main/java/com/codingapi/tx/control/service/impl/TransactionControlServiceImpl.java +++ b/tx-client/src/main/java/com/codingapi/tx/control/service/impl/TransactionControlServiceImpl.java @@ -47,6 +47,6 @@ public void notifyTransactionMsg(ChannelHandlerContext ctx,JSONObject resObj, St SocketUtils.sendMsg(ctx, data.toString()); - logger.debug("send notify data ->" + data.toString()); + logger.info("send notify data ->" + data.toString()); } } diff --git a/tx-client/src/main/java/com/codingapi/tx/framework/thread/NamedThreadFactory.java b/tx-client/src/main/java/com/codingapi/tx/framework/thread/NamedThreadFactory.java new file mode 100644 index 000000000..13bc4abbc --- /dev/null +++ b/tx-client/src/main/java/com/codingapi/tx/framework/thread/NamedThreadFactory.java @@ -0,0 +1,55 @@ +package com.codingapi.tx.framework.thread; + +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * [类描述] + * + * @author caican + * 17/9/12 + */ +public class NamedThreadFactory implements ThreadFactory +{ + private static final AtomicInteger POOL_SEQ = new AtomicInteger(1); + + private final AtomicInteger mThreadNum = new AtomicInteger(1); + + private final String mPrefix; + + private final boolean mDaemo; + + private final ThreadGroup mGroup; + + public NamedThreadFactory() + { + this("pool-" + POOL_SEQ.getAndIncrement(),false); + } + + public NamedThreadFactory(String prefix) + { + this(prefix,false); + } + + public NamedThreadFactory(String prefix, boolean daemo) + { + mPrefix = prefix + "-thread-"; + mDaemo = daemo; + SecurityManager s = System.getSecurityManager(); + mGroup = ( s == null ) ? Thread.currentThread().getThreadGroup() : s.getThreadGroup(); + } + + @Override + public Thread newThread(Runnable runnable) + { + String name = mPrefix + mThreadNum.getAndIncrement(); + Thread ret = new Thread(mGroup,runnable,name,0); + ret.setDaemon(mDaemo); + return ret; + } + + public ThreadGroup getThreadGroup() + { + return mGroup; + } +} diff --git a/tx-client/src/main/java/com/codingapi/tx/framework/utils/SocketManager.java b/tx-client/src/main/java/com/codingapi/tx/framework/utils/SocketManager.java index 836073148..fa870bfff 100644 --- a/tx-client/src/main/java/com/codingapi/tx/framework/utils/SocketManager.java +++ b/tx-client/src/main/java/com/codingapi/tx/framework/utils/SocketManager.java @@ -1,5 +1,6 @@ package com.codingapi.tx.framework.utils; +import com.codingapi.tx.framework.thread.NamedThreadFactory; import com.codingapi.tx.model.Request; import com.lorne.core.framework.utils.task.ConditionUtils; import com.lorne.core.framework.utils.task.IBack; @@ -34,7 +35,7 @@ public class SocketManager { private static SocketManager manager = null; - private ExecutorService threadPool = Executors.newFixedThreadPool(max_size); + private ExecutorService threadPool = Executors.newFixedThreadPool(max_size, new NamedThreadFactory("sender")); private ScheduledExecutorService executorService = Executors.newScheduledThreadPool(max_size); 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 052a647b8..77b963f9e 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 @@ -13,6 +13,8 @@ import com.lorne.core.framework.utils.task.Task; import io.netty.channel.ChannelHandlerContext; import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -22,6 +24,7 @@ @Service public class NettyControlServiceImpl implements NettyControlService { + private Logger logger = LoggerFactory.getLogger(NettyControlServiceImpl.class); @Autowired private NettyService nettyService; @@ -71,12 +74,15 @@ public void executeService(final ChannelHandlerContext ctx,final String json) { JSONObject resObj = JSONObject.parseObject(json); if (resObj.containsKey("a")) { // tm发送数据给tx模块的处理指令 - + logger.info("receive cmd -> {}", json); transactionControlService.notifyTransactionMsg(ctx,resObj,json); }else{ //tx发送数据给tm的响应返回数据 String key = resObj.getString("k"); + if (!"h".equals(key)) { + logger.info("receive response -> {}", json); + } responseMsg(key,resObj); } } diff --git a/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/NettyServiceImpl.java b/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/NettyServiceImpl.java index 599e38878..d633fed26 100644 --- a/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/NettyServiceImpl.java +++ b/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/NettyServiceImpl.java @@ -1,6 +1,7 @@ package com.codingapi.tx.netty.service.impl; import com.codingapi.tx.Constants; +import com.codingapi.tx.framework.thread.NamedThreadFactory; import com.codingapi.tx.framework.utils.SocketManager; import com.codingapi.tx.netty.handler.TransactionHandler; import com.codingapi.tx.netty.service.NettyControlService; @@ -47,7 +48,7 @@ public class NettyServiceImpl implements NettyService ,DisposableBean { private Logger logger = LoggerFactory.getLogger(NettyServiceImpl.class); - private ExecutorService threadPool = Executors.newFixedThreadPool(100); + private ExecutorService threadPool = Executors.newFixedThreadPool(100,new NamedThreadFactory("receiver")); @Override public synchronized void start() { From 0a2fc8558283b60df91bb401b17ca5b613cbddc7 Mon Sep 17 00:00:00 2001 From: caisirius Date: Tue, 24 Jul 2018 10:19:54 +0800 Subject: [PATCH 07/83] =?UTF-8?q?=20=E5=88=86=E5=B8=83=E5=BC=8F=E4=BA=8B?= =?UTF-8?q?=E5=8A=A1=E6=A1=86=E6=9E=B6=E5=BC=B1=E4=BE=9D=E8=B5=96=EF=BC=9A?= =?UTF-8?q?=20=20=E5=BA=94=E7=94=A8=E5=88=9D=E5=A7=8B=E5=8C=96=E6=97=B6?= =?UTF-8?q?=E8=8B=A5=E6=97=A0=E6=B3=95=E8=BF=9E=E6=8E=A5txmanager=20?= =?UTF-8?q?=E5=B0=86=E6=97=A0=E6=B3=95=E5=90=AF=E5=8A=A8=EF=BC=8C=E4=BD=86?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E6=9C=89=E5=8F=AF=E8=83=BD=E5=B7=B2=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=EF=BC=8C=E6=9C=89=E5=BE=88=E5=A4=A7=E9=A3=8E=E9=99=A9?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E6=9C=8D=E5=8A=A1=E4=B8=8D=E5=8F=AF=E7=94=A8?= =?UTF-8?q?-=E6=94=B9=E4=B8=BA=E5=BC=82=E6=AD=A5=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=20=20=E5=BD=93=20txmanager=20=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E6=97=B6=EF=BC=8C=E9=80=80=E5=8C=96=E5=88=B0?= =?UTF-8?q?=E6=97=A0=E5=88=86=E5=B8=83=E5=BC=8F=E4=BA=8B=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E5=8E=9F=E6=9D=A5=E6=98=AF=E4=BC=9A=E6=8A=9B=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/TransactionSocketListener.java | 10 +++++++++- .../listener/TransactionSocketListener.java | 10 +++++++++- .../springcloud/listener/ServerListener.java | 10 +++++++++- .../TransactionServerFactoryServiceImpl.java | 18 ++++++++++++++---- 4 files changed, 41 insertions(+), 7 deletions(-) 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 index 817edf9b0..6dbdd7078 100644 --- 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 @@ -20,7 +20,15 @@ public class TransactionSocketListener implements ApplicationContextAware { @Override public void setApplicationContext(ApplicationContext event) throws BeansException { - initService.start(); + 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/listener/TransactionSocketListener.java b/transaction-motan/src/main/java/com/codingapi/tx/motan/listener/TransactionSocketListener.java index b0ae2bff1..4a3f9fc5f 100644 --- 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 @@ -20,7 +20,15 @@ public class TransactionSocketListener implements ApplicationContextAware { @Override public void setApplicationContext(ApplicationContext event) throws BeansException { - initService.start(); + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + // 若连接不上txmanager start()方法将阻塞 + initService.start(); + } + }); + thread.setName("TxInit-thread"); + thread.start(); } } 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 a8a77fb9a..c6dab85f1 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 @@ -24,7 +24,15 @@ public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) { logger.info("onApplicationEvent -> onApplicationEvent. "+event.getEmbeddedServletContainer()); this.serverPort = event.getEmbeddedServletContainer().getPort(); - initService.start(); + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + // 若连接不上txmanager start()方法将阻塞 + initService.start(); + } + }); + thread.setName("TxInit-thread"); + thread.start(); } public int getPort() { 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 229c89e92..4aa1946d0 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,8 +5,11 @@ import com.codingapi.tx.aop.service.TransactionServer; import com.codingapi.tx.aop.service.TransactionServerFactoryService; import com.codingapi.tx.datasource.ILCNTransactionControl; +import com.codingapi.tx.framework.utils.SocketManager; import com.codingapi.tx.netty.service.NettyService; import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -18,6 +21,7 @@ @Service public class TransactionServerFactoryServiceImpl implements TransactionServerFactoryService { + private Logger logger = LoggerFactory.getLogger(TransactionServerFactoryServiceImpl.class); @Autowired private TransactionServer txStartTransactionServer; @@ -40,16 +44,21 @@ public class TransactionServerFactoryServiceImpl implements TransactionServerFac public TransactionServer createTransactionServer(TxTransactionInfo info) throws Throwable { + if (!SocketManager.getInstance().isNetState()) { + logger.warn("tx-manager not connected."); + return txDefaultTransactionServer; + } /*********分布式事务处理逻辑*开始***********/ /** 尽当Transaction注解不为空,其他都为空时。表示分布式事务开始启动 **/ if (info.getTransaction() != null && info.getTransaction().isStart() && info.getTxTransactionLocal() == null && StringUtils.isEmpty(info.getTxGroupId())) { //检查socket通讯是否正常 (当启动事务的主业务方法执行完以后,再执行其他业务方法时将进入txInServiceTransactionServer业务处理) - if (nettyService.checkState()) { + if (SocketManager.getInstance().isNetState()) { return txStartTransactionServer; } else { - throw new Exception("tx-manager not connected ,please check tx-manager server "); + logger.warn("tx-manager not connected."); + return txDefaultTransactionServer; } } @@ -57,7 +66,7 @@ public TransactionServer createTransactionServer(TxTransactionInfo info) throws /** 分布式事务已经开启,业务进行中 **/ if (info.getTxTransactionLocal() != null || StringUtils.isNotEmpty(info.getTxGroupId())) { //检查socket通讯是否正常 (第一次执行时启动txRunningTransactionServer的业务处理控制,然后嵌套调用其他事务的业务方法时都并到txInServiceTransactionServer业务处理下) - if (nettyService.checkState()) { + if (SocketManager.getInstance().isNetState()) { if (info.getTxTransactionLocal() != null) { return txDefaultTransactionServer; } else { @@ -68,7 +77,8 @@ public TransactionServer createTransactionServer(TxTransactionInfo info) throws } } } else { - throw new Exception("tx-manager not connected ,please check tx-manager server "); + logger.warn("tx-manager not connected."); + return txDefaultTransactionServer; } } /*********分布式事务处理逻辑*结束***********/ From 06d23af5ed31705cbb7e40b48d4f742c214c74c4 Mon Sep 17 00:00:00 2001 From: caisirius Date: Wed, 25 Jul 2018 11:25:05 +0800 Subject: [PATCH 08/83] =?UTF-8?q?txc=20=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tx/dubbo/filter/TransactionFilter.java | 1 + .../interceptor/TxManagerInterceptor.java | 4 +- .../interceptor/TxManagerInterceptor.java | 4 +- .../interceptor/TxManagerInterceptor.java | 4 +- .../tx/annotation/TxTransaction.java | 5 + .../tx/annotation/TxTransactionMode.java | 22 + .../tx/aop/bean/TxTransactionInfo.java | 9 + .../tx/aop/bean/TxTransactionLocal.java | 20 + .../tx/aop/service/AspectBeforeService.java | 2 +- .../service/impl/AspectBeforeServiceImpl.java | 10 +- .../TxRunningNoTransactionServerImpl.java | 1 + .../impl/TxRunningTransactionServerImpl.java | 1 + .../impl/TxStartTransactionServerImpl.java | 1 + .../tx/datasource/AbstractResourceProxy.java | 8 + .../src/main/resources/application.properties | 6 +- tx-plugins-db/pom.xml | 10 + .../relational/AbstractTransactionThread.java | 2 + .../relational/LCNDBConnection.java | 6 +- .../relational/LCNStartConnection.java | 4 +- .../relational/LCNTransactionDataSource.java | 13 +- .../relational/txc/AbstractTxcConnection.java | 409 +++++++++++++++++ .../datasource/relational/txc/ColumnInfo.java | 79 ++++ .../relational/txc/ITxcStatement.java | 21 + .../datasource/relational/txc/IndexInfo.java | 10 + .../relational/txc/TableMetaInfo.java | 123 +++++ .../relational/txc/TableMetaUtils.java | 144 ++++++ .../relational/txc/TxcDBConnection.java | 86 ++++ .../relational/txc/TxcPreparedStatement.java | 427 ++++++++++++++++++ .../txc/TxcRuntimeContextService.java | 14 + .../relational/txc/TxcSqlExecutor.java | 34 ++ .../relational/txc/TxcStatement.java | 340 ++++++++++++++ .../relational/txc/parser/AbstractParser.java | 187 ++++++++ .../relational/txc/parser/CommitInfo.java | 106 +++++ .../relational/txc/parser/DeleteParser.java | 71 +++ .../relational/txc/parser/ExecutePaser.java | 126 ++++++ .../relational/txc/parser/InsertParser.java | 94 ++++ .../txc/parser/ResultConvertUtils.java | 150 ++++++ .../relational/txc/parser/SQLType.java | 12 + .../relational/txc/parser/SqlUtils.java | 18 + .../relational/txc/parser/TxcField.java | 50 ++ .../relational/txc/parser/TxcLine.java | 46 ++ .../txc/parser/TxcRuntimeContext.java | 73 +++ .../relational/txc/parser/TxcTable.java | 74 +++ .../relational/txc/parser/UpdateParser.java | 126 ++++++ .../txc/rollback/AbstractRollback.java | 43 ++ .../txc/rollback/DeleteRollback.java | 91 ++++ .../relational/txc/rollback/DiffUtils.java | 108 +++++ .../txc/rollback/InsertRollback.java | 111 +++++ .../txc/rollback/TxcRollbackDataSource.java | 34 ++ .../txc/rollback/TxcRollbackService.java | 18 + .../txc/rollback/TxcRollbackServiceImpl.java | 56 +++ .../txc/rollback/UpdateRollback.java | 111 +++++ 52 files changed, 3510 insertions(+), 15 deletions(-) create mode 100644 tx-client/src/main/java/com/codingapi/tx/annotation/TxTransactionMode.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/AbstractTxcConnection.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/ColumnInfo.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/ITxcStatement.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/IndexInfo.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TableMetaInfo.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TableMetaUtils.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcDBConnection.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcPreparedStatement.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcRuntimeContextService.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcSqlExecutor.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcStatement.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/AbstractParser.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/CommitInfo.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/DeleteParser.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/ExecutePaser.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/InsertParser.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/ResultConvertUtils.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/SQLType.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/SqlUtils.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/TxcField.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/TxcLine.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/TxcRuntimeContext.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/TxcTable.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/UpdateParser.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/AbstractRollback.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/DeleteRollback.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/DiffUtils.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/InsertRollback.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackDataSource.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackService.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackServiceImpl.java create mode 100644 tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/UpdateRollback.java 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 index c0c757164..362f9facf 100644 --- 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 @@ -26,6 +26,7 @@ public Result invoke(Invoker invoker, Invocation invocation) throws RpcExcept 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/TxManagerInterceptor.java b/transaction-dubbo/src/main/java/com/codingapi/tx/dubbo/interceptor/TxManagerInterceptor.java index 2e684e77b..bc1fe84a8 100644 --- 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 @@ -22,10 +22,12 @@ public class TxManagerInterceptor { 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); + return aspectBeforeService.around(groupId,point,mode); } } 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 index 3e4b1cbd2..20f71e3df 100644 --- 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 @@ -23,10 +23,12 @@ public class TxManagerInterceptor { 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); + return aspectBeforeService.around(groupId, point, mode); } } diff --git a/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/interceptor/TxManagerInterceptor.java b/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/interceptor/TxManagerInterceptor.java index 497175330..1898d7498 100644 --- a/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/interceptor/TxManagerInterceptor.java +++ b/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/interceptor/TxManagerInterceptor.java @@ -22,11 +22,13 @@ public class TxManagerInterceptor { public Object around(ProceedingJoinPoint point) throws Throwable { String groupId = null; + String mode = null; try { RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); HttpServletRequest request = requestAttributes == null ? null : ((ServletRequestAttributes) requestAttributes).getRequest(); groupId = request == null ? null : request.getHeader("tx-group"); + mode = request == null ? null : request.getHeader("tx-mode"); }catch (Exception e){} - return aspectBeforeService.around(groupId, point); + return aspectBeforeService.around(groupId, point, mode); } } diff --git a/tx-client/src/main/java/com/codingapi/tx/annotation/TxTransaction.java b/tx-client/src/main/java/com/codingapi/tx/annotation/TxTransaction.java index 6540ddc45..ab707ca36 100644 --- a/tx-client/src/main/java/com/codingapi/tx/annotation/TxTransaction.java +++ b/tx-client/src/main/java/com/codingapi/tx/annotation/TxTransaction.java @@ -32,4 +32,9 @@ */ Class[] noRollbackFor() default {}; + /** + * 事务模式 仅在事务发起方配置有效 + * @return + */ + TxTransactionMode mode() default TxTransactionMode.TX_MODE_LCN; } diff --git a/tx-client/src/main/java/com/codingapi/tx/annotation/TxTransactionMode.java b/tx-client/src/main/java/com/codingapi/tx/annotation/TxTransactionMode.java new file mode 100644 index 000000000..1a549edea --- /dev/null +++ b/tx-client/src/main/java/com/codingapi/tx/annotation/TxTransactionMode.java @@ -0,0 +1,22 @@ +package com.codingapi.tx.annotation; + +/** + * + * + * @author caican + * 2018/7/24 + */ +public enum TxTransactionMode { + /** LCN 模式 */ + TX_MODE_LCN("LCN 模式,2阶段提交 读提交"), + + /** TXC 模式 */ + TX_MODE_TXC("TXC 模式,未提交读(READ UNCOMMITTED)"); + + + private String description; + + TxTransactionMode(String description) { + this.description = description; + } +} 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 7c4c87c41..6d229b286 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 @@ -1,6 +1,7 @@ package com.codingapi.tx.aop.bean; import com.codingapi.tx.annotation.TxTransaction; +import com.codingapi.tx.annotation.TxTransactionMode; import com.codingapi.tx.model.TransactionInvocation; @@ -24,6 +25,7 @@ public class TxTransactionInfo { private TransactionInvocation invocation; + private TxTransactionMode mode; public TxTransactionInfo(TxTransaction transaction, TxTransactionLocal txTransactionLocal, TransactionInvocation invocation, String txGroupId) { this.transaction = transaction; @@ -32,6 +34,13 @@ public TxTransactionInfo(TxTransaction transaction, TxTransactionLocal txTransac this.invocation = invocation; } + public TxTransactionMode getMode() { + return mode; + } + + public void setMode(TxTransactionMode mode) { + this.mode = mode; + } public TxTransaction getTransaction() { return transaction; 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 d5998d716..e134b5ea8 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 @@ -1,6 +1,7 @@ package com.codingapi.tx.aop.bean; import com.alibaba.fastjson.JSONObject; +import com.codingapi.tx.annotation.TxTransactionMode; import com.codingapi.tx.framework.utils.SocketManager; import com.codingapi.tx.model.Request; import org.apache.commons.lang.StringUtils; @@ -48,6 +49,8 @@ public class TxTransactionLocal { private boolean readOnly = false; + private TxTransactionMode mode; + public boolean isHasIsGroup() { return hasIsGroup; } @@ -106,6 +109,13 @@ public static void setCurrent(TxTransactionLocal current) { currentLocal.set(current); } + public TxTransactionMode getMode() { + return mode; + } + + public void setMode(TxTransactionMode mode) { + this.mode = mode; + } public void putLoadBalance(String key, String data){ cacheModelInfo.put(key,data); @@ -157,4 +167,14 @@ public void setReadOnly(boolean readOnly) { this.readOnly = readOnly; } + public static boolean isInTxcTransaction() { + TxTransactionLocal local = current(); + if (local != null + && local.mode != null + && local.mode == TxTransactionMode.TX_MODE_TXC + && !local.isReadOnly()) { + return true; + } + return false; + } } diff --git a/tx-client/src/main/java/com/codingapi/tx/aop/service/AspectBeforeService.java b/tx-client/src/main/java/com/codingapi/tx/aop/service/AspectBeforeService.java index 419fbba93..f8dc69d7d 100644 --- a/tx-client/src/main/java/com/codingapi/tx/aop/service/AspectBeforeService.java +++ b/tx-client/src/main/java/com/codingapi/tx/aop/service/AspectBeforeService.java @@ -7,5 +7,5 @@ */ public interface AspectBeforeService { - Object around(String groupId, ProceedingJoinPoint point) throws Throwable; + Object around(String groupId, ProceedingJoinPoint point, String mode) throws Throwable; } diff --git a/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/AspectBeforeServiceImpl.java b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/AspectBeforeServiceImpl.java index 098e911d5..7bc860b2f 100644 --- a/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/AspectBeforeServiceImpl.java +++ b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/AspectBeforeServiceImpl.java @@ -1,6 +1,7 @@ package com.codingapi.tx.aop.service.impl; import com.codingapi.tx.annotation.TxTransaction; +import com.codingapi.tx.annotation.TxTransactionMode; import com.codingapi.tx.aop.bean.TxTransactionInfo; import com.codingapi.tx.aop.bean.TxTransactionLocal; import com.codingapi.tx.aop.service.AspectBeforeService; @@ -28,8 +29,8 @@ public class AspectBeforeServiceImpl implements AspectBeforeService { private Logger logger = LoggerFactory.getLogger(AspectBeforeServiceImpl.class); - - public Object around(String groupId, ProceedingJoinPoint point) throws Throwable { + @Override + public Object around(String groupId, ProceedingJoinPoint point, String mode) throws Throwable { MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); @@ -46,6 +47,11 @@ public Object around(String groupId, ProceedingJoinPoint point) throws Throwable TransactionInvocation invocation = new TransactionInvocation(clazz, thisMethod.getName(), thisMethod.toString(), args, method.getParameterTypes()); TxTransactionInfo info = new TxTransactionInfo(transaction,txTransactionLocal,invocation,groupId); + try { + info.setMode(TxTransactionMode.valueOf(mode)); + } catch (Exception e) { + info.setMode(TxTransactionMode.TX_MODE_LCN); + } TransactionServer server = transactionServerFactoryService.createTransactionServer(info); 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 a26372a49..a1518d92a 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 @@ -34,6 +34,7 @@ public Object execute(final ProceedingJoinPoint point, final TxTransactionInfo i txTransactionLocal.setHasStart(false); txTransactionLocal.setKid(kid); txTransactionLocal.setMaxTimeOut(Constants.txServer.getCompensateMaxWaitTime()); + txTransactionLocal.setMode(info.getMode()); TxTransactionLocal.setCurrent(txTransactionLocal); try { 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 b2a606bf7..c5b6aeeb1 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 @@ -54,6 +54,7 @@ public Object execute(final ProceedingJoinPoint point, final TxTransactionInfo i txTransactionLocal.setKid(kid); txTransactionLocal.setHasIsGroup(isHasIsGroup); txTransactionLocal.setMaxTimeOut(Constants.txServer.getCompensateMaxWaitTime()); + txTransactionLocal.setMode(info.getMode()); TxTransactionLocal.setCurrent(txTransactionLocal); 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 ba79c537b..2dfa94441 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 @@ -51,6 +51,7 @@ 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.setCurrent(txTransactionLocal); diff --git a/tx-client/src/main/java/com/codingapi/tx/datasource/AbstractResourceProxy.java b/tx-client/src/main/java/com/codingapi/tx/datasource/AbstractResourceProxy.java index bcfe99551..e72ba382f 100644 --- a/tx-client/src/main/java/com/codingapi/tx/datasource/AbstractResourceProxy.java +++ b/tx-client/src/main/java/com/codingapi/tx/datasource/AbstractResourceProxy.java @@ -1,6 +1,7 @@ package com.codingapi.tx.datasource; +import com.codingapi.tx.annotation.TxTransactionMode; import com.codingapi.tx.aop.bean.TxTransactionLocal; import com.codingapi.tx.datasource.service.DataSourceService; import com.lorne.core.framework.utils.task.Task; @@ -64,6 +65,8 @@ public void close(ILCNResource connection) { protected abstract C createLcnConnection(C connection, TxTransactionLocal txTransactionLocal); + protected abstract C createTxcConnection(C connection, TxTransactionLocal txTransactionLocal); + protected abstract void initDbType(); @@ -95,6 +98,11 @@ protected ILCNResource loadConnection(){ private C createConnection(TxTransactionLocal txTransactionLocal, C connection){ + if (txTransactionLocal.getMode() != null + && txTransactionLocal.getMode() == TxTransactionMode.TX_MODE_TXC) { + // txc 模式下没有maxCount的限制 直接创建 + return createTxcConnection(connection, txTransactionLocal); + } if (nowCount == maxCount) { for (int i = 0; i < maxWaitTime; i++) { for(int j=0;j<100;j++){ diff --git a/tx-manager/src/main/resources/application.properties b/tx-manager/src/main/resources/application.properties index 0fd633269..b12f29015 100644 --- a/tx-manager/src/main/resources/application.properties +++ b/tx-manager/src/main/resources/application.properties @@ -1,7 +1,7 @@ #######################################txmanager-start################################################# #服务端口 -server.port=8899 +server.port=7000 #tx-manager不得修改 spring.application.name=tx-manager @@ -16,7 +16,7 @@ spring.resources.static-locations=classpath:/static/ #spring.cloud.zookeeper.discovery.preferIpAddress = true #eureka 地址 -eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/ +eureka.client.service-url.defaultZone=http://127.0.0.1:7000/eureka/ eureka.instance.prefer-ip-address=true #######################################redis-start################################################# @@ -30,7 +30,7 @@ eureka.instance.prefer-ip-address=true ##redis 单点环境配置 #redis #redis主机地址 -spring.redis.host=127.0.0.1 +spring.redis.host=172.26.8.150 #redis主机端口 spring.redis.port=6379 #redis链接密码 diff --git a/tx-plugins-db/pom.xml b/tx-plugins-db/pom.xml index 36a2b4d10..836925d8e 100644 --- a/tx-plugins-db/pom.xml +++ b/tx-plugins-db/pom.xml @@ -25,6 +25,16 @@ tx-client ${lcn.last.version} + + com.alibaba + druid + 1.0.19 + + + com.fasterxml.jackson.core + jackson-databind + 2.8.10 + diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/AbstractTransactionThread.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/AbstractTransactionThread.java index 75f10f82a..697f8cf5f 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/AbstractTransactionThread.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/AbstractTransactionThread.java @@ -1,5 +1,6 @@ package com.codingapi.tx.datasource.relational; +import com.codingapi.tx.aop.bean.TxTransactionLocal; import com.codingapi.tx.framework.thread.HookRunnable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,6 +25,7 @@ protected void startRunnable(){ Runnable runnable = new HookRunnable() { @Override public void run0() { + TxTransactionLocal.setCurrent(null); try { transaction(); } catch (Exception e) { 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 8ded34e57..6a7f231b2 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 @@ -157,7 +157,7 @@ public void run() { } }, maxOutTime); - System.out.println("transaction is wait for TxManager notify, groupId : " + getGroupId()); + logger.info("transaction is wait for TxManager notify, groupId {}", getGroupId()); waitTask.awaitTask(); @@ -173,10 +173,10 @@ public void run() { rollbackConnection(); } - System.out.println("lcn transaction over, res -> groupId:"+getGroupId()+" and state is "+(rs==1?"commit":"rollback")); + logger.info("lcn transaction over, res -> groupId:"+getGroupId()+" and state is "+(rs==1?"commit":"rollback")); }catch (SQLException e){ - System.out.println("lcn transaction over,but connection is closed, res -> groupId:"+getGroupId()); + logger.info("lcn transaction over,but connection is closed, res -> groupId:"+getGroupId()); waitTask.setState(TaskState.connectionError.getCode()); } 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 861e43d89..536cb5b29 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 @@ -147,7 +147,7 @@ public void transaction()throws SQLException{ return; } - System.out.println(" start transaction is wait for TxManager notify, groupId : " + getGroupId()); + logger.info(" start transaction is wait for TxManager notify, groupId : " + getGroupId()); waitTask.awaitTask(); @@ -169,7 +169,7 @@ public void transaction()throws SQLException{ } else { rollbackConnection(); } - System.out.println(" lcn start transaction over, res -> groupId:"+getGroupId()+" and state is "+(rs==1?"commit":"rollback")); + logger.info(" lcn start transaction over, res -> groupId:"+getGroupId()+" and state is "+(rs==1?"commit":"rollback")); }catch (SQLException e){ diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/LCNTransactionDataSource.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/LCNTransactionDataSource.java index 2bbf22bba..270f9fafc 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/LCNTransactionDataSource.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/LCNTransactionDataSource.java @@ -4,8 +4,11 @@ import com.codingapi.tx.aop.bean.TxTransactionLocal; import com.codingapi.tx.datasource.AbstractResourceProxy; import com.codingapi.tx.datasource.ILCNConnection; +import com.codingapi.tx.datasource.relational.txc.TxcDBConnection; +import com.codingapi.tx.datasource.relational.txc.rollback.TxcRollbackService; import org.aspectj.lang.ProceedingJoinPoint; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.sql.Connection; @@ -23,7 +26,8 @@ public class LCNTransactionDataSource extends AbstractResourceProxy" + txTransactionLocal.getGroupId()); + return txc; + } + @Override protected void initDbType() { diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/AbstractTxcConnection.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/AbstractTxcConnection.java new file mode 100644 index 000000000..c68e88c1c --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/AbstractTxcConnection.java @@ -0,0 +1,409 @@ +package com.codingapi.tx.datasource.relational.txc; + +import com.codingapi.tx.aop.bean.TxTransactionLocal; +import com.codingapi.tx.datasource.relational.AbstractTransactionThread; +import com.codingapi.tx.datasource.relational.LCNConnection; +import com.codingapi.tx.datasource.relational.txc.parser.TxcRuntimeContext; +import com.codingapi.tx.datasource.relational.txc.rollback.TxcRollbackService; +import com.codingapi.tx.datasource.service.DataSourceService; +import com.codingapi.tx.framework.task.TaskGroup; +import com.codingapi.tx.framework.task.TaskGroupManager; +import com.codingapi.tx.framework.task.TxTask; +import com.codingapi.tx.framework.thread.HookRunnable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Array; +import java.sql.Blob; +import java.sql.CallableStatement; +import java.sql.Clob; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.NClob; +import java.sql.PreparedStatement; +import java.sql.SQLClientInfoException; +import java.sql.SQLException; +import java.sql.SQLWarning; +import java.sql.SQLXML; +import java.sql.Savepoint; +import java.sql.Statement; +import java.sql.Struct; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.Executor; + + +/** + * created at 20171116 + * @author caisirius + */ +public abstract class AbstractTxcConnection extends AbstractTransactionThread + implements LCNConnection,TxcRuntimeContextService { + + private static final Logger logger = LoggerFactory.getLogger(AbstractTxcConnection.class); + + private boolean readOnly = false; + + private Connection connection; + + DataSourceService dataSourceService; + + TxTask waitTask; + + int maxOutTime; + + String groupId; + + TxcRuntimeContext txcRuntimeContext; + + TxcRollbackService txcRollbackService; + + @Override + public TxcRuntimeContext getTxcRuntimeContext() { + if (txcRuntimeContext == null) { + this.txcRuntimeContext = new TxcRuntimeContext(); + txcRuntimeContext.setGroupId(groupId); + txcRuntimeContext.setBranchId(waitTask.getKey()); + + } + return txcRuntimeContext; + } + + @Override + public String getGroupId() { + return groupId; + } + + @Override + public TxTask getWaitTask() { + return waitTask; + } + + + + public AbstractTxcConnection(Connection connection, TxTransactionLocal transactionLocal, + DataSourceService dataSourceService, + TxcRollbackService txcRollbackService) { + readOnly = transactionLocal.isReadOnly(); + this.connection = connection; + this.dataSourceService = dataSourceService; + this.txcRollbackService = txcRollbackService; + + groupId = transactionLocal.getGroupId(); + maxOutTime = transactionLocal.getMaxTimeOut(); + + TaskGroup taskGroup; + if (transactionLocal.getKid() == null) { + logger.info("this is txc start-connection"); + taskGroup = TaskGroupManager.getInstance().createTask(groupId, transactionLocal.getType()); + } else { + taskGroup = TaskGroupManager.getInstance().createTask(transactionLocal.getKid(), transactionLocal.getType()); + } + waitTask = taskGroup.getCurrent(); + } + + // commit() 里要做工作 + @Override + public void commit() throws SQLException { + logger.info("commit"); + + connection.commit(); + + if (readOnly) { + return; + } + startRunnable(); + } + + @Override + public void rollback() throws SQLException { + connection.rollback(); + } + + @Override + public void close() throws SQLException { + connection.close(); + } + + @Override + public void setAutoCommit(boolean autoCommit) throws SQLException { + connection.setAutoCommit(false); + } + + + // TODO Statement CallableStatement 也应该自定义!! + @Override + public CallableStatement prepareCall(String sql) throws SQLException { + return connection.prepareCall(sql); + } + + @Override + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { + return connection.prepareCall(sql, resultSetType, resultSetConcurrency); + } + + @Override + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + return connection.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability); + } + + /*****default*******/ + @Override + public String nativeSQL(String sql) throws SQLException { + return connection.nativeSQL(sql); + } + + + @Override + public boolean getAutoCommit() throws SQLException { + return connection.getAutoCommit(); + } + + + @Override + public boolean isClosed() throws SQLException { + return connection.isClosed(); + } + + @Override + public DatabaseMetaData getMetaData() throws SQLException { + return connection.getMetaData(); + } + + @Override + public void setReadOnly(boolean readOnly) throws SQLException { + if(readOnly) { + this.readOnly = readOnly; + logger.debug("setReadOnly - >" + readOnly); + connection.setReadOnly(readOnly); + TxTransactionLocal txTransactionLocal = TxTransactionLocal.current(); + txTransactionLocal.setReadOnly(readOnly); + } + } + + @Override + public boolean isReadOnly() throws SQLException { + return connection.isReadOnly(); + } + + @Override + public void setCatalog(String catalog) throws SQLException { + connection.setCatalog(catalog); + } + + @Override + public String getCatalog() throws SQLException { + return connection.getCatalog(); + } + + @Override + public void setTransactionIsolation(int level) throws SQLException { + connection.setTransactionIsolation(level); + } + + @Override + public int getTransactionIsolation() throws SQLException { + return connection.getTransactionIsolation(); + } + + @Override + public SQLWarning getWarnings() throws SQLException { + return connection.getWarnings(); + } + + @Override + public void clearWarnings() throws SQLException { + connection.clearWarnings(); + } + + @Override + public Map> getTypeMap() throws SQLException { + return connection.getTypeMap(); + } + + @Override + public void setTypeMap(Map> map) throws SQLException { + connection.setTypeMap(map); + } + + @Override + public void setHoldability(int holdability) throws SQLException { + connection.setHoldability(holdability); + } + + @Override + public int getHoldability() throws SQLException { + return connection.getHoldability(); + } + + @Override + public Savepoint setSavepoint() throws SQLException { + return connection.setSavepoint(); + } + + @Override + public Savepoint setSavepoint(String name) throws SQLException { + return connection.setSavepoint(name); + } + + @Override + public void rollback(Savepoint savepoint) throws SQLException { + connection.rollback(savepoint); + } + + @Override + public void releaseSavepoint(Savepoint savepoint) throws SQLException { + connection.releaseSavepoint(savepoint); + } + + @Override + public Clob createClob() throws SQLException { + return connection.createClob(); + } + + @Override + public Blob createBlob() throws SQLException { + return connection.createBlob(); + } + + @Override + public NClob createNClob() throws SQLException { + return connection.createNClob(); + } + + @Override + public SQLXML createSQLXML() throws SQLException { + return connection.createSQLXML(); + } + + @Override + public boolean isValid(int timeout) throws SQLException { + return connection.isValid(timeout); + } + + @Override + public void setClientInfo(String name, String value) throws SQLClientInfoException { + connection.setClientInfo(name, value); + } + + @Override + public void setClientInfo(Properties properties) throws SQLClientInfoException { + connection.setClientInfo(properties); + } + + @Override + public String getClientInfo(String name) throws SQLException { + return connection.getClientInfo(name); + } + + @Override + public Properties getClientInfo() throws SQLException { + return connection.getClientInfo(); + } + + @Override + public Array createArrayOf(String typeName, Object[] elements) throws SQLException { + return connection.createArrayOf(typeName, elements); + } + + @Override + public Struct createStruct(String typeName, Object[] attributes) throws SQLException { + return connection.createStruct(typeName, attributes); + } + + @Override + public void setSchema(String schema) throws SQLException { + connection.setSchema(schema); + } + + @Override + public String getSchema() throws SQLException { + return connection.getSchema(); + } + + @Override + public void abort(Executor executor) throws SQLException { + connection.abort(executor); + } + + @Override + public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException { + connection.setNetworkTimeout(executor, milliseconds); + } + + @Override + public int getNetworkTimeout() throws SQLException { + return connection.getNetworkTimeout(); + } + + @Override + public T unwrap(Class iface) throws SQLException { + return connection.unwrap(iface); + } + + @Override + public boolean isWrapperFor(Class iface) throws SQLException { + return connection.isWrapperFor(iface); + } + + /***** wrap *******/ + + @Override + public Statement createStatement() throws SQLException { + Statement statement = connection.createStatement(); + return new TxcStatement(statement , this); + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + Statement statement = connection.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability); + return new TxcStatement(statement , this); + } + + @Override + public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { + Statement statement = connection.createStatement(resultSetType, resultSetConcurrency); + return new TxcStatement(statement , this); + } + + @Override + public PreparedStatement prepareStatement(String sql) throws SQLException { + // 这里返回自定义的 PreparedStatement + PreparedStatement localPreparedStatement = connection.prepareStatement(sql); + return new TxcPreparedStatement(localPreparedStatement, this, sql); + } + + @Override + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws + SQLException { + PreparedStatement localPreparedStatement = connection.prepareStatement(sql, resultSetType, resultSetConcurrency); + + return new TxcPreparedStatement(localPreparedStatement, this, sql); + + } + + @Override + public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { + PreparedStatement localPreparedStatement = connection.prepareStatement(sql, autoGeneratedKeys); + return new TxcPreparedStatement(localPreparedStatement, this, sql); + } + + @Override + public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { + PreparedStatement localPreparedStatement = connection.prepareStatement(sql, columnIndexes); + return new TxcPreparedStatement(localPreparedStatement, this, sql); + } + + @Override + public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { + PreparedStatement localPreparedStatement = connection.prepareStatement(sql, columnNames); + return new TxcPreparedStatement(localPreparedStatement, this, sql); + } + + @Override + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + PreparedStatement localPreparedStatement = connection.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability); + return new TxcPreparedStatement(localPreparedStatement, this, sql); + } + +} 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 new file mode 100644 index 000000000..06f8fd42a --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/ColumnInfo.java @@ -0,0 +1,79 @@ +package com.codingapi.tx.datasource.relational.txc; + +/** + * [类描述] + * + * @author caican + * @date 17/12/23 + */ +public class ColumnInfo { + private String tableName; + private String columnName; + private int type; + /** + * -1 : no key + * 0: PRI 主键索引 + * 1: UNI 唯一索引 + * 2: MUL 普通索引(联合索引) + */ + private int keyType; + private boolean isAllowNull; + private String defaultValue; + private String extra; + + public int getKeyType() { + return keyType; + } + + public void setKeyType(int keyType) { + this.keyType = keyType; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public String getColumnName() { + return columnName; + } + + public void setColumnName(String columnName) { + this.columnName = columnName; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public boolean isAllowNull() { + return isAllowNull; + } + + public void setAllowNull(boolean allowNull) { + isAllowNull = allowNull; + } + + public String getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } + + public String getExtra() { + return extra; + } + + public void setExtra(String extra) { + this.extra = extra; + } +} 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 new file mode 100644 index 000000000..0fa72f2d1 --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/ITxcStatement.java @@ -0,0 +1,21 @@ +package com.codingapi.tx.datasource.relational.txc; + +import java.sql.Statement; + +/** + * [类描述] + * + * @author caican + * @date 17/12/4 + */ +public interface ITxcStatement extends Statement { + /** 返回执行的SQL + * @return SQL语句 + */ + String getSql(); + + Statement getStatement(); + + AbstractTxcConnection getTxcDBConnection(); + +} 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 new file mode 100644 index 000000000..2822dae85 --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/IndexInfo.java @@ -0,0 +1,10 @@ +package com.codingapi.tx.datasource.relational.txc; + +/** + * [类描述] + * + * @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 new file mode 100644 index 000000000..731b71c0f --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TableMetaInfo.java @@ -0,0 +1,123 @@ +package com.codingapi.tx.datasource.relational.txc; + +import java.util.HashMap; +import java.util.Map; + +/** + * [表描述] + * + * @author caican + * @date 17/12/23 + */ +public class TableMetaInfo { + /** + * SchemaName (if empty, set to CatalogName) + */ + private String schemaName; + /** + * TableName + */ + private String tableName; + + /** + * 列信息 + */ + private Map columnInfoMap = new HashMap<>(); + /** + * 索引 + */ + private Map indexInfoMap = new HashMap<>(); + + + public TableMetaInfo() { + } + + /** + * @param name + * @return + */ + public ColumnInfo getColumnByName(String name) { + String str = name.toUpperCase(); + ColumnInfo ret = this.columnInfoMap.get(str); + if (ret == null) { + if (name.charAt(0) == '`') { + ret = this.columnInfoMap.get(str.substring(1, name.length() - 1)); + } else { + ret = this.columnInfoMap.get("`" + str + "`"); + } + } + return ret; + } + + + public Map getPrimaryKey() { + HashMap ret = new HashMap<>(); + + for (Map.Entry entry : this.columnInfoMap.entrySet()) { + ColumnInfo columnInfo = entry.getValue(); + if (columnInfo.getKeyType() == 0) { + ret.put(entry.getKey(), columnInfo); + } + } + + if (ret.size() > 1) { + throw new RuntimeException("multi pks not support yet."); + } + return ret; + } + + public String getPrimaryKeyName() { + Map primaryKey = getPrimaryKey(); + + if (primaryKey.entrySet().size() > 1) { + throw new RuntimeException("multi pks not support yet."); + + } + + Map.Entry next = primaryKey.entrySet().iterator().next(); + return next.getKey(); + } + + public String getAutoIncrementPrimaryKey() { + + for (Map.Entry entry : this.columnInfoMap.entrySet()) { + ColumnInfo columnInfo = entry.getValue(); + if (columnInfo.getKeyType() == 0 && columnInfo.getExtra().equals("auto_increment")) { + return entry.getKey(); + } + } + return null; + } + + public String getSchemaName() { + return schemaName; + } + + public void setSchemaName(String schemaName) { + this.schemaName = schemaName; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public Map getColumnInfoMap() { + return columnInfoMap; + } + + public void setColumnInfoMap(Map columnInfoMap) { + this.columnInfoMap = columnInfoMap; + } + + public Map getIndexInfoMap() { + return indexInfoMap; + } + + public void setIndexInfoMap(Map indexInfoMap) { + this.indexInfoMap = indexInfoMap; + } +} 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 new file mode 100644 index 000000000..c82e13866 --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TableMetaUtils.java @@ -0,0 +1,144 @@ +package com.codingapi.tx.datasource.relational.txc; + +import com.codingapi.tx.aop.bean.TxTransactionLocal; +import com.lorne.core.framework.utils.config.ConfigUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.HashMap; +import java.util.concurrent.ConcurrentHashMap; + +/** + * [类描述] + * + * @author caican + * @date 17/12/23 + */ +public class TableMetaUtils { + + private static final Logger logger = LoggerFactory.getLogger(TableMetaUtils.class); + + private static final ConcurrentHashMap tableMetaInfoCache = + new ConcurrentHashMap<>(); + //TODO 定期让缓存失效 + + private static String dbType; + + + public static TableMetaInfo getTableMetaInfo(Connection connection, String tableName) { + if (StringUtils.isEmpty(tableName)) { + throw new RuntimeException("TableMeta cannot fetched without tableName"); + } + if (connection == null) { + throw new RuntimeException("TableMeta cannot fetched without Connection"); + } + String databaseName = null; + try { + databaseName = getDbNameFromUrl(connection.getMetaData().getURL()); + } catch (Exception e) { } + if (StringUtils.isEmpty(databaseName)) { + databaseName = "NULL"; + } + TableMetaInfo ret; + String fullTableName = databaseName + "." + tableName; + + // 先从本地缓存拿 + ret = tableMetaInfoCache.get(fullTableName); + if (ret == null) { + try { + logger.info("meta is null, fetch schema of " + tableName); + ret = fetchSchema(connection, tableName); + ret.setTableName(tableName); + ret.setSchemaName(databaseName); + + tableMetaInfoCache.putIfAbsent(fullTableName, ret); + } catch (SQLException e) { + logger.error("tableMeta error", e); + } + } + if (ret == null) { + throw new RuntimeException(String.format("[groupId:%s]get tablemeta failed", + TxTransactionLocal.current().getGroupId())); + } + + return ret; + } + + public static String getDbNameFromUrl (String url) { + if (StringUtils.isEmpty(url)) { + return null; + } + int start = 0; + boolean isThreeFound = true; // 要找到3个 '/' + for (int i=0; i<3;i++) { + int index = url.indexOf('/', start+1); + if (index == -1) { + isThreeFound = false; + break; + } + start = index; + } + if (! isThreeFound) { + return null; + } + + int index = url.indexOf('?', start); + String ret; + if (index == -1) { + ret = url.substring(start +1); + } else { + ret = url.substring(start + 1, index); + } + return ret; + } + + private static TableMetaInfo fetchSchema(Connection connection, String tableName) + throws SQLException { + // TODO 支持 mysql以外的 + + return fetchSchemaMysql(connection, tableName); + } + + private static TableMetaInfo fetchSchemaMysql(Connection connection, String tableName) + throws SQLException { + Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery("desc " + tableName); + TableMetaInfo tableMetaInfo = new TableMetaInfo(); + tableMetaInfo.setColumnInfoMap(new HashMap()); + while (resultSet.next()) { + ColumnInfo columnInfo = new ColumnInfo(); + columnInfo.setTableName(tableName); + columnInfo.setColumnName(resultSet.getString("Field")); + boolean isAllowNull = true; + if ("NO".equalsIgnoreCase(resultSet.getString("Null"))) { + isAllowNull = false; + } + columnInfo.setAllowNull(isAllowNull); + String key = resultSet.getString("Key"); + int iKey = -1; + if ("PRI".equalsIgnoreCase(key)) { + iKey = 0; + } else if ("UNI".equalsIgnoreCase(key)) { + iKey = 1; + } else if ("MUL".equalsIgnoreCase(key)) { + iKey = 2; + } + columnInfo.setKeyType(iKey);// 这个最重要 + columnInfo.setExtra(resultSet.getString("Extra")); + + //TODO + // resultSet.getString("Type"); +// columnInfo.setType(); + + tableMetaInfo.getColumnInfoMap().put(columnInfo.getColumnName(), columnInfo); + } + return tableMetaInfo; + } + + +} diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcDBConnection.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcDBConnection.java new file mode 100644 index 000000000..06873d328 --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcDBConnection.java @@ -0,0 +1,86 @@ +package com.codingapi.tx.datasource.relational.txc; + +import com.alibaba.fastjson.JSON; +import com.codingapi.tx.aop.bean.TxTransactionLocal; +import com.codingapi.tx.datasource.relational.txc.parser.CommitInfo; +import com.codingapi.tx.datasource.relational.txc.rollback.TxcRollbackService; +import com.codingapi.tx.datasource.service.DataSourceService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; +import java.util.Timer; +import java.util.TimerTask; + +/** + * create by caisirius on 2017/11/28 + */ + +public class TxcDBConnection extends AbstractTxcConnection { + private Logger logger = LoggerFactory.getLogger(TxcDBConnection.class); + + public TxcDBConnection(Connection connection, TxTransactionLocal txTransactionLocal, + DataSourceService dataSourceService, + TxcRollbackService txcRollbackService) { + super(connection, txTransactionLocal, dataSourceService, txcRollbackService); + } + + @Override + public void transaction() { + if (waitTask == null) { + logger.warn("waitTask is null"); + return; + } + + // start 结束就是全部事务的结束表示,考虑start挂掉的情况 + Timer timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + logger.warn("txc自动回滚->" + getGroupId()); + dataSourceService.schedule(getGroupId(), waitTask); + } + }, maxOutTime); + + logger.info("waiting for TxManager notify, groupId {}, timeout {}", getGroupId(), maxOutTime); + waitTask.awaitTask(); + + timer.cancel(); + + int rs = waitTask.getState(); + + logger.info("lcn txc transaction over, groupId {} and state is {}",getGroupId(),(rs==1?"commit":"rollback")); + // 提交 + if (rs == 1) { + // do nothing + } else { + try { + rollbackConnection(); + } catch (Exception e) { + logger.error("rollback error", e); + } + } + + waitTask.remove(); + } + + @Override + protected void closeConnection() throws SQLException { + // do nothing + } + + @Override + protected void rollbackConnection() throws SQLException { + logger.info("doTxcRollback kid:{},context:{}", waitTask.getKey() + , JSON.toJSONString(txcRuntimeContext)); + List commitInfos = txcRuntimeContext.getInfo(); + + // 逆序回滚 + for (int i = commitInfos.size() - 1; i >= 0; i--) { + txcRollbackService.rollback(commitInfos.get(i)); + } + } + +} 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 new file mode 100644 index 000000000..9e20512ce --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcPreparedStatement.java @@ -0,0 +1,427 @@ +package com.codingapi.tx.datasource.relational.txc; + +import com.codingapi.tx.datasource.relational.txc.parser.ExecutePaser; +import com.codingapi.tx.datasource.relational.txc.parser.SQLType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.InputStream; +import java.io.Reader; +import java.math.BigDecimal; +import java.net.URL; +import java.sql.Array; +import java.sql.Blob; +import java.sql.Clob; +import java.sql.Date; +import java.sql.NClob; +import java.sql.ParameterMetaData; +import java.sql.PreparedStatement; +import java.sql.Ref; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.RowId; +import java.sql.SQLException; +import java.sql.SQLXML; +import java.sql.Time; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +/** + * [类描述] + * + * @author caican + * @date 17/11/28 + * @title [confluence页面的title] + */ +public class TxcPreparedStatement extends TxcStatement implements PreparedStatement { + + private static final Logger logger = LoggerFactory.getLogger(TxcPreparedStatement.class); + + public TxcPreparedStatement(PreparedStatement localPreparedStatement, AbstractTxcConnection abstractTxcConnection, + String sql) { + super(localPreparedStatement, abstractTxcConnection); + this.sql = sql; + } + + /** + * 把这个参数缓存下来 有什么用? + */ + private List paramsList = new ArrayList<>(); + + public int getParameterCount() throws SQLException { + return getParameterMetaData().getParameterCount(); + } + + public synchronized List getParamsList() { + return this.paramsList; + } + + private void addParam(int paramInt, Object paramObject1, Object paramObject2, Object paramObject3) + throws SQLException { + List paramsList = getParamsList(); + paramsList.add(paramObject1); + } + + private void addParam(int paramInt, Object paramObject1, Object paramObject2) throws SQLException { + List paramsList = getParamsList(); + paramsList.add(paramObject1); + } + + private void addParam(int paramInt, Object paramObject) throws SQLException { + List paramsList = getParamsList(); + paramsList.add(paramObject); + } + + @Override + public void addBatch() throws SQLException { + ((PreparedStatement) this.statement).addBatch(); + } + + @Override + public void clearParameters() throws SQLException { + ((PreparedStatement) this.statement).clearParameters(); + } + + @Override + public boolean execute() throws SQLException { + if (isInTxcTransaction()) { + SQLType sqlType = ExecutePaser.parse(this); + boolean execute = ((PreparedStatement) this.statement).execute(); + ExecutePaser.after(this, sqlType); + return execute; + } + + return ((PreparedStatement) this.statement).execute(); + } + + @Override + public ResultSet executeQuery() throws SQLException { + // 查询语句也要包装么? + return ((PreparedStatement) this.statement).executeQuery(); + } + + @Override + public int[] executeBatch() throws SQLException { + if (isInTxcTransaction()) { + ExecutePaser.parse(this); + } + return this.statement.executeBatch(); + } + + @Override + public int executeUpdate() throws SQLException { + if (isInTxcTransaction()) { + SQLType sqlType = ExecutePaser.parse(this); + int num = ((PreparedStatement) this.statement).executeUpdate(); + ExecutePaser.after(this, sqlType); + return num; + } + + return ((PreparedStatement) this.statement).executeUpdate(); + } + + @Override + public ResultSetMetaData getMetaData() throws SQLException { + return ((PreparedStatement) this.statement).getMetaData(); + } + + @Override + public ParameterMetaData getParameterMetaData() throws SQLException { + return ((PreparedStatement) this.statement).getParameterMetaData(); + } + + @Override + public void setArray(int paramInt, Array paramArray) throws SQLException { + addParam(paramInt, paramArray); + ((PreparedStatement) this.statement).setArray(paramInt, paramArray); + } + + @Override + public void setAsciiStream(int paramInt, InputStream paramInputStream) throws SQLException { + addParam(paramInt, paramInputStream); + ((PreparedStatement) this.statement).setAsciiStream(paramInt, paramInputStream); + } + + @Override + public void setAsciiStream(int paramInt1, InputStream paramInputStream, int paramInt2) throws SQLException { + addParam(paramInt1, paramInputStream, paramInt2); + ((PreparedStatement) this.statement).setAsciiStream(paramInt1, paramInputStream, paramInt2); + } + + @Override + public void setAsciiStream(int paramInt, InputStream paramInputStream, long paramLong) throws SQLException { + addParam(paramInt, paramInputStream, paramLong); + ((PreparedStatement) this.statement).setAsciiStream(paramInt, paramInputStream, paramLong); + } + + @Override + public void setBigDecimal(int paramInt, BigDecimal paramBigDecimal) throws SQLException { + addParam(paramInt, paramBigDecimal); + ((PreparedStatement) this.statement).setBigDecimal(paramInt, paramBigDecimal); + } + + @Override + public void setBinaryStream(int paramInt, InputStream paramInputStream) throws SQLException { + addParam(paramInt, paramInputStream); + ((PreparedStatement) this.statement).setBinaryStream(paramInt, paramInputStream); + } + + @Override + public void setBinaryStream(int paramInt1, InputStream paramInputStream, int paramInt2) throws SQLException { + addParam(paramInt1, paramInputStream, paramInt2); + ((PreparedStatement) this.statement).setBinaryStream(paramInt1, paramInputStream, paramInt2); + } + + @Override + public void setBinaryStream(int paramInt, InputStream paramInputStream, long paramLong) throws SQLException { + addParam(paramInt, paramInputStream, paramLong); + ((PreparedStatement) this.statement).setBinaryStream(paramInt, paramInputStream, paramLong); + } + + @Override + public void setBlob(int paramInt, Blob paramBlob) throws SQLException { + addParam(paramInt, paramBlob); + ((PreparedStatement) this.statement).setBlob(paramInt, paramBlob); + } + + @Override + public void setBlob(int paramInt, InputStream paramInputStream) throws SQLException { + addParam(paramInt, paramInputStream); + ((PreparedStatement) this.statement).setBlob(paramInt, paramInputStream); + } + + @Override + public void setBlob(int paramInt, InputStream paramInputStream, long paramLong) throws SQLException { + addParam(paramInt, paramInputStream, paramLong); + ((PreparedStatement) this.statement).setBlob(paramInt, paramInputStream, paramLong); + } + + @Override + public void setBoolean(int paramInt, boolean paramBoolean) throws SQLException { + addParam(paramInt, paramBoolean); + ((PreparedStatement) this.statement).setBoolean(paramInt, paramBoolean); + } + + @Override + public void setByte(int paramInt, byte paramByte) throws SQLException { + addParam(paramInt, paramByte); + ((PreparedStatement) this.statement).setByte(paramInt, paramByte); + } + + @Override + public void setBytes(int paramInt, byte[] paramArrayOfByte) throws SQLException { + addParam(paramInt, paramArrayOfByte); + ((PreparedStatement) this.statement).setBytes(paramInt, paramArrayOfByte); + } + + @Override + public void setCharacterStream(int paramInt, Reader paramReader) throws SQLException { + addParam(paramInt, paramReader); + ((PreparedStatement) this.statement).setCharacterStream(paramInt, paramReader); + } + + @Override + public void setCharacterStream(int paramInt1, Reader paramReader, int paramInt2) throws SQLException { + addParam(paramInt1, paramReader, paramInt2); + ((PreparedStatement) this.statement).setCharacterStream(paramInt1, paramReader, paramInt2); + } + + @Override + public void setCharacterStream(int paramInt, Reader paramReader, long paramLong) throws SQLException { + addParam(paramInt, paramReader, paramLong); + ((PreparedStatement) this.statement).setCharacterStream(paramInt, paramReader, paramLong); + } + + @Override + public void setClob(int paramInt, Clob paramClob) throws SQLException { + addParam(paramInt, paramClob); + ((PreparedStatement) this.statement).setClob(paramInt, paramClob); + } + + @Override + public void setClob(int paramInt, Reader paramReader) throws SQLException { + addParam(paramInt, paramReader); + ((PreparedStatement) this.statement).setClob(paramInt, paramReader); + } + + @Override + public void setClob(int paramInt, Reader paramReader, long paramLong) throws SQLException { + addParam(paramInt, paramReader, paramLong); + ((PreparedStatement) this.statement).setClob(paramInt, paramReader, paramLong); + } + + @Override + public void setDate(int paramInt, Date paramDate) throws SQLException { + addParam(paramInt, paramDate); + ((PreparedStatement) this.statement).setDate(paramInt, paramDate); + } + + @Override + public void setDate(int paramInt, Date paramDate, Calendar paramCalendar) throws SQLException { + addParam(paramInt, paramDate, paramCalendar); + ((PreparedStatement) this.statement).setDate(paramInt, paramDate, paramCalendar); + } + + @Override + public void setDouble(int paramInt, double paramDouble) throws SQLException { + addParam(paramInt, paramDouble); + ((PreparedStatement) this.statement).setDouble(paramInt, paramDouble); + } + + @Override + public void setFloat(int paramInt, float paramFloat) throws SQLException { + addParam(paramInt, paramFloat); + ((PreparedStatement) this.statement).setFloat(paramInt, paramFloat); + } + + @Override + public void setInt(int paramInt1, int paramInt2) throws SQLException { + addParam(paramInt1, paramInt2); + ((PreparedStatement) this.statement).setInt(paramInt1, paramInt2); + } + + @Override + public void setLong(int paramInt, long paramLong) throws SQLException { + addParam(paramInt, paramLong); + ((PreparedStatement) this.statement).setLong(paramInt, paramLong); + } + + @Override + public void setNCharacterStream(int paramInt, Reader paramReader) throws SQLException { + addParam(paramInt, paramReader); + ((PreparedStatement) this.statement).setNCharacterStream(paramInt, paramReader); + } + + @Override + public void setNCharacterStream(int paramInt, Reader paramReader, long paramLong) throws SQLException { + addParam(paramInt, paramReader, paramLong); + ((PreparedStatement) this.statement).setNCharacterStream(paramInt, paramReader, paramLong); + } + + @Override + public void setNClob(int paramInt, NClob paramNClob) throws SQLException { + addParam(paramInt, paramNClob); + ((PreparedStatement) this.statement).setNClob(paramInt, paramNClob); + } + + @Override + public void setNClob(int paramInt, Reader paramReader) throws SQLException { + addParam(paramInt, paramReader); + ((PreparedStatement) this.statement).setNClob(paramInt, paramReader); + } + + @Override + public void setNClob(int paramInt, Reader paramReader, long paramLong) throws SQLException { + addParam(paramInt, paramReader, paramLong); + ((PreparedStatement) this.statement).setNClob(paramInt, paramReader, paramLong); + } + + @Override + public void setNString(int paramInt, String paramString) throws SQLException { + addParam(paramInt, paramString); + ((PreparedStatement) this.statement).setNString(paramInt, paramString); + } + + @Override + public void setNull(int paramInt1, int paramInt2) throws SQLException { + // addParam(paramInt1, g.addParam()); + ((PreparedStatement) this.statement).setNull(paramInt1, paramInt2); + } + + @Override + public void setNull(int paramInt1, int paramInt2, String paramString) throws SQLException { + // addParam(paramInt1, Integer.valueOf(paramInt2), g.addParam()); + ((PreparedStatement) this.statement).setNull(paramInt1, paramInt2, paramString); + } + + @Override + public void setObject(int paramInt, Object paramObject) throws SQLException { + addParam(paramInt, paramObject); + ((PreparedStatement) this.statement).setObject(paramInt, paramObject); + } + + @Override + public void setObject(int paramInt1, Object paramObject, int paramInt2) throws SQLException { + addParam(paramInt1, paramObject, paramInt2); + ((PreparedStatement) this.statement).setObject(paramInt1, paramObject, paramInt2); + } + + @Override + public void setObject(int paramInt1, Object paramObject, int paramInt2, int paramInt3) throws SQLException { + addParam(paramInt1, paramObject, paramInt2, paramInt3); + ((PreparedStatement) this.statement).setObject(paramInt1, paramObject, paramInt2, paramInt3); + } + + @Override + public void setRef(int paramInt, Ref paramRef) throws SQLException { + addParam(paramInt, paramRef); + ((PreparedStatement) this.statement).setRef(paramInt, paramRef); + } + + @Override + public void setRowId(int paramInt, RowId paramRowId) throws SQLException { + addParam(paramInt, paramRowId); + ((PreparedStatement) this.statement).setRowId(paramInt, paramRowId); + } + + @Override + public void setSQLXML(int paramInt, SQLXML paramSQLXML) throws SQLException { + addParam(paramInt, paramSQLXML); + ((PreparedStatement) this.statement).setSQLXML(paramInt, paramSQLXML); + } + + @Override + public void setShort(int paramInt, short paramShort) throws SQLException { + addParam(paramInt, paramShort); + ((PreparedStatement) this.statement).setShort(paramInt, paramShort); + } + + @Override + public void setString(int paramInt, String paramString) throws SQLException { + addParam(paramInt, paramString); + ((PreparedStatement) this.statement).setString(paramInt, paramString); + } + + @Override + public void setTime(int paramInt, Time paramTime) throws SQLException { + addParam(paramInt, paramTime); + ((PreparedStatement) this.statement).setTime(paramInt, paramTime); + } + + @Override + public void setTime(int paramInt, Time paramTime, Calendar paramCalendar) throws SQLException { + addParam(paramInt, paramTime, paramCalendar); + ((PreparedStatement) this.statement).setTime(paramInt, paramTime); + } + + @Override + public void setTimestamp(int paramInt, Timestamp paramTimestamp) throws SQLException { + // addParam(paramInt, new Timestamp(paramTimestamp.getTime() - paramTimestamp.getTime() % 1000)); + paramTimestamp.setNanos(0); + addParam(paramInt, paramTimestamp); + + ((PreparedStatement) this.statement).setTimestamp(paramInt, paramTimestamp); + } + + @Override + public void setTimestamp(int paramInt, Timestamp paramTimestamp, Calendar paramCalendar) throws SQLException { + paramTimestamp.setNanos(0); + addParam(paramInt, paramTimestamp, paramCalendar); + ((PreparedStatement) this.statement).setTimestamp(paramInt, paramTimestamp, paramCalendar); + } + + @Override + public void setURL(int paramInt, URL paramURL) throws SQLException { + addParam(paramInt, paramURL); + ((PreparedStatement) this.statement).setURL(paramInt, paramURL); + } + + @Override + public void setUnicodeStream(int paramInt1, InputStream paramInputStream, int paramInt2) throws SQLException { + addParam(paramInt1, paramInputStream, paramInt2); + ((PreparedStatement) this.statement).setUnicodeStream(paramInt1, paramInputStream, paramInt2); + } + +} 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 new file mode 100644 index 000000000..822ee6683 --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcRuntimeContextService.java @@ -0,0 +1,14 @@ +package com.codingapi.tx.datasource.relational.txc; + + +import com.codingapi.tx.datasource.relational.txc.parser.TxcRuntimeContext; + +/** + * @author jsy. + * 17/12/7. + */ +public interface TxcRuntimeContextService { + + TxcRuntimeContext getTxcRuntimeContext(); + +} 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 new file mode 100644 index 000000000..97bcd4067 --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcSqlExecutor.java @@ -0,0 +1,34 @@ +package com.codingapi.tx.datasource.relational.txc; + + +import com.codingapi.tx.datasource.relational.txc.parser.ResultConvertUtils; +import com.codingapi.tx.datasource.relational.txc.parser.SQLType; +import com.codingapi.tx.datasource.relational.txc.parser.TxcLine; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +/** + * @author jsy. + * @title + * @time 17/12/26. + */ +public class TxcSqlExecutor { + + public static List executeQuery(String sql, Connection connection) throws SQLException { + ResultSet resultSet = connection.prepareStatement(sql).executeQuery(); + return ResultConvertUtils.convertWithPrimary(resultSet, null, SQLType.SELECT); + } + + public static List executeQuery(PreparedStatement preparedStatement) throws SQLException { + ResultSet resultSet = preparedStatement.executeQuery(); + return ResultConvertUtils.convertWithPrimary(resultSet, null, SQLType.SELECT); + } + + public static void execute(String sql, Connection connection) throws SQLException { + connection.prepareStatement(sql).execute(); + } +} 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 new file mode 100644 index 000000000..c9c961880 --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcStatement.java @@ -0,0 +1,340 @@ +package com.codingapi.tx.datasource.relational.txc; + + +import com.codingapi.tx.aop.bean.TxTransactionLocal; +import com.codingapi.tx.datasource.relational.txc.parser.ExecutePaser; +import com.codingapi.tx.datasource.relational.txc.parser.SQLType; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.SQLWarning; +import java.sql.Statement; + +/** + * [类描述] + * + * @author caican + * @date 17/11/28 + * @title [confluence页面的title] + */ +public class TxcStatement implements ITxcStatement { + + protected Statement statement; + protected AbstractTxcConnection abstractTxcConnection; + + protected String sql; + + public TxcStatement(Statement localStatement, AbstractTxcConnection abstractTxcConnection) { + this.statement = localStatement; + this.abstractTxcConnection = abstractTxcConnection; + } + + @Override + public String getSql() { + return sql; + } + + @Override + public Statement getStatement() { + return statement; + } + + private void setSql(String sql) { + this.sql = sql; + } + + /** + * @return txc 是否开启 + */ + protected boolean isInTxcTransaction(){ + return TxTransactionLocal.isInTxcTransaction(); + } + + @Override + public boolean execute(String paramString) throws SQLException { + setSql(paramString); + if (isInTxcTransaction()) { + SQLType sqlType = ExecutePaser.parse(this); + boolean execute = this.statement.execute(paramString); + ExecutePaser.after(this, sqlType); + return execute; + } + + return this.statement.execute(paramString); + } + + @Override + public boolean execute(String paramString, int paramInt) throws SQLException { + setSql(paramString); + if (isInTxcTransaction()) { + SQLType sqlType = ExecutePaser.parse(this); + boolean execute = this.statement.execute(paramString, paramInt); + ExecutePaser.after(this, sqlType); + return execute; + } + + return this.statement.execute(paramString, paramInt); + } + + @Override + public boolean execute(String paramString, int[] paramArrayOfInt) throws SQLException { + setSql(paramString); + if (isInTxcTransaction()) { + SQLType sqlType = ExecutePaser.parse(this); + boolean execute = this.statement.execute(paramString, paramArrayOfInt); + ExecutePaser.after(this, sqlType); + return execute; + } + + return this.statement.execute(paramString, paramArrayOfInt); + } + + @Override + public boolean execute(String paramString, String[] paramArrayOfString) throws SQLException { + setSql(paramString); + if (isInTxcTransaction()) { + SQLType sqlType = ExecutePaser.parse(this); + boolean execute = this.statement.execute(paramString, paramArrayOfString); + ExecutePaser.after(this, sqlType); + return execute; + } + + return this.statement.execute(paramString, paramArrayOfString); + } + + @Override + public int[] executeBatch() throws SQLException { + if (! isInTxcTransaction()) { + return this.statement.executeBatch(); + } + throw new RuntimeException("Unsupported"); + } + + @Override + public ResultSet executeQuery(String paramString) throws SQLException { + setSql(paramString); + return this.statement.executeQuery(paramString); + } + + @Override + public int executeUpdate(String paramString) throws SQLException { + setSql(paramString); + if (isInTxcTransaction()) { + SQLType sqlType = ExecutePaser.parse(this); + int execute = this.statement.executeUpdate(paramString); + ExecutePaser.after(this, sqlType); + return execute; + } + + return this.statement.executeUpdate(paramString); + } + + @Override + public int executeUpdate(String paramString, int paramInt) throws SQLException { + setSql(paramString); + if (isInTxcTransaction()) { + ExecutePaser.parse(this); + + } + return this.statement.executeUpdate(paramString, paramInt); + } + + @Override + public int executeUpdate(String paramString, int[] paramArrayOfInt) throws SQLException { + setSql(paramString); + if (isInTxcTransaction()) { + ExecutePaser.parse(this); + } + return this.statement.executeUpdate(paramString, paramArrayOfInt); + } + + @Override + public int executeUpdate(String paramString, String[] paramArrayOfString) throws SQLException { + setSql(paramString); + if (isInTxcTransaction()) { + ExecutePaser.parse(this); + + } + return this.statement.executeUpdate(paramString, paramArrayOfString); + } + + // 不支持 + @Override + public void closeOnCompletion() + { + throw new RuntimeException("Unsupported"); + } + + @Override + public boolean isCloseOnCompletion() + { + throw new RuntimeException("Unsupported"); + } + + // 完全不动直接代理 + @Override + public void cancel() throws SQLException { + this.statement.cancel(); + } + + @Override + public void clearWarnings() throws SQLException { + this.statement.clearWarnings(); + } + + @Override + public void close() throws SQLException { + this.statement.close(); + } + + @Override + public void addBatch(String paramString) throws SQLException { + this.statement.addBatch(paramString); + } + + @Override + public void clearBatch() throws SQLException { + this.statement.clearBatch(); + } + + @Override + public Connection getConnection() throws SQLException { + return this.statement.getConnection(); + } + + @Override + public int getFetchDirection() throws SQLException { + return this.statement.getFetchDirection(); + } + + @Override + public int getFetchSize() throws SQLException { + return this.statement.getFetchSize(); + } + + @Override + public ResultSet getGeneratedKeys() throws SQLException { + return this.statement.getGeneratedKeys(); + } + + @Override + public int getMaxFieldSize() throws SQLException { + return this.statement.getMaxFieldSize(); + } + + @Override + public int getMaxRows() throws SQLException { + return this.statement.getMaxRows(); + } + + @Override + public boolean getMoreResults() throws SQLException { + return this.statement.getMoreResults(); + } + + @Override + public boolean getMoreResults(int paramInt) throws SQLException { + return this.statement.getMoreResults(paramInt); + } + + @Override + public int getQueryTimeout() throws SQLException { + return this.statement.getQueryTimeout(); + } + + @Override + public ResultSet getResultSet() throws SQLException { + return this.statement.getResultSet(); + } + + @Override + public int getResultSetConcurrency() throws SQLException { + return this.statement.getResultSetConcurrency(); + } + + @Override + public int getResultSetHoldability() throws SQLException { + return this.statement.getResultSetHoldability(); + } + + @Override + public int getResultSetType() throws SQLException { + return this.statement.getResultSetType(); + } + + @Override + public int getUpdateCount() throws SQLException { + return this.statement.getUpdateCount(); + } + + @Override + public SQLWarning getWarnings() throws SQLException { + return this.statement.getWarnings(); + } + + @Override + public boolean isClosed() throws SQLException { + return this.statement.isClosed(); + } + + @Override + public boolean isPoolable() throws SQLException { + return this.statement.isPoolable(); + } + + @Override + public void setCursorName(String paramString) throws SQLException { + this.statement.setCursorName(paramString); + } + + @Override + public void setEscapeProcessing(boolean paramBoolean) throws SQLException { + this.statement.setEscapeProcessing(paramBoolean); + } + + @Override + public void setFetchDirection(int paramInt) throws SQLException { + this.statement.setFetchDirection(paramInt); + } + + @Override + public void setFetchSize(int paramInt) throws SQLException { + this.statement.setFetchSize(paramInt); + } + + @Override + public void setMaxFieldSize(int paramInt) throws SQLException { + this.statement.setMaxFieldSize(paramInt); + } + + @Override + public void setMaxRows(int paramInt) throws SQLException { + this.statement.setMaxRows(paramInt); + } + + @Override + public void setPoolable(boolean paramBoolean) throws SQLException { + this.statement.setPoolable(paramBoolean); + } + + @Override + public void setQueryTimeout(int paramInt) throws SQLException { + this.statement.setQueryTimeout(paramInt); + } + + @Override + public boolean isWrapperFor(Class paramClass) throws SQLException { + return this.statement.isWrapperFor(paramClass); + } + + @Override + public T unwrap(Class paramClass) throws SQLException { + return this.statement.unwrap(paramClass); + } + + @Override + public AbstractTxcConnection getTxcDBConnection() { + return abstractTxcConnection; + } +} 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 new file mode 100644 index 000000000..ad554d033 --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/AbstractParser.java @@ -0,0 +1,187 @@ +package com.codingapi.tx.datasource.relational.txc.parser; + +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.codingapi.tx.datasource.relational.txc.TableMetaUtils; +import com.codingapi.tx.datasource.relational.txc.TxcPreparedStatement; +import com.codingapi.tx.datasource.relational.txc.TxcStatement; +import org.apache.commons.collections.CollectionUtils; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +/** + * @author jsy. + * @title + * @time 17/12/11. + */ + +public abstract class AbstractParser{ + + public CommitInfo parse(TxcStatement txcStatement) throws SQLException { + CommitInfo commitInfo = new CommitInfo(); + + String sql = txcStatement.getSql(); + T sqlParseStatement = (T) new MySqlStatementParser(sql).parseStatement(); + + //设置sqltype + commitInfo.setSqlType(getSqlType()); + + //设置where + commitInfo.setWhere(getWhere(sqlParseStatement)); + + //sql + commitInfo.setSql(sql); + + + + if (txcStatement instanceof TxcPreparedStatement) { + commitInfo.setSqlParams(((TxcPreparedStatement) txcStatement).getParamsList()); + commitInfo.setWhereParams( + getWhereParams(((TxcPreparedStatement) txcStatement).getParamsList(), sqlParseStatement)); + } + + //解析之前的值 + commitInfo.setOriginalValue(getOriginValue(commitInfo.getWhereParams(), sqlParseStatement, txcStatement.getConnection())); + + //解析之后的值 + commitInfo.setPresentValue(getPresentValue(commitInfo.getSqlParams(), sqlParseStatement)); + + return commitInfo; + + + + } + + protected abstract List getWhereParams(List sqlParamsList, T parseSqlStatement); + + protected abstract String getWhere(T parseSqlStatement); + + //从当前sql取出值 + public abstract TxcTable getPresentValue(List sqlParamsList, T parseSqlStatement); + + //从数据库取出值 + public TxcTable getOriginValue(List whereParamsList, T parseSqlStatement, Connection connection) + throws SQLException { + TxcTable txcTable = new TxcTable(); + txcTable.setTableName(getTableName(parseSqlStatement)); + + // 组装sql + String primaryKeyName = TableMetaUtils + .getTableMetaInfo(connection, getTableName(parseSqlStatement)).getPrimaryKeyName(); + String selectSql = selectSql(parseSqlStatement, primaryKeyName); + + PreparedStatement preparedStatement = connection.prepareStatement(selectSql); + + if (CollectionUtils.isNotEmpty(whereParamsList)) { + // 设置条件 + for (int i = 1; i <= whereParamsList.size(); i++) { + preparedStatement.setObject(i, whereParamsList.get(i - 1)); + } + } + + // 执行查询sql + ResultSet resultSet = preparedStatement.executeQuery(); + + List txcLines = ResultConvertUtils.convertWithPrimary(resultSet, primaryKeyName, getSqlType()); + + // convert + txcTable.setLine(txcLines); + return txcTable; + } + + + public abstract SQLType getSqlType(); + + + +// +// public int getTypeByClass(Object x) { +// if (x == null) { +// return Types.OTHER; +// } +// +// Class clazz = x.getClass(); +// if (clazz == Byte.class) { +// return Types.TINYINT; +// } +// +// if (clazz == Short.class) { +// return Types.SMALLINT; +// } +// +// if (clazz == Integer.class) { +// return Types.INTEGER; +// } +// +// if (clazz == Long.class) { +// +// return Types.BIGINT; +// } +// +// if (clazz == String.class) { +// return Types.VARCHAR; +// } +// +// if (clazz == BigDecimal.class) { +// return Types.DECIMAL; +// } +// +// if (clazz == Float.class) { +// return Types.FLOAT; +// } +// +// if (clazz == Double.class) { +// return Types.DOUBLE; +// } +// +// if (clazz == java.sql.Date.class || clazz == java.util.Date.class) { +// return Types.DATE; +// } +// +// if (clazz == java.sql.Timestamp.class) { +// return Types.TIMESTAMP; +// } +// +// if (clazz == java.sql.Time.class) { +// return Types.TIME; +// } +// +// if (clazz == Boolean.class) { +// return Types.BOOLEAN; +// } +// +// if (clazz == byte[].class) { +// return JdbcParameter.TYPE.BYTES; +// } +// +// if (x instanceof InputStream) { +// return JdbcParameter.TYPE.BinaryInputStream; +// } +// +// if (x instanceof Reader) { +// return JdbcParameter.TYPE.CharacterInputStream; +// } +// +// if (x instanceof Clob) { +// return Types.CLOB; +// } +// +// if (x instanceof NClob) { +// return Types.NCLOB; +// } +// +// if (x instanceof Blob) { +// return Types.BLOB; +// } +// return Types.OTHER; +// +// } + + protected abstract String selectSql(T parseSqlStatement, String primaryKeyName); + + protected abstract String getTableName(T parseSqlStatement); + +} diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/CommitInfo.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/CommitInfo.java new file mode 100644 index 000000000..497bd04d3 --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/CommitInfo.java @@ -0,0 +1,106 @@ +package com.codingapi.tx.datasource.relational.txc.parser; + +import com.google.common.collect.Lists; + +import java.util.List; + + +public class CommitInfo implements Cloneable { + /** + * 更新之前 的行数据 + */ + private TxcTable originalValue = new TxcTable(); + /** + * 更新后的行数据 + */ + private TxcTable presentValue = new TxcTable(); + + /** + * Where 条件 + */ + private String where = ""; + + private List whereParams = Lists.newArrayList(); + /** + * 更新类型 UPDTAE or DELETE or insert + */ + private SQLType sqlType = null; + /** + * 业务执行sql + */ + private String sql = ""; + + /** + * sql的属性值,对应PreparedStatement存在 + */ + private List sqlParams = Lists.newArrayList(); + + private String schemaName; + + + + public TxcTable getOriginalValue() { + return originalValue; + } + + public void setOriginalValue(TxcTable originalValue) { + this.originalValue = originalValue; + } + + public TxcTable getPresentValue() { + return presentValue; + } + + public void setPresentValue(TxcTable presentValue) { + this.presentValue = presentValue; + } + + public String getWhere() { + return where; + } + + public void setWhere(String where) { + this.where = where; + } + + public List getWhereParams() { + return whereParams; + } + + public void setWhereParams(List whereParams) { + this.whereParams = whereParams; + } + + public SQLType getSqlType() { + return sqlType; + } + + public void setSqlType(SQLType sqlType) { + this.sqlType = sqlType; + } + + + public String getSql() { + return sql; + } + + public void setSql(String sql) { + this.sql = sql; + } + + public List getSqlParams() { + return sqlParams; + } + + public void setSqlParams(List sqlParams) { + this.sqlParams = sqlParams; + } + + public String getSchemaName() { + return schemaName; + } + + public void setSchemaName(String schemaName) { + this.schemaName = schemaName; + } +} 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 new file mode 100644 index 000000000..9dcdb1a2e --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/DeleteParser.java @@ -0,0 +1,71 @@ +package com.codingapi.tx.datasource.relational.txc.parser; + +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.ListUtils; + +import java.util.List; + +/** + * @author jsy. + * @title + * @time 17/12/22. + */ +public class DeleteParser extends AbstractParser { + private static DeleteParser instance = null; + + public static DeleteParser getInstance() { + if (instance == null) { + synchronized (DeleteParser.class) { + if (instance == null) { + instance = new DeleteParser(); + } + } + } + return instance; + } + + @Override + protected List getWhereParams(List sqlParamsList, MySqlDeleteStatement parseSqlStatement) { + if (CollectionUtils.isNotEmpty(sqlParamsList)) { + return sqlParamsList; + } + return ListUtils.EMPTY_LIST; + } + + @Override + protected String getWhere(MySqlDeleteStatement parseSqlStatement) { + return SqlUtils.toSQLString(parseSqlStatement.getWhere()); + } + + @Override + public TxcTable getPresentValue(List sqlParamsList, MySqlDeleteStatement parseSqlStatement) { + return null; + } + + + @Override + public SQLType getSqlType() { + return SQLType.DELETE; + } + + @Override + protected String selectSql(MySqlDeleteStatement mySqlUpdateStatement, String primaryKeyName) { + StringBuffer stringBuffer = new StringBuffer(); + stringBuffer.append("SELECT * "); + + // + stringBuffer.append(" from ").append(mySqlUpdateStatement.getTableName().getSimpleName()).append(" where "); + // + stringBuffer.append(SqlUtils.toSQLString(mySqlUpdateStatement.getWhere())); + return stringBuffer.toString(); + } + + @Override + protected String getTableName(MySqlDeleteStatement parseSqlStatement) { + return parseSqlStatement.getTableName().getSimpleName(); + } + + + +} 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 new file mode 100644 index 000000000..fca522e22 --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/ExecutePaser.java @@ -0,0 +1,126 @@ +package com.codingapi.tx.datasource.relational.txc.parser; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.codingapi.tx.datasource.relational.txc.TableMetaInfo; +import com.codingapi.tx.datasource.relational.txc.TableMetaUtils; +import com.codingapi.tx.datasource.relational.txc.TxcStatement; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +/** + * [类描述] + * + * @author caican + * @date 17/11/28 + * @title [confluence页面的title] + */ +public class ExecutePaser { + + private static final Logger logger = LoggerFactory.getLogger(ExecutePaser.class); + + + + public static SQLType parse(TxcStatement txcStatement) { + long start = System.currentTimeMillis(); + SQLType sqlType = SQLType.SELECT; + try { + TxcRuntimeContext txcRuntimeContext = txcStatement.getTxcDBConnection().getTxcRuntimeContext(); + + //解析sql + String sql = txcStatement.getSql(); + SQLStatement sqlParseStatement = new MySqlStatementParser(sql).parseStatement(); + + CommitInfo commitInfo = null; + if (sqlParseStatement instanceof MySqlUpdateStatement) { + commitInfo = UpdateParser.getInstance().parse(txcStatement); + txcRuntimeContext.getInfo().add(commitInfo); + sqlType = SQLType.UPDATE; + } else if(sqlParseStatement instanceof MySqlInsertStatement){ + commitInfo = InsertParser.getInstance().parse(txcStatement); + txcRuntimeContext.getInfo().add(commitInfo); + sqlType = SQLType.INSERT; + } else if(sqlParseStatement instanceof MySqlDeleteStatement) { + commitInfo = DeleteParser.getInstance().parse(txcStatement); + txcRuntimeContext.getInfo().add(commitInfo); + sqlType = SQLType.DELETE; + } + + if (commitInfo != null && commitInfo.getSchemaName() == null) { + String dbName = TableMetaUtils.getDbNameFromUrl(txcStatement.getConnection().getMetaData().getURL()); + commitInfo.setSchemaName(dbName); + } + + } catch (Exception e) { + logger.error("parse sql error", e); + } finally { + long cost = System.currentTimeMillis() - start; + if (sqlType != SQLType.SELECT || cost > 50) { + logger.info("解析 sql:{}, cost:{}ms", txcStatement.getSql(), cost); + } + } + return sqlType; + } + + public static void after(TxcStatement txcStatement, SQLType sqlType) { + + try { + if (sqlType == SQLType.INSERT) { + TxcRuntimeContext txcRuntimeContext = txcStatement.getTxcDBConnection().getTxcRuntimeContext(); + List commitInfos = txcRuntimeContext.getInfo(); + if (commitInfos.size() == 0) { + return; + } + + CommitInfo commitInfo = commitInfos.get(commitInfos.size() - 1); + + List line = commitInfo.getPresentValue().getLine(); + if (line.size() > 1) { + logger.error("不支持多条插入sql"); + return; + } + + TxcLine txcLine = line.get(0); + + setPrimaryValue(txcStatement, commitInfo, txcLine); + + } + } catch (SQLException e) { + logger.error("execute parser after error", e); + } + } + + private static void setPrimaryValue(TxcStatement txcStatement, CommitInfo commitInfo, + TxcLine txcLine) throws SQLException { + TableMetaInfo tableMetaInfo = TableMetaUtils + .getTableMetaInfo(txcStatement.getConnection(), commitInfo.getPresentValue().getTableName()); + String autoIncrementPrimaryKey = tableMetaInfo.getAutoIncrementPrimaryKey(); + if (StringUtils.isBlank(autoIncrementPrimaryKey)) { + String primaryKeyName = tableMetaInfo.getPrimaryKeyName(); + txcLine.setPrimaryKey(primaryKeyName); + + for (TxcField txcField : txcLine.getFields()) { + if (txcField.getName().equals(primaryKeyName)) { + txcLine.setPrimaryValue(txcField.getValue()); + return; + } + } + + } else { + txcLine.setPrimaryKey(autoIncrementPrimaryKey); + ResultSet resultSet = txcStatement.getConnection().prepareStatement("select last_insert_id() as id") + .executeQuery(); + while (resultSet.next()) { + txcLine.setPrimaryValue(resultSet.getObject("id")); + } + } + } +} 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 new file mode 100644 index 000000000..734521bed --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/InsertParser.java @@ -0,0 +1,94 @@ +package com.codingapi.tx.datasource.relational.txc.parser; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; +import org.apache.commons.collections.CollectionUtils; + +import java.sql.Connection; +import java.util.List; + +/** + * @author jsy. + * @title + * @time 17/12/22. + */ +public class InsertParser extends AbstractParser{ + + private static InsertParser instance = null; + + public static InsertParser getInstance() { + if (instance == null) { + synchronized (InsertParser.class) { + if (instance == null) { + instance = new InsertParser(); + } + } + } + return instance; + } + @Override + protected List getWhereParams(List sqlParamsList, + MySqlInsertStatement parseSqlStatement) { + return null; + } + + @Override + protected String getWhere(MySqlInsertStatement parseSqlStatement) { + return null; + } + + @Override + public TxcTable getPresentValue(List sqlParamsList, MySqlInsertStatement parseSqlStatement) { + + TxcTable txcTable = new TxcTable(); + txcTable.setTableName(parseSqlStatement.getTableName().getSimpleName()); + List line = txcTable.getLine(); + + List valuesList = parseSqlStatement.getValuesList(); + List columns = parseSqlStatement.getColumns(); + + + for (SQLInsertStatement.ValuesClause valuesClause : valuesList) { + List values = valuesClause.getValues(); + TxcLine txcLine = new TxcLine(); + for (int i = 0; i < columns.size(); i++) { + TxcField txcField = new TxcField(); + txcField.setName(SqlUtils.toSQLString(columns.get(i)).replace("\'", "").replace("`", "").trim()); + if (CollectionUtils.isNotEmpty(sqlParamsList)) { + txcField.setValue(sqlParamsList.get(i)); + } else { + txcField.setValue(SqlUtils.toSQLString(values.get(i))); + } + txcLine.getFields().add(txcField); + } + line.add(txcLine); + } + + + + return txcTable; + } + + @Override + public TxcTable getOriginValue(List whereParamsList, MySqlInsertStatement parseSqlStatement, + Connection connection) { + return null; + } + + + @Override + public SQLType getSqlType() { + return SQLType.INSERT; + } + + @Override + protected String selectSql(MySqlInsertStatement parseSqlStatement, String primaryKeyName) { + throw new RuntimeException("不支持的类型"); + } + + @Override + protected String getTableName(MySqlInsertStatement parseSqlStatement) { + return parseSqlStatement.getTableName().getSimpleName(); + } +} 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 new file mode 100644 index 000000000..a97d8adee --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/ResultConvertUtils.java @@ -0,0 +1,150 @@ +package com.codingapi.tx.datasource.relational.txc.parser; + +import com.google.common.collect.Lists; +import org.apache.commons.lang.StringUtils; + +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Types; +import java.util.List; + +/** + * @author jsy. + * @title + * @time 17/12/26. + */ +public class ResultConvertUtils { + + + + public static List convertWithPrimary(ResultSet resultSet, String primaryKeyName, SQLType sqlType) throws SQLException { + List txcLines = Lists.newArrayList(); + ResultSetMetaData metaData = resultSet.getMetaData(); + + + while (resultSet.next()) { + TxcLine txcLine = new TxcLine(); + for (int i = 1; i <= metaData.getColumnCount(); i++) { + + if (i == metaData.getColumnCount() && StringUtils.equalsIgnoreCase(metaData.getColumnName(i), primaryKeyName) && sqlType == SQLType.UPDATE) { + + txcLine.setPrimaryKey(metaData.getColumnName(i)); + txcLine.setPrimaryValue(getDataByType(i, metaData.getColumnType(i), resultSet)); + } else { + TxcField txcField = new TxcField(); + + txcField.setName(metaData.getColumnName(i)); + txcField.setType(metaData.getColumnType(i)); + txcField.setValue(getDataByType(i, metaData.getColumnType(i), resultSet)); + + + txcLine.getFields().add(txcField); + } + + } + txcLines.add(txcLine); + + } + return txcLines; + } + + //https://www.cis.upenn.edu/~bcpierce/courses/629/jdkdocs/guide/jdbc/getstart/mapping.doc.html + private static Object getDataByType(int index, int columnType, ResultSet resultSet) throws SQLException { + + if (columnType == Types.BIT) { + return resultSet.getByte(index); + } + + if (columnType == Types.TINYINT) { + return resultSet.getByte(index); + + } + + if (columnType == Types.SMALLINT) { + return resultSet.getShort(index); + } + + + if (columnType == Types.INTEGER) { + return resultSet.getInt(index); + } + + if (columnType == Types.BIGINT) { + return resultSet.getLong(index); + } + + if (columnType == Types.FLOAT) { + return resultSet.getFloat(index); + + } + + if (columnType == Types.DOUBLE) { + return resultSet.getDouble(index); + + } + + if (columnType == Types.NUMERIC) { + return resultSet.getInt(index); + + } + + if (columnType == Types.DECIMAL) { + return resultSet.getBigDecimal(index); + } + + + if (columnType == Types.CHAR) { + return resultSet.getString(index); +// return resultSet.getCharacterStream(index); + } + + if (columnType == Types.VARCHAR) { + return resultSet.getString(index); + } + + + if (columnType == Types.LONGNVARCHAR) { + return resultSet.getString(index); + } + + if (columnType == Types.DATE) { + return resultSet.getDate(index); + } + + if (columnType == Types.TIME) { + return resultSet.getTime(index); + } + + if (columnType == Types.NCHAR) { + return resultSet.getNString(index); +// return resultSet.getNCharacterStream(index); + } + + if (columnType == Types.NVARCHAR) { + return resultSet.getNString(index); + } + + if (columnType == Types.OTHER) { + return resultSet.getObject(index); + } + + if (columnType == Types.BLOB) { + return resultSet.getBlob(index); + } + + if (columnType == Types.BOOLEAN) { + return resultSet.getBoolean(index); + } + + + if (columnType == Types.ARRAY) { + return resultSet.getArray(index); + } + + if (columnType == Types.TIMESTAMP) { + return resultSet.getTimestamp(index); + } + return resultSet.getObject(index); + } +} diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/SQLType.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/SQLType.java new file mode 100644 index 000000000..8f38be110 --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/SQLType.java @@ -0,0 +1,12 @@ +package com.codingapi.tx.datasource.relational.txc.parser; + +/** + * + */ +public enum SQLType { + SELECT(), + UPDATE(), + INSERT(), + DELETE(), + UNKNOW(); +} 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 new file mode 100644 index 000000000..9f53384c4 --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/SqlUtils.java @@ -0,0 +1,18 @@ +package com.codingapi.tx.datasource.relational.txc.parser; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLObject; + +/** + * @author jsy. + * @title + * @time 17/12/15. + */ +public class SqlUtils { + + private static final String dbType = "mysql"; + + public static String toSQLString(SQLObject sqlObject) { + return SQLUtils.toSQLString(sqlObject); + } +} diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/TxcField.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/TxcField.java new file mode 100644 index 000000000..466b67a6a --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/TxcField.java @@ -0,0 +1,50 @@ +package com.codingapi.tx.datasource.relational.txc.parser; + + +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * @author caisirius + */ +public class TxcField { + private String name; + + // DiffUtils 比对时忽略此字段 + @JsonIgnore + private int type; + private Object value; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } + + public String getSqlName() { + return "`" + name + "`"; + } + + + @Override + public String toString() { + return String.format("[%s,%s]", new Object[]{this.name, String.valueOf(this.value)}); + } +} \ No newline at end of file diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/TxcLine.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/TxcLine.java new file mode 100644 index 000000000..70d29de9a --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/TxcLine.java @@ -0,0 +1,46 @@ +package com.codingapi.tx.datasource.relational.txc.parser; + + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author caisirius + */ +public class TxcLine { + + private List fields = new ArrayList(); + + // DiffUtils 比对时忽略此字段 + @JsonIgnore + private Object primaryKey; + + @JsonIgnore + private Object primaryValue; + + public List getFields() { + return fields; + } + + public void setFields(List fields) { + this.fields = fields; + } + + public Object getPrimaryKey() { + return primaryKey; + } + + public void setPrimaryKey(Object primaryKey) { + this.primaryKey = primaryKey; + } + + public Object getPrimaryValue() { + return primaryValue; + } + + public void setPrimaryValue(Object primaryValue) { + this.primaryValue = primaryValue; + } +} \ No newline at end of file diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/TxcRuntimeContext.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/TxcRuntimeContext.java new file mode 100644 index 000000000..54a069a10 --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/TxcRuntimeContext.java @@ -0,0 +1,73 @@ +package com.codingapi.tx.datasource.relational.txc.parser; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author caisirius + */ +public class TxcRuntimeContext { + private static final Logger logger = LoggerFactory.getLogger(TxcRuntimeContext.class); + + /** + * 事务组Id 对应于txc的 xid + */ + public String groupId; + /** + * 分支事务Id lcn里叫 kid + */ + public String branchId; + /** + * 提交信息 + */ + private List info = new ArrayList(); + + public int status; + /** + * 分支所在IP + */ + public String server; + + public List getInfo() { + return info; + } + + public void setInfo(List info) { + this.info = info; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public String getBranchId() { + return branchId; + } + + public void setBranchId(String branchId) { + this.branchId = branchId; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getServer() { + return server; + } + + public void setServer(String server) { + this.server = server; + } +} \ No newline at end of file diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/TxcTable.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/TxcTable.java new file mode 100644 index 000000000..570ce4317 --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/TxcTable.java @@ -0,0 +1,74 @@ +package com.codingapi.tx.datasource.relational.txc.parser; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author caisirius + */ +public class TxcTable { + + public String schemaName; + public String tableName; + public String alias; + + private List line = new ArrayList(); + + + @Override + public String toString() { + StringBuilder localStringBuilder = new StringBuilder(); + for (int i = 0; i < this.line.size(); i++) { + + for (TxcField field : this.line.get(i).getFields()) { + + switch (field.getType()) { + case -15: + case -9: + case -6: + case -5: + case 1: + case 2: + case 4: + case 12: + case 2003: + localStringBuilder.append(field.getValue()).append(','); + default: + } + } + } + return localStringBuilder.toString(); + } + + public String getSchemaName() { + return schemaName; + } + + public void setSchemaName(String schemaName) { + this.schemaName = schemaName; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public String getAlias() { + return alias; + } + + public void setAlias(String alias) { + this.alias = alias; + } + + public List getLine() { + return line; + } + + public void setLine(List line) { + this.line = line; + } +} 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 new file mode 100644 index 000000000..0bba4a28f --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/parser/UpdateParser.java @@ -0,0 +1,126 @@ +package com.codingapi.tx.datasource.relational.txc.parser; + +import com.alibaba.druid.sql.ast.expr.SQLValuableExpr; +import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; +import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; +import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.ListUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +/** + * @author jsy. + * @title + * @time 17/12/11. + */ +public class UpdateParser extends AbstractParser { + private static final Logger logger = LoggerFactory.getLogger(UpdateParser.class); + + + private static UpdateParser instance = null; + + public static UpdateParser getInstance() { + if (instance == null) { + synchronized (UpdateParser.class) { + if (instance == null) { + instance = new UpdateParser(); + } + } + } + return instance; + } + + @Override + protected List getWhereParams(List sqlParamsList, SQLUpdateStatement parseSqlStatement) { + if (CollectionUtils.isNotEmpty(sqlParamsList)) { + int size = 0; + + for (SQLUpdateSetItem sqlUpdateSetItem :parseSqlStatement.getItems()) { + if (sqlUpdateSetItem.getValue() instanceof SQLVariantRefExpr) { + size++; + } + } + return sqlParamsList.subList(size, sqlParamsList.size()); + } + return ListUtils.EMPTY_LIST; + + } + + + @Override + protected String getWhere(SQLUpdateStatement parseSqlStatement) { + return SqlUtils.toSQLString(parseSqlStatement.getWhere()); + } + + @Override + public TxcTable getPresentValue(List sqlParamsList, SQLUpdateStatement parseSqlStatement) { + + TxcTable txcTable = new TxcTable(); + txcTable.setTableName(parseSqlStatement.getTableName().getSimpleName()); + + TxcLine txcLine = new TxcLine(); + List items = parseSqlStatement.getItems(); + + int variantExpr = 0; + for (int i = 0; i < items.size(); i++) { + SQLUpdateSetItem sqlUpdateSetItem = items.get(i); + TxcField txcField = new TxcField(); + String cloumnName = SqlUtils.toSQLString(sqlUpdateSetItem.getColumn()).replace("\'", "").replace("`", "").trim(); + txcField.setName(cloumnName); + if (sqlUpdateSetItem.getValue() instanceof SQLVariantRefExpr) { + txcField.setValue(sqlParamsList.get(variantExpr++)); + } else if (sqlUpdateSetItem.getValue() instanceof SQLValuableExpr){ + txcField.setValue(SqlUtils.toSQLString(items.get(i).getValue())); + } else { + logger.info("不支持复杂的sql,{}", sqlUpdateSetItem.getClass().toString()); + throw new RuntimeException("不支持复杂的sql"); + } + + txcLine.getFields().add(txcField); + } + txcTable.getLine().add(txcLine); + + return txcTable; + } + + + + + @Override + public SQLType getSqlType() { + return SQLType.UPDATE; + } + + + @Override + protected String selectSql(SQLUpdateStatement mySqlUpdateStatement, String primaryKeyName) { + StringBuffer stringBuffer = new StringBuffer(); + stringBuffer.append("SELECT "); + + + List items = mySqlUpdateStatement.getItems(); + for (SQLUpdateSetItem sqlUpdateSetItem : items) { + + stringBuffer.append(SqlUtils.toSQLString(sqlUpdateSetItem.getColumn())).append(","); + + } + + stringBuffer.append(primaryKeyName); + + + + stringBuffer.append(" from ").append(mySqlUpdateStatement.getTableName().getSimpleName()).append(" where "); + + stringBuffer.append(SqlUtils.toSQLString(mySqlUpdateStatement.getWhere())); + return stringBuffer.toString(); + } + + @Override + protected String getTableName(SQLUpdateStatement parseSqlStatement) { + return parseSqlStatement.getTableName().getSimpleName(); + } + +} 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 new file mode 100644 index 000000000..974c9a8bd --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/AbstractRollback.java @@ -0,0 +1,43 @@ +package com.codingapi.tx.datasource.relational.txc.rollback; + +import com.codingapi.tx.datasource.relational.txc.parser.CommitInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.List; + +/** + * @author jsy. + * @title + * @time 17/12/26. + */ +public abstract class AbstractRollback { + private Logger logger = LoggerFactory.getLogger(AbstractRollback.class); + + + public void rollback(CommitInfo commitInfo, Connection connection) throws SQLException { + + //check + boolean flag = canRollback(commitInfo, connection); + + + //rollback + if (flag) { + logger.info("rollback for sql:{}", commitInfo.getSql()); + List preparedStatements = assembleRollbackSql(commitInfo, connection); + + for (PreparedStatement preparedStatement : preparedStatements) { + preparedStatement.execute(); + } + logger.info("rollback sql success"); + } + } + + protected abstract List assembleRollbackSql(CommitInfo commitInfo, Connection connection) + throws SQLException; + + protected abstract boolean canRollback(CommitInfo commitInfo, Connection connection) throws SQLException; +} 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 new file mode 100644 index 000000000..2a7f63251 --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/DeleteRollback.java @@ -0,0 +1,91 @@ +package com.codingapi.tx.datasource.relational.txc.rollback; + +import com.codingapi.tx.datasource.relational.txc.parser.CommitInfo; +import com.codingapi.tx.datasource.relational.txc.parser.TxcField; +import com.codingapi.tx.datasource.relational.txc.parser.TxcLine; +import com.google.common.collect.Lists; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * @author jsy. + * @title + * @time 17/12/26. + */ +public class DeleteRollback extends AbstractRollback { + + private Logger logger = LoggerFactory.getLogger(DeleteRollback.class); + + private static DeleteRollback instance = null; + + public static DeleteRollback getInstance() { + if (instance == null) { + synchronized (DeleteRollback.class) { + if (instance == null) { + instance = new DeleteRollback(); + } + } + } + return instance; + } + + @Override + protected List assembleRollbackSql(CommitInfo commitInfo, Connection connection) + throws SQLException { + + ArrayList preparedStatements = Lists.newArrayList(); + String tableName = commitInfo.getOriginalValue().getTableName(); + + for (TxcLine txcLine : commitInfo.getOriginalValue().getLine()) { + List txcFields = txcLine.getFields(); + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("insert into ").append(tableName).append("("); + + for (int i = 0; i < txcFields.size(); i++) { + if (i == txcFields.size() - 1) { + stringBuilder.append(txcFields.get(i).getSqlName()).append(")"); + } else { + stringBuilder.append(txcFields.get(i).getSqlName()).append(","); + } + } + stringBuilder.append(" value ").append("("); + + for (int i = 0; i < txcFields.size(); i++) { + if (i == txcFields.size() - 1) { + stringBuilder.append("?").append(")"); + } else { + stringBuilder.append("?").append(","); + } + } + String sql = stringBuilder.toString(); + PreparedStatement preparedStatement = connection.prepareStatement(sql); + + for (int i = 1; i <= txcFields.size(); i++) { + preparedStatement.setObject(i, txcFields.get(i - 1).getValue()); + } + preparedStatements.add(preparedStatement); + } + + + return preparedStatements; + } + + @Override + protected boolean canRollback(CommitInfo commitInfo, Connection connection) throws SQLException { + + + if ( commitInfo.getOriginalValue().getLine().size() == 0) { + logger.error("未新影响行数,不回滚"); + return false; + } + + return true; + + } +} 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 new file mode 100644 index 000000000..7a93961bc --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/DiffUtils.java @@ -0,0 +1,108 @@ +package com.codingapi.tx.datasource.relational.txc.rollback; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.module.SimpleModule; + +import java.io.IOException; +import java.io.StringReader; +import java.math.BigDecimal; + +/** + * @author jsy. + * @title + * @time 17/12/14. + */ + +public class DiffUtils { + private static final ObjectMapper objectMapper = new ObjectMapper(); + + static { + objectMapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true); + objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true); + SimpleModule simpleModule = new SimpleModule(); + simpleModule.addSerializer(BigDecimal.class, new JsonSerializer() { + @Override + public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) + throws IOException, JsonProcessingException { + gen.writeString(value.setScale(2).toString()); + } + }); + + simpleModule.addSerializer(StringReader.class, new JsonSerializer() { + @Override + public void serialize(StringReader value, JsonGenerator gen, SerializerProvider serializers) + throws IOException, JsonProcessingException { + gen.writeString(read(value)); + } + }); + + objectMapper.registerModule(simpleModule); + } + + public static boolean diff(Object oldDifDto, Object curDifDto) { + try { + String old = objectMapper.writeValueAsString(oldDifDto); + + String cur = objectMapper.writeValueAsString(curDifDto); + JsonNode oldJsonNode = objectMapper.readTree(old); + JsonNode curJsonNode = objectMapper.readTree(cur); + + if (oldJsonNode.equals(curJsonNode)) { + return true; + } + + return false; + } catch (Exception e) { + return false; + } + + } + + + public static ObjectMapper getObjectMapper() { + return objectMapper; + } + + + public static String read(StringReader stringReader) { + StringBuilder stringBuilder = new StringBuilder(); + try { + stringReader.reset(); + int c; + while ((c = stringReader.read()) != -1) { + stringBuilder.append((char)c); + } + return stringBuilder.toString(); + } catch (IOException e) { + return ""; + } + } + + public static void main(String[] args) { +// BigDecimal bigDecimal = new BigDecimal("50.00"); +// BigDecimal bigDecimal1 = new BigDecimal("50"); +// +// try { +// String s = objectMapper.writeValueAsString(bigDecimal); +// String s1 = objectMapper.writeValueAsString(bigDecimal1); +// System.out.println(s); +// System.out.println(s1); +// } catch (JsonProcessingException e) { +// e.printStackTrace(); +// } + + StringReader test = new StringReader("a:2:{s:20:\"php_serialize_option\";s:1:\" \";s:9:\"orderdata\";a:1:{i:0;a:22:{s:11:\"refund_type\";s:1:\"0\";s:8:\"dateline\";s:1:\"0\";s:11:\"mk_order_id\";s:4:\"null\";s:5:\"stype\";s:2:\"16\";s:11:\"sl_nickname\";s:10:\"zhigb_0016\";s:3:\"num\";s:1:\"1\";s:5:\"ptype\";s:2:\"23\";s:5:\"title\";s:55:\"lqq田酞递址秽梳猜欣勾翅#169779075稿件中标\";s:10:\"sl_user_id\";s:8:\"19182259\";s:7:\"link_id\";s:1:\"0\";s:11:\"offer_price\";s:3:\"0.0\";s:5:\"mtype\";s:1:\"0\";s:12:\"product_pkid\";s:9:\"169779075\";s:7:\"data_id\";s:8:\"90567713\";s:7:\"user_id\";s:8:\"19182244\";s:5:\"price\";s:4:\"50.0\";s:11:\"refund_time\";s:1:\"0\";s:8:\"nickname\";s:18:\"靖哥哥的店铺\";s:13:\"refund_amount\";s:3:\"0.0\";s:8:\"order_id\";s:8:\"90567198\";s:8:\"at_price\";s:4:\"50.0\";s:12:\"refund_state\";s:1:\"0\";}}}"); + String read = read(test); + + + System.out.println(read); + } + +} 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 new file mode 100644 index 000000000..c222d2fd6 --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/InsertRollback.java @@ -0,0 +1,111 @@ +package com.codingapi.tx.datasource.relational.txc.rollback; + +import com.codingapi.tx.datasource.relational.txc.TxcSqlExecutor; +import com.codingapi.tx.datasource.relational.txc.parser.CommitInfo; +import com.codingapi.tx.datasource.relational.txc.parser.TxcField; +import com.codingapi.tx.datasource.relational.txc.parser.TxcLine; +import com.google.common.collect.Lists; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.List; + +/** + * @author jsy. + * @title + * @time 17/12/25. + */ +public class InsertRollback extends AbstractRollback{ + + private Logger logger = LoggerFactory.getLogger(InsertRollback.class); + + private static InsertRollback instance = null; + + public static InsertRollback getInstance() { + if (instance == null) { + synchronized (InsertRollback.class) { + if (instance == null) { + instance = new InsertRollback(); + } + } + } + return instance; + } + + + @Override + protected List assembleRollbackSql(CommitInfo commitInfo, Connection connection) + throws SQLException { + + TxcLine txcLine = commitInfo.getPresentValue().getLine().get(0); + String tableName = commitInfo.getPresentValue().getTableName(); + String sql = "delete from " + tableName + " where " + txcLine.getPrimaryKey() + "= ?"; + PreparedStatement preparedStatement = connection.prepareStatement(sql); + + preparedStatement.setObject(1, txcLine.getPrimaryValue()); + return Lists.newArrayList(preparedStatement); + } + + + private PreparedStatement assembleQuerySql(TxcLine txcLine, String tableName, Connection connection) + throws SQLException { + List txcFields = txcLine.getFields(); + //查询db数据 + StringBuffer stringBuffer = new StringBuffer(); + stringBuffer.append("select "); + + for (int j = 0; j < txcFields.size(); j++) { + if (j != txcFields.size() - 1) { + stringBuffer.append(txcFields.get(j).getSqlName()).append(","); + } else { + stringBuffer.append(txcFields.get(j).getSqlName()); + } + } + + stringBuffer.append(" from ").append(tableName).append(" where ").append(txcLine.getPrimaryKey()).append("= ?"); + + String sql = stringBuffer.toString(); + PreparedStatement preparedStatement = connection.prepareStatement(sql); + preparedStatement.setObject(1, txcLine.getPrimaryValue()); + return preparedStatement; + } + + + + @Override + protected boolean canRollback(CommitInfo commitInfo, Connection connection) throws SQLException { + List txcLines = commitInfo.getPresentValue().getLine(); + + if (txcLines.size() > 1) { + logger.error("insert操作,影响行数大于1,不支持回滚"); + return false; + } + + if ( txcLines.size() == 0) { + logger.error("未新影响行数,不回滚"); + return false; + } + + TxcLine txcLine = txcLines.get(0); + + // 查询db数据 + PreparedStatement preparedStatement = assembleQuerySql(txcLine, commitInfo.getPresentValue().getTableName(), connection); + List dbValue = TxcSqlExecutor.executeQuery(preparedStatement); + + boolean diff = DiffUtils.diff(txcLines, dbValue); + if (!diff) { + try { + logger.error("数据不一致,不支持回滚操作, before:{},after:{}", + DiffUtils.getObjectMapper().writeValueAsString(txcLines), + DiffUtils.getObjectMapper().writeValueAsString(dbValue)); + } catch (Exception e) { + logger.error("error", e); + } + return false; + } + return true; + } +} 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 new file mode 100644 index 000000000..cb1c4accf --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackDataSource.java @@ -0,0 +1,34 @@ +package com.codingapi.tx.datasource.relational.txc.rollback; + +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +/** + * @author jsy. + * @title + * @time 17/12/26. + */ +@Component +public class TxcRollbackDataSource { + + private Map dataSourceMap = new HashMap<>(); + + public void setDataSourceMap(Map dataSourceMap) { + this.dataSourceMap = dataSourceMap; + } + + public Connection getConnectionByDbName(String dbName) throws SQLException { + + DataSource dataSource = dataSourceMap.get(dbName); + if (dataSource == null) { + throw new SQLException("datasource do not exist, name: " + dbName); + } + + return dataSourceMap.get(dbName).getConnection(); + } +} 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 new file mode 100644 index 000000000..d4a30480d --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackService.java @@ -0,0 +1,18 @@ +package com.codingapi.tx.datasource.relational.txc.rollback; + + +import com.codingapi.tx.datasource.relational.txc.parser.CommitInfo; + +/** + * @author jsy. + * @title + * @time 17/12/22. + */ +public interface TxcRollbackService { + + + /**执行回滚 + * @param commitInfo + */ + void rollback(CommitInfo commitInfo); +} 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 new file mode 100644 index 000000000..e2f651e13 --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/TxcRollbackServiceImpl.java @@ -0,0 +1,56 @@ +package com.codingapi.tx.datasource.relational.txc.rollback; + +import com.codingapi.tx.datasource.relational.txc.parser.CommitInfo; +import com.codingapi.tx.datasource.relational.txc.parser.SQLType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.sql.Connection; +import java.sql.SQLException; + +/** + * @author jsy. + * @title + * @time 17/12/22. + */ +@Component +public class TxcRollbackServiceImpl implements TxcRollbackService { + + private Logger logger = LoggerFactory.getLogger(TxcRollbackServiceImpl.class); + + @Autowired + private TxcRollbackDataSource rollbackDataSource; + + @Override + public void rollback(CommitInfo commitInfo) { + // 每次需要新获取一个连接 + Connection connection = null; + try { + connection = rollbackDataSource.getConnectionByDbName(commitInfo.getSchemaName()); + if (commitInfo.getSqlType() == SQLType.UPDATE) { + UpdateRollback.getInstance().rollback(commitInfo, connection); + } + + if (commitInfo.getSqlType() == SQLType.INSERT) { + InsertRollback.getInstance().rollback(commitInfo, connection); + } + + if (commitInfo.getSqlType() == SQLType.DELETE) { + DeleteRollback.getInstance().rollback(commitInfo, connection); + } + } catch (Exception e) { + logger.error("rollback error, sql:{}", commitInfo.getSql(), e); + } finally { + try { + if (connection != null) { + connection.close(); + } + } catch (SQLException e) { + logger.error("close error", e); + } + } + + } +} 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 new file mode 100644 index 000000000..8dab1a16c --- /dev/null +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/rollback/UpdateRollback.java @@ -0,0 +1,111 @@ +package com.codingapi.tx.datasource.relational.txc.rollback; + +import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.codingapi.tx.datasource.relational.txc.parser.CommitInfo; +import com.codingapi.tx.datasource.relational.txc.parser.TxcField; +import com.codingapi.tx.datasource.relational.txc.parser.TxcLine; +import com.codingapi.tx.datasource.relational.txc.parser.TxcTable; +import com.codingapi.tx.datasource.relational.txc.parser.UpdateParser; +import com.google.common.collect.Lists; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +/** + * @author jsy. + * @title + * @time 17/12/14. + */ + +public class UpdateRollback extends AbstractRollback{ + private Logger logger = LoggerFactory.getLogger(UpdateRollback.class); + + + private static UpdateRollback instance = null; + + public static UpdateRollback getInstance() { + if (instance == null) { + synchronized (UpdateRollback.class) { + if (instance == null) { + instance = new UpdateRollback(); + } + } + } + return instance; + } + + + + + @Override + protected List assembleRollbackSql(CommitInfo commitInfo, Connection connection) + throws SQLException { + + ArrayList preparedStatements = Lists.newArrayList(); + String tableName = commitInfo.getOriginalValue().getTableName(); + + for (TxcLine txcLine : commitInfo.getOriginalValue().getLine()) { + List txcFields = txcLine.getFields(); + + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("update ").append(tableName).append(" ").append("set "); + + for (int i = 0; i < txcFields.size(); i++) { + if (i == txcFields.size() - 1) { + stringBuilder.append(txcFields.get(i).getSqlName()).append("=").append("?"); + } else { + stringBuilder.append(txcFields.get(i).getSqlName()).append("=").append("?").append(","); + } + } + String sql = stringBuilder.append(" where ").append(txcLine.getPrimaryKey()).append("=?").toString(); + PreparedStatement preparedStatement = connection.prepareStatement(sql); + + for (int j = 1; j <= txcFields.size(); j++) { + preparedStatement.setObject(j, txcFields.get(j - 1).getValue()); + } + + preparedStatement.setObject(1 + txcFields.size(), txcLine.getPrimaryValue()); + preparedStatements.add(preparedStatement); + } + + return preparedStatements; + + } + + @Override + protected boolean canRollback(CommitInfo commitInfo, Connection connection) throws SQLException { + String sql = commitInfo.getSql(); + SQLUpdateStatement sqlParseStatement = (SQLUpdateStatement) new MySqlStatementParser(sql).parseStatement(); + + TxcTable dbValue = UpdateParser.getInstance() + .getOriginValue(commitInfo.getWhereParams(), sqlParseStatement, connection); + + if ( commitInfo.getOriginalValue().getLine().size() == 0) { + logger.error("未影响行数,不回滚"); + return false; + } + + for (TxcLine txcLine : dbValue.getLine()) { + boolean diff = DiffUtils.diff(commitInfo.getPresentValue().getLine().get(0), txcLine); + if (!diff) { + try { + logger.error("数据不一致,不支持回滚操作, before:{},after:{}", + DiffUtils.getObjectMapper().writeValueAsString(commitInfo.getPresentValue().getLine().get(0)), + DiffUtils.getObjectMapper().writeValueAsString(txcLine)); + } catch (Exception e) { + logger.error("error", e); + } + return false; + } + } + + return true; + } + +} From 975b2d5c050d5bc9900c83fb0c762cd2fd67ee7d Mon Sep 17 00:00:00 2001 From: caisirius Date: Wed, 25 Jul 2018 17:37:46 +0800 Subject: [PATCH 09/83] =?UTF-8?q?txc=20=E8=BF=9E=E6=8E=A5=E5=9C=A8?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=20@Transaction=20=E6=B3=A8=E8=A7=A3=E6=97=B6?= =?UTF-8?q?=EF=BC=8CwaitTask=E6=B2=A1=E6=9C=89=E7=AD=89=E5=BE=85=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../relational/txc/AbstractTxcConnection.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/AbstractTxcConnection.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/AbstractTxcConnection.java index c68e88c1c..b5d9e66ce 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/AbstractTxcConnection.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/AbstractTxcConnection.java @@ -44,6 +44,8 @@ public abstract class AbstractTxcConnection extends AbstractTransactionThread private boolean readOnly = false; + volatile int state = 1; + private Connection connection; DataSourceService dataSourceService; @@ -109,20 +111,23 @@ public void commit() throws SQLException { connection.commit(); - if (readOnly) { - return; - } - startRunnable(); + state = 1; } @Override public void rollback() throws SQLException { connection.rollback(); + state = 0; } @Override public void close() throws SQLException { connection.close(); + // 只有提交才需要 开启线程等待 + if (readOnly || state == 0) { + return; + } + startRunnable(); } @Override From 695202cbcf650591a52af5df587ba1ce5df76b94 Mon Sep 17 00:00:00 2001 From: caisirius Date: Wed, 25 Jul 2018 17:42:08 +0800 Subject: [PATCH 10/83] =?UTF-8?q?@TxTransaction=20=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20readOnly=E5=8F=82=E6=95=B0=20=20=20=20=20?= =?UTF-8?q?=20*=20=E6=A0=87=E7=A4=BA=E6=9C=AC=E6=9C=8D=E5=8A=A1=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E6=98=AF=E5=8F=AA=E8=AF=BB=20=20=20=20=20=20*=20?= =?UTF-8?q?=E8=8B=A5=E4=B8=BAtrue=20:=20=E4=B8=8D=E4=BC=9A=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E4=BA=8B=E5=8A=A1=E7=BB=84;=20Connection=20=E4=B8=8D?= =?UTF-8?q?=E4=BC=9A=E8=A2=AB=20Wrap=20=20=20=20=20=20*=20=E5=9C=A8?= =?UTF-8?q?=E6=9C=AC=E6=9C=8D=E5=8A=A1=E6=97=A0DB=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E6=88=96=E4=BB=85=E6=9C=89=E6=9F=A5=E8=AF=A2=E6=97=B6=E8=AF=B7?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=20true=20=E5=B0=86=E6=8F=90=E9=AB=98?= =?UTF-8?q?=E6=80=A7=E8=83=BD=20=20=20=20=20=20*=20=E8=8B=A5=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E9=83=BD=E6=B2=A1=E6=9C=89DB=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E6=AD=A4=E9=85=8D=E7=BD=AE=E6=97=A0=E6=84=8F=E4=B9=89?= =?UTF-8?q?=E4=B8=8D=E7=94=A8=E8=AE=BE=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/codingapi/tx/annotation/TxTransaction.java | 8 ++++++++ .../service/impl/TransactionServerFactoryServiceImpl.java | 7 ++++--- .../service/impl/TxRunningNoTransactionServerImpl.java | 5 +++-- .../tx/aop/service/impl/TxStartTransactionServerImpl.java | 1 + .../codingapi/tx/datasource/AbstractResourceProxy.java | 7 ++++++- 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/tx-client/src/main/java/com/codingapi/tx/annotation/TxTransaction.java b/tx-client/src/main/java/com/codingapi/tx/annotation/TxTransaction.java index ab707ca36..4584b13ad 100644 --- a/tx-client/src/main/java/com/codingapi/tx/annotation/TxTransaction.java +++ b/tx-client/src/main/java/com/codingapi/tx/annotation/TxTransaction.java @@ -37,4 +37,12 @@ * @return */ TxTransactionMode mode() default TxTransactionMode.TX_MODE_LCN; + + /** + * 标示本服务是否是只读 + * 若为true : 不会加入事务组; Connection 不会被 Wrap; 事务信息能正常传递 + * 在本服务无DB操作或仅有查询时请配置 true 将提高性能 + * 若应用都没有DB配置,此配置无意义不用设值 + */ + boolean readOnly() default false; } 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 4aa1946d0..8d1d06c98 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 @@ -70,10 +70,11 @@ public TransactionServer createTransactionServer(TxTransactionInfo info) throws if (info.getTxTransactionLocal() != null) { return txDefaultTransactionServer; } else { - if(!transactionControl.isNoTransactionOperation()) { //有事务业务的操作 - return txRunningTransactionServer; - }else { + if(transactionControl.isNoTransactionOperation() // 表示整个应用没有获取过DB连接 + || info.getTransaction().readOnly()) { //无事务业务的操作 return txRunningNoTransactionServer; + }else { + return txRunningTransactionServer; } } } else { 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 a1518d92a..b38579a0e 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 @@ -25,7 +25,7 @@ public Object execute(final ProceedingJoinPoint point, final TxTransactionInfo i String kid = KidUtils.generateShortUuid(); String txGroupId = info.getTxGroupId(); - logger.debug("--->begin no db transaction, groupId: " + txGroupId); + logger.debug("--->begin readonly transaction, groupId: " + txGroupId); long t1 = System.currentTimeMillis(); @@ -35,6 +35,7 @@ public Object execute(final ProceedingJoinPoint point, final TxTransactionInfo i txTransactionLocal.setKid(kid); txTransactionLocal.setMaxTimeOut(Constants.txServer.getCompensateMaxWaitTime()); txTransactionLocal.setMode(info.getMode()); + txTransactionLocal.setReadOnly(true); TxTransactionLocal.setCurrent(txTransactionLocal); try { @@ -44,7 +45,7 @@ public Object execute(final ProceedingJoinPoint point, final TxTransactionInfo i } finally { TxTransactionLocal.setCurrent(null); long t2 = System.currentTimeMillis(); - logger.debug("<---end no db transaction,groupId:" + txGroupId+",execute time:"+(t2-t1)); + logger.debug("<---end readonly transaction,groupId:" + txGroupId+",execute time:"+(t2-t1)); } } 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 2dfa94441..69d90bf07 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 @@ -52,6 +52,7 @@ public Object execute(ProceedingJoinPoint point,final TxTransactionInfo info) th txTransactionLocal.setHasStart(true); txTransactionLocal.setMaxTimeOut(Constants.txServer.getCompensateMaxWaitTime()); txTransactionLocal.setMode(info.getTransaction().mode()); + txTransactionLocal.setReadOnly(info.getTransaction().readOnly()); TxTransactionLocal.setCurrent(txTransactionLocal); diff --git a/tx-client/src/main/java/com/codingapi/tx/datasource/AbstractResourceProxy.java b/tx-client/src/main/java/com/codingapi/tx/datasource/AbstractResourceProxy.java index e72ba382f..69d21f1b4 100644 --- a/tx-client/src/main/java/com/codingapi/tx/datasource/AbstractResourceProxy.java +++ b/tx-client/src/main/java/com/codingapi/tx/datasource/AbstractResourceProxy.java @@ -79,6 +79,10 @@ protected ILCNResource loadConnection(){ logger.debug("loadConnection -> null !"); return null; } + if (txTransactionLocal.isReadOnly()) { + logger.debug("readonly tx don't reuse connection."); + return null; + } //是否获取旧连接的条件:同一个模块下被多次调用时第一次的事务操作 ILCNResource old = pools.get(txTransactionLocal.getGroupId()); @@ -132,7 +136,8 @@ protected C initLCNConnection(C connection) { C lcnConnection = connection; TxTransactionLocal txTransactionLocal = TxTransactionLocal.current(); - if (txTransactionLocal != null&&!txTransactionLocal.isHasConnection()) { + if (txTransactionLocal != null&&!txTransactionLocal.isHasConnection() + && !txTransactionLocal.isReadOnly()) { logger.debug("lcn datasource transaction control "); From 745405b89a599c779c998819c907f8c4c0e8845f Mon Sep 17 00:00:00 2001 From: caisirius Date: Wed, 25 Jul 2018 17:52:30 +0800 Subject: [PATCH 11/83] =?UTF-8?q?=E5=A4=84=E7=90=86=E6=9E=81=E7=AB=AF?= =?UTF-8?q?=E6=83=85=E5=86=B5=EF=BC=9A=20=E5=9C=A8=20TxRunning=E4=B8=AD=20?= =?UTF-8?q?point.proceed()=20=E4=B8=9A=E5=8A=A1=E4=BB=A3=E7=A0=81=E4=B8=AD?= =?UTF-8?q?=20db=E4=BA=8B=E5=8A=A1=E6=AD=A3=E5=B8=B8=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=EF=BC=8C=E5=BC=80=E5=A7=8B=E7=AD=89=E5=BE=85=EF=BC=8C=E5=90=8E?= =?UTF-8?q?=E7=BB=AD=E5=A4=84=E7=90=86=E5=8F=91=E7=94=9F=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E3=80=82=20=E7=94=B1=E4=BA=8E=E6=B2=A1=E6=9C=89=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E4=BA=8B=E5=8A=A1=E7=BB=84=EF=BC=8C=E4=B8=8D=E4=BC=9A?= =?UTF-8?q?=E6=94=B6=E5=88=B0=E9=80=9A=E7=9F=A5=EF=BC=8C=E5=8F=AA=E8=83=BD?= =?UTF-8?q?=E7=AD=89=E5=88=B0=E8=B6=85=E6=97=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/TxRunningTransactionServerImpl.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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 c5b6aeeb1..24e81e454 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 @@ -95,6 +95,19 @@ public Object execute(final ProceedingJoinPoint point, final TxTransactionInfo i return res; } catch (Throwable e) { + // 这里处理以下情况:当 point.proceed() 业务代码中 db事务正常提交,开始等待,后续处理发生异常。 + // 由于没有加入事务组,不会收到通知。这里唤醒并回滚 + if(!isHasIsGroup) { + String type = txTransactionLocal.getType(); + TxTask waitTask = TaskGroupManager.getInstance().getTask(kid, type); + // 有一定几率不能唤醒: wait的代码是在另一个线程,有可能线程还没执行到wait,先执行到了这里 + // TODO 要不要 sleep 1毫秒 + logger.warn("wake the waitTask: {}", (waitTask != null && waitTask.isAwait())); + if (waitTask != null && waitTask.isAwait()) { + waitTask.setState(-1); + waitTask.signalTask(); + } + } throw e; } finally { TxTransactionLocal.setCurrent(null); From 9f82528ac325a49ac34ce4755be2bcdde2de3fea Mon Sep 17 00:00:00 2001 From: caisirius Date: Wed, 25 Jul 2018 18:40:20 +0800 Subject: [PATCH 12/83] =?UTF-8?q?txc=20bug=20:=20=E4=B8=8D=E5=BC=80?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E7=AD=89=E5=BE=85=E5=B0=B1=E8=A6=81=E6=8A=8A?= =?UTF-8?q?waitTask=20remove?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasource/relational/txc/AbstractTxcConnection.java | 1 + .../tx/datasource/relational/txc/TxcDBConnection.java | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/AbstractTxcConnection.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/AbstractTxcConnection.java index b5d9e66ce..1d5cb4202 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/AbstractTxcConnection.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/AbstractTxcConnection.java @@ -125,6 +125,7 @@ public void close() throws SQLException { connection.close(); // 只有提交才需要 开启线程等待 if (readOnly || state == 0) { + closeConnection(); return; } startRunnable(); diff --git a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcDBConnection.java b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcDBConnection.java index 06873d328..2d039dedd 100644 --- a/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcDBConnection.java +++ b/tx-plugins-db/src/main/java/com/codingapi/tx/datasource/relational/txc/TxcDBConnection.java @@ -68,7 +68,12 @@ public void run() { @Override protected void closeConnection() throws SQLException { - // do nothing + + if (waitTask != null) { + if (!waitTask.isRemove()) { + waitTask.remove(); + } + } } @Override From 18bea27355df34422c4ba0fcde4cffcfbfca6554 Mon Sep 17 00:00:00 2001 From: wangliang <1991wangliang@gmail.com> Date: Fri, 27 Jul 2018 14:51:49 +0800 Subject: [PATCH 13/83] 4.2.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 49d827226..8962f1404 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# LCN分布式事务框架v4.0 +# LCN分布式事务框架v4.0 "LCN并不生产事务,LCN只是本地事务的协调者" 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 14/83] 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 15/83] =?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 zcmbTd1CXW7vMxN+wr$(CZCk5to71*!+jjS~ZJX1!ds=tCefGhB{(HVS`>u$J^~PFn zW>r>YRc2N`sUQsug7OUl0^-}ZZ-jr^e|{kUJj#ly2+~T*iO~apQ;-J#>z!{v|9nH? zexD9D~4A70;F%I|$?{aX9)~)7!NMGs_XtoO(D2z3Q#5Lmj zOYWk1b{iMmsdX30UFmYyZk1gWICVeOtk^$+{3U2(8gx?WA2F!EfBPf&|1?AJ|5Z>M zfUAk^zcf#n|9^4|J34286~NKrUt&c5cZ~iqE?PH7fW5tm3-qG$) z56%`QPSn!0RMV3)jjXfG^UQ}*^yBojH!}58lPlDclX5iUhf*|DV=~e*bl;(l$Wn@r zPE*iH(NK!e9KQcU$rRM}aJc?-&H1PO&vOs*=U+QVvwuk-=zr1x>;XpRCjSyC;{TWQ z|824V8t*^*{x=5yn^pP#-?k<5|7|4y&Pd44&e_TN&sxg@ENqpX0glclj&w%W04Jwp zwJ}#@ag^@h5VV4H5U@i7V#A*a;4bzM-y_rd{0WG#jRFPJU}(#&o8vo@uM+B+$>Tiq zei^5$wg8CVf{+_#Vh`yPx-6TmB~zT_nocS_Rb6&EYp*KjbN#-aP<~3j=NVuR)S1wm zdy3AWx2r9uww3eNJxT>{tdmY4#pLw`*`_fIwSu;yzFYP)=W6iawn`s*omzNbR?E&LyC17rFcjWp!M~p?;{v!78DTxtF85BK4dT< zA5p)Z%6O}mP?<%Z{>nZmbVEbomm zLgy;;N&!y>Dma2sqmbvz&KY-j&s~dd#mWGlNF%7}vS7yt>Dm{P=X zG>Pyv2D!ba0CcTI*G6-v?!0}`EWm1d?K)DgZIQk9eucI&lBtR))NxqVz)+hBR1b|7 zgv&^46cI?mgCvp>lY9W(nJT#^<*kY3o#Php1RZLY@ffmLLq3A!Yd}O~n@BhXVp`<5 zJx`BjR%Svv)Sih_8TFg-9F-Gg3^kQrpDGej@uT5%y_9NSsk5SW>7{>&11u(JZHsZO zZweI|!&qHl0;7qxijraQo=oV^Pi~bNlzx;~b2+hXreonWGD%C$fyHs+8d1kKN>TgB z{Mu?~E{=l1osx|_8P*yC>81_GB7>NS7UA+x2k_c*cU-$gQjR{+IU)z069Ic$<)ci< zb?+V#^-MK!0s~wRP|grx?P^8EZ(9Jt0iA{`uVS6fNo>b@as5_-?e766V}&)8ZOEVtKB z*HtHAqat+2lbJbEI#fl~`XKNIF&J?PHKq)A!z(#j%)Uby=5d!bQP)-Mr!0#J=FV%@9G#Cby%r#(S=23H#9d)5Ndy>pIXJ%si!D=m*-QQZ(O9~#Jhx#AS3 z&Vs+*E5>d+{ib4>FEd#L15-ovl*zV%SYSWF>Z}j!vGn=g%w0~3XvAK&$Dl@t5hiUa#mT(4s9-JF1l zPi5d2YmuFJ4S(O>g~H)5l_`%h3qm?+8MmhXA>GRN}7GX;$4(!WTkYZB=TA^8ZFh^d9_@x$fK4qenP!zzaqQ1^(GQ- zjC$P$B5o{q&-H8UH_$orJTv0}#|9ja(vW9gA%l|@alYk+Uth1ey*ax8wmV7U?^Z9? zsQMrEzP8|_s0=bii4wDWa7te&Vmh9T>fcUXJS|dD3Y$A`s-7kY!+idEa`zB) zaW*%xb+#}9INSa62(M1kwL=m_3E2T|l5Sm9QmON8ewxr#QR`;vOGCgyMsA8$O(;=U z#sEw)37duzeM#9_7l!ly#5c+Mu3{;<9%O{e z`+0*{COEF^py;f6)y6NX)gycj`uU9pdZMum9h(bS!zu1gDXdmF4{Og{u;d(Dr~Co1 z1tm@i#5?>oL}-weK1zJRlLv*+M?l=eI~Sp9vg{R6csq=3tYSB2pqB8 z=#p`us7r|uH=cZnGj|juceAu8J#vb+&UFLFmGn~9O|TNeGH>sboBl%JI9v(@^|45? zLvr2ha)NWP4yxV8K%dU(Ae=zl)qdGyz={$my;Vs6?4?2*1?&u!OFyFbAquv6@1e)~&Rp#Ww9O88!mrze((=@F?&BPl_u9gK4VlHo@4gLK_pGtEA(gO4YpIIWTrFN zqVi%Q{adXq^Ez~dZ0VUC>DW`pGtpTY<9tMd;}WZUhT1iy+S^TfHCWXGuDwAv1Ik85 zh3!tSlWU3*aLtmdf?g(#WnLvVCXW$>gnT_{(%VilR=#2VKh~S}+Po#ha9C*<-l~Fx z$EK{1SO8np&{JC)7hdM8O+C( zF^s3HskJz@p3ot`SPKA92PG!PmC2d|9xA!CZxR!rK9-QYYBGAM-Gj zCqzBaIjtOZ6gu+lA%**RI7to$x^s8xIx}VF96=<29CjWtsl;tmNbuHgrCyB^VzEIB zt@sqnl8Vg`pnMppL6vbjNNKc?BrH<)fxiZ|WrYW%cnz-FMENGzMI+)@l7dit?oP|Wu zg-oLcv~79=fdqEM!zK%lI=R7S!Do!HBaD+*h^ULWVB}4jr^e5oUqY`zA&NUvzseI% z+XCvzS+n|m7WJoyjXXk(PE8;i^r$#Pq|NFd!{g~m2OecA1&>$7SYFw z;}Q{`F3LCE34Z>5;5dDtz&2Z&w|B9fwvU<@S<BBo(L4SbDV#X3%uS+<2q7iH+0baiGzlVP5n0fBDP z7kx+7|Cws+?T|cw-pt~SIa7BRDI_ATZ9^aQS^1I?WfnfEHZ*sGlT#Wk9djDL?dWLA zk%(B?<8L?iV*1m803UW|*sU$raq<(!N!CrQ&y7?7_g zF2!aAfw5cWqO}AX)+v)5_GvQ$1W8MV8bTMr3P{^!96Q4*YhS}9ne|+3GxDJmZEo zqh;%RqD5&32iTh7kT>EEo_%`8BeK&)$eXQ-o+pFIP!?lee z&kos;Q)_afg1H&{X|FTQ0V z@yxv4KGGN)X|n|J+(P6Q`wmGB;J}bBY{+LKVDN9#+_w9s$>*$z)mVQDOTe#JG)Zz9*<$LGBZ-umW@5k5b zbIHp=SJ13oX%IU>2@oqcN?)?0AFN#ovwS^|hpf5EGk0#N<)uC{F}GG}%;clhikp2* zu6ra2gL@2foI>7sL`(x5Q)@K2$nG$S?g`+JK(Q0hNjw9>kDM|Gpjmy=Sw5&{x5$&b zE%T6x(9i|z4?fMDhb%$*CIe2LvVjuHca`MiMcC|+IU51XfLx(BMMdLBq_ z65RKiOC$0w-t)Cyz0i-HEZpkfr$>LK%s5kga^FIY_|fadzu*r^$MkNMc!wMAz3b4P+Z3s(z^(%(04}dU>ef$Xmof(A|XXLbR z2`&3VeR1&jjKTut_i?rR_47Z`|1#$NE$&x#;NQM|hxDZ>biQ*+lg5E62o65ILRnOOOcz%Q;X$MJ?G5dYmk$oL_bONX4 zT^0yom^=NsRO^c$l02#s0T^dAAS&yYiA=;rLx;{ro6w08EeTdVF@j^}Bl;o=`L%h! zMKIUv(!a+>G^L3{z7^v3W$FUUHA+-AMv~<}e?2?VG|!itU~T>HcOKaqknSog zE}yY1^VrdNna1B6qA`s?grI>Y4W%)N;~*MH35iKGAp*gtkg=FE*mFDr5n2vbhwE|4 zZ!_Ss*NMZdOKsMRT=uU{bHGY%Gi=K{OD(YPa@i}RCc+mExn zQogd@w%>14cfQrB@d5G#>Lz1wEg?jJ0|(RwBzD74Eij@%3lyoBXVJpB{q0vHFmE7^ zc91!c%pt&uLa|(NyGF2_L6T{!xih@hpK;7B&bJ#oZM0`{T6D9)J2IXxP?DODPdc+T zC>+Zq8O%DXd5Gog2(s$BDE3suv=~s__JQnX@uGt+1r!vPd^MM}=0((G+QopU?VWgR zqj8EF0?sC`&&Nv-m-nagB}UhXPJUBn-UaDW9;(IX#)uc zL*h%hG>ry@a|U=^=7%k%V{n=eJ%Nl0Oqs!h^>_PgNbD>m;+b)XAk+4Cp=qYxTKDv& zq1soWt*hFf%X8}MpQZL-Lg7jc0?CcWuvAOE(i^j1Km^m8tav)lMx1GF{?J#*xwms2 z3N_KN-31f;@JcW(fTA`J5l$&Q8x{gb=9frpE8K0*0Rm;yzHnDY0J{EvLRF0 zRo6ca)gfv6C)@D#1I|tgL~uHJNA-{hwJQXS?Kw=8LU1J$)nQ-&Jhwxpe+%WeL@j0q z?)92i;tvzRki1P2#poL;YI?9DjGM4qvfpsHZQkJ{J^GNQCEgUn&Sg=966 zq?$JeQT+vq%zuq%%7JiQq(U!;Bsu% zzW%~rSk1e+_t89wUQOW<8%i|5_uSlI7BcpAO20?%EhjF%s%EE8aY15u(IC za2lfHgwc;nYnES7SD&Lf5IyZvj_gCpk47H}e05)rRbfh(K$!jv69r5oI| z?){!<{InPJF6m|KOe5R6++UPlf(KUeb+*gTPCvE6! z(wMCuOX{|-p(b~)zmNcTO%FA z$-6}lkc*MKjIJ(Fyj^jkrjVPS);3Qyq~;O$p+XT+m~0$HsjB@}3}r*h(8wGbH9ktQ zbaiiMSJf`6esxC3`u@nNqvxP1nBwerm|KN)aBzu$8v_liZ0(G8}*jB zv<8J%^S2E_cu+Wp1;gT66rI$>EwubN4I(Lo$t8kzF@?r0xu8JX`tUCpaZi(Q0~_^K zs6pBkie9~06l>(Jpy*d&;ZH{HJ^Ww6>Hs!DEcD{AO42KX(rTaj)0ox`;>}SRrt)N5 zX)8L4Fg)Y6EX?He?I`oHeQiGJRmWOAboAC4Jaf;FXzspuG{+3!lUW8?IY>3%)O546 z5}G94dk)Y>d_%DcszEgADP z8%?i~Ak~GQ!s(A4eVwxPxYy3|I~3I=7jf`yCDEk_W@yfaKjGmPdM}($H#8xGbi3l3 z5#?bjI$=*qS~odY6IqL-Q{=gdr2B5FVq7!lX}#Lw**Pyk!`PHN7M3Lp2c=T4l}?kn zVNWyrIb(k&`CckYH;dcAY7-kZ^47EPY6{K(&jBj1Jm>t$FD=u9U z#LI%MnI3wPice+0WeS5FDi<>~6&jlqx=)@n=g5TZVYdL@2BW3w{Q%MkE%sx}=1ihvj(HDjpx!*qqta?R?| zZ(Ju_SsUPK(ZK*&EdAE(Fj%eABf2+T>*fZ6;TBP%$xr(qv;}N@%vd5iGbzOgyMCk* z3X|-CcAz%}GQHalIwd<-FXzA3btVs-_;!9v7QP)V$ruRAURJhMlw7IO@SNM~UD)2= zv}eqKB^kiB))Yhh%v}$ubb#HBQHg3JMpgNF+pN*QbIx(Rx1ofpVIL5Y{)0y&bMO(@ zyK1vv{8CJQidtiI?rgYVynw{knuc!EoQ5-eete(AmM`32lI7{#eS#!otMBRl21|g^SVHWljl8jU?GU@#pYMIqrt3mF|SSYI&I+Vz|%xuXv8;pHg zlzFl!CZ>X%V#KWL3+-743fzYJY)FkKz>GJ<#uKB)6O8NbufCW%8&bQ^=8fHYfE(lY z1Fl@4l%|iaTqu=g7tTVk)wxjosZf2tZ2`8xs9a$b1X29h!9QP#WaP#~hRNL>=IZO@SX4uYQR_c0pSt89qQR@8gJhL*iXBTSBDtlsiNvc_ewvY-cm%bd&sJTnd@hE zwBGvqGW$X^oD~%`b@yeLW%An*as@4QzwdrpKY9-E%5PLqvO6B+bf>ph+TWiPD?8Ju z-V}p@%LcX{e)?*0o~#!S%XU<+9j>3{1gfU=%sHXhukgH+9z!)AOH_A{H3M}wmfmU8 z&9jjfwT-@iRwCbIEwNP4zQHvX3v-d*y87LoudeB9Jh5+mf9Mnj@*ZCpwpQ*2Z9kBWdL19Od7q|Hdbwv+zP*FuY zQc4CJ6}NIz7W+&BrB5V%{4Ty$#gf#V<%|igk)b@OV`0@<)cj(tl8~lLtt^c^l4{qP z=+n&U0LtyRpmg(_8Qo|3aXCW77i#f{VB?JO3nG!IpQ0Y~m!jBRchn`u>HfQuJwNll zVAMY5XHOX8T?hO@7Vp3b$H)uEOy{AMdsymZ=q)bJ%n&1;>4%GAjnju}Osg@ac*O?$ zpu9dxg-*L(%G^LSMhdnu=K)6ySa|}fPA@*Saj}Z>2Dlk~3%K(Py3yDG7wKij!7zVp zUZ@h$V0wJ|BvKc#AMLqMleA*+$rN%#d95$I;;Iy4PO6Cih{Usrvwt2P0lh!XUx~PGNySbq#P%`8 zb~INQw3Woiu#ONp_p!vp3vDl^#ItB06tRXw88L}lJV)EruM*!ZROYtrJHj!X@K$zJ zp?Tb=Dj_x1^)&>e@yn{^$B93%dFk~$Q|0^$=qT~WaEU-|YZZzi`=>oTodWz>#%%Xk z(GpkgQEJAibV%jL#dU)#87T0HOATp~V<(hV+CcO?GWZ_tOVjaCN13VQbCQo=Dt9cG znSF9X-~WMYDd66Rg8Ktop~CyS7@Pj@Vr<#Ja4zcq1}FIoW$@3mfd;rY_Ak^gzwqqD z^4<_kC2Eyd#=i8_-iZ&g_e#$P`;4v zduoZTdyRyEZ-5WOJwG-bfw*;7L7VXUZ8aIA{S3~?()Yly@ga|-v%?@2vQ;v&BVZlo7 z49aIo^>Cv=gp)o?3qOraF_HFQ$lO9vHVJHSqq4bNNL5j%YH*ok`>ah?-yjdEqtWPo z+8i0$RW|$z)pA_vvR%IVz4r$bG2kSVM&Z;@U*{Lug-ShiC+IScOl?O&8aFYXjs!(O z^xTJ|QgnnC2!|xtW*UOI#vInXJE!ZpDob9x`$ox|(r#A<5nqbnE)i<6#(=p?C~P-7 zBJN5xp$$)g^l};@EmMIe;PnE=vmPsTRMaMK;K`YTPGP0na6iGBR8bF%;crF3>ZPoLrlQytOQrfTAhp;g){Mr$zce#CA`sg^R1AT@tki!m1V zel8#WUNZfj(Fa#lT*nT>^pY*K7LxDql_!IUB@!u?F&(tfPspwuNRvGdC@z&Jg0(-N z(oBb3QX4em;U=P5G?Y~uIw@E7vUxBF-Ti*ccU05WZ7`m=#4?_38~VZvK2{MW*3I#fXoFG3?%B;ki#l%i#$G_bwYQR-4w>y;2` zMPWDvmL6|DP1GVXY)x+z8(hqaV5RloGn$l&imhzZEZP6v^d4qAgbQ~bHZEewbU~Z2 zGt?j~7`0?3DgK+)tAiA8rEst>p#;)W=V+8m+%}E$p-x#)mZa#{c^3pgZ9Cg}R@XB) zy_l7jHpy(u;fb+!EkZs6@Z?uEK+$x3Ehc8%~#4V?0AG0l(vy{8u@Md5r!O+5t zsa{*GBn?~+l4>rChlbuT9xzEx2yO_g!ARJO&;rZcfjzxpA0Chj!9rI_ZD!j` z6P@MWdDv&;-X5X8o2+9t%0f1vJk3R~7g8qL%-MY9+NCvQb)%(uPK4;>y4tozQ2Dl* zEoR_1#S~oFrd9s%NOkoS8$>EQV|uE<9U*1uqAYWCZigiGlMK~vSUU}f5M9o{<*WW? z$kP)2nG$My*fUNX3SE!g7^r#zTT^mVa#A*5sBP8kz4se+o3y}`EIa)6)VpKmto6Ew z1J-r2$%PM4XUaASlgVNv{BBeL{CqJfFO|+QpkvsvVBdCA7|vlwzf1p$Vq50$Vy*O+ z5Eb85s^J2MMVj53l4_?&Wpd1?faYE-X1ml-FNO-|a;ZRM*Vp!(ods{DY6~yRq%{*< zgq5#k|KJ70q47aO1o{*gKrMHt)6+m(qJi#(rAUw0Uy8~z8IX)>9&PTxhLzh#Oh*vZ zPd1b$Z&R{yc&TF^x?iQCw#tV}la&8^W)B*QZ${19LlRYgu#nF7Zj`~CtO^0S#xp+r zLYwM~si$I>+L}5gLGhN=dyAKO)KqPNXUOeFm#o+3 z&#!bD%aTBT@&;CD_5MMC&_Yi+d@nfuxWSKnYh0%~{EU`K&DLx}ZNI2osu#(gOF2}2 zZG#DdQ|k0vXj|PxxXg-MYSi9gI|hxI%iP)YF2$o< zeiC8qgODpT?j!l*pj_G(zXY2Kevy~q=C-SyPV$~s#f-PW2>yL}7V+0Iu^wH;AiI$W zcZDeX<2q%!-;Ah!x_Ld;bR@`bR4<`FTXYD(%@CI#biP z5BvN;=%AmP;G0>TpInP3gjTJanln8R9CNYJ#ziKhj(+V33zZorYh0QR{=jpSSVnSt zGt9Y7Bnb#Ke$slZGDKti&^XHptgL7 zkS)+b>fuz)B8Lwv&JV*};WcE2XRS63@Vv8V5vXeNsX5JB?e|7dy$DR9*J#J= zpKL@U)Kx?Y3C?A3oNyJ5S*L+_pG4+X*-P!Er~=Tq7=?t&wwky3=!x!~wkV$Ufm(N| z1HY?`Ik8?>%rf$6&0pxq8bQl16Jk*pwP`qs~x~Trcstqe-^hztuXOG zrYfI7ZKvK$eHWi9d{C${HirZ6JU_B`f$v@SJhq?mPpC-viPMpAVwE;v|G|rqJrE5p zRVf904-q{rjQ=P*MVKXIj7PSUEzu_jFvTksQ+BsRlArK&A*=>wZPK3T{Ki-=&WWX= z7x3VMFaCV5;Z=X&(s&M^6K=+t^W=1>_FFrIjwjQtlA|-wuN7&^v1ymny{51gZf4-V zU8|NSQuz!t<`JE%Qbs||u-6T*b*>%VZRWsLPk&umJ@?Noo5#{z$8Q0oTIv00`2A`# zrWm^tAp}17z72^NDu^95q1K)6Yl`Wvi-EZA+*i&8%HeLi*^9f$W;f1VF^Y*W;$3dk|eLMVb_H{;0f*w!SZMoon+#=CStnG-7ZU8V>Iy( zmk;42e941mi7!e>J0~5`=NMs5g)WrdUo^7sqtEvwz8>H$qk=nj(pMvAb4&hxobPA~p&-L5a_pTs&-0XCm zKXZ8BkkriiwE)L2CN$O-`#b15yhuQO7f_WdmmG<-lKeTBq_LojE&)|sqf;dt;llff znf|C$@+knhV_QYVxjq*>y@pDK|DuZg^L{eIgMZnyTEoe3hCgVMd|u)>9knXeBsbP_$(guzw>eV{?5l$ z063cqIysrx82-s6k;vE?0jxzV{@`jY3|*Wp?EdNUMl0#cBP$~CHqv$~sB5%50`m(( zSfD%qnxbGNM2MCwB+KA?F>u__Ti>vD%k0#C*Unf?d)bBG6-PYM!!q;_?YWptPiHo} z8q3M~_y9M6&&0#&uatQD6?dODSU)%_rHen`ANb z{*-xROTC1f9d!8`LsF&3jf{OE8~#;>BxHnOmR}D80c2Eh zd867kq@O$I#zEm!CCZJw8S`mCx}HrCl_Rh4Hsk{Cb_vJ4VA3GK+icku z%lgw)Y@$A0kzEV^#=Zj8i6jPk&Mt_bKDD!jqY3&W(*IPbzYu$@x$|3*aP{$bz-~xE^AOxtbyWvzwaCOHv6+99llI&xT_8)qX3u|y|0rDV z(Hu*#5#cN0mw4OSdY$g_xHo-zyZ-8WW&4r%qW(=5N>0O-t{k;#G9X81F~ynLV__Kz zbW1MA>Pjg0;3V?iV+-zQsll_0jimGuD|0GNW^av|4yes(PkR1bGZwO6xvgCy}ThR7?d&$N`kA3N!Xn5uSKKCT-`{lE1ZYYy?GzL}WF+mh|sgT6K2Z*c9YB zFSpGRNgYvk&#<2@G(vUM5GB|g?gk~-w+I4C{vGu{`%fiNuZIeu@V1qt`-x$E?OR;zu866Y@2^et5GTNCpX#3D=|jD5>lT^vD$ zr}{lRL#Lh4g45Yj43Vs7rxUb*kWC?bpKE1@75OJQ=XahF z5(C0DyF;at%HtwMTyL!*vq6CLGBi^Ey}Mx39TC2$a)UmekKDs&!h>4Hp2TmSUi!xo zWYGmyG)`$|PeDuEL3C6coVtit>%peYQ6S1F4AcA*F`OA;qM+1U6UaAI(0VbW#!q9* zz82f@(t35JH!N|P4_#WKK6Rc6H&5blD6XA&qXahn{AP=oKncRgH!&=b6WDz?eexo* z9pzh}_aBc_R&dZ+OLk+2mK-5UhF`>}{KN7nOxb{-1 zd`S-o1wgCh7k0u%QY&zoZH}!<;~!)3KTs-KYRg}MKP3Vl%p$e6*MOXLKhy)<1F5L* z+!IH!RHQKdpbT8@NA+BFd=!T==lzMU95xIyJ13Z6zysYQ1&zzH!$BNU(GUm1QKqm< zTo#f%;gJ@*o;{#swM4lKC(QQ<%@;7FBskc7$5}W9Bi=0heaVvuvz$Ml$TR8@}qVn>72?6W1VAc{Mt}M zkyTBhk|?V}z`z$;hFRu8Vq;IvnChm+no@^y9C1uugsSU`0`46G#kSN9>l_ozgzyqc zZnEVj_a-?v@?JmH1&c=~>-v^*zmt`_@3J^eF4e))l>}t2u4L`rueBR=jY9gZM;`nV z>z(i<0eedu2|u-*#`SH9lRJ7hhDI=unc z?g^30aePzkL`~hdH*V7IkDGnmHzVr%Q{d7sfb7(|)F}ijXMa7qg!3eHex)_-$X;~* z>Zd8WcNqR>!`m#~Xp;r4cjvfR{i04$&f1)7sgen9i>Y|3)DCt^f)`uq@!(SG?w|tdSLS+<;ID74 zTq8FJYHJHrhSwvKL|O1ZnSbG-=l6Eg-Suv60Xc;*bq~g+LYk*Q&e)tR_h3!(y)O}$ zLi*i5ec^uHkd)fz2KWiR;{RosL%peU`TxM7w*M9m#rAiG`M)FTB>=X@|A`7x)zn5- z$MB5>0qbweFB249EI@!zL~I7JSTZbzjSMMJ=!DrzgCS!+FeaLvx~jZXwR`BFxZ~+A z=!Pifk?+2awS3DVi32fgZRaqXZq2^->izZpIa1sEog@01#TuEzq%*v359787rZoC( z9%`mDR^Hdxb%XzUt&cJN3>Cl{wmv{@(h>R38qri1jLKds0d|I?%Mmhu2pLy=< zOkKo4UdS`E9Y~z3z{5_K+j~i7Ou}q0?Qv4YebBya1%VkkWzR%+oB!c?9(Ydaka32! zTEv*zgrNWs`|~Q{h?O|8s0Clv{Kg0$&U}?VFLkGg_y=0Qx#=P${6SNQFp!tDsTAPV z0Ra{(2I7LAoynS0GgeQ6_)?rYhUy}AE^$gwmg?i!x#<9eP=0N=>ZgB#LV9|aH8q#B za|O-vu(GR|$6Ty!mKtIfqWRS-RO4M0wwcSr9*)2A5`ZyAq1`;6Yo)PmDLstI zL2%^$1ikF}0w^)h&000z8Uc7bKN6^q3NBfZETM+CmMTMU`2f^a#BqoYm>bNXDxQ z`3s6f6zi5sj70>rMV-Mp$}lP|jm6Zxg}Sa*$gNGH)c-upqOC7vdwhw}e?`MEMdyaC zP-`+83ke+stJPTsknz0~Hr8ea+iL>2CxK-%tt&NIO-BvVt0+&zsr9xbguP-{3uW#$ z<&0$qcOgS{J|qTnP;&!vWtyvEIi!+IpD2G%Zs>;k#+d|wbodASsmHX_F#z?^$)zN5 zpQSLH`x4qglYj*{_=8p>!q39x(y`B2s$&MFQ>lNXuhth=8}R}Ck;1}MI2joNIz1h| zjlW@TIPxM_7 zKBG{Thg9AP%B2^OFC~3LG$3odFn_mr-w2v**>Ub7da@>xY&kTq;IGPK5;^_bY5BP~ z2fiPzvC&osO@RL)io905e4pY3Yq2%j&)cfqk|($w`l`7Pb@407?5%zIS9rDgVFfx! zo89sD58PGBa$S$Lt?@8-AzR)V{@Q#COHi-EKAa5v!WJtJSa3-Wo`#TR%I#UUb=>j2 z7o-PYd_OrbZ~3K`pn*aw2)XKfuZnUr(9*J<%z@WgC?fexFu%UY!Yxi6-63kAk7nsM zlrr5RjxV45AM~MPIJQqKpl6QmABgL~E+pMswV+Knrn!0T)Ojw{<(yD8{S|$(#Z!xX zpH9_Q>5MoBKjG%zzD*b6-v>z&GK8Dfh-0oW4tr(AwFsR(PHw_F^k((%TdkglzWR`iWX>hT1rSX;F90?IN4&}YIMR^XF-CEM(o(W@P#n?HF z!Ey(gDD_0vl+{DDDhPsxspBcks^JCEJ$X74}9MsLt=S?s3)m zQ0cSrmU*<u;KMgi1(@Ip7nX@4Zq>yz;E<(M8-d0ksf0a2Ig8w2N-T69?f}j}ufew}LYD zxr7FF3R7yV0Gu^%pXS^49){xT(nPupa(8aB1>tfKUxn{6m@m1lD>AYVP=<)fI_1Hp zIXJW9gqOV;iY$C&d=8V)JJIv9B;Cyp7cE}gOoz47P)h)Y?HIE73gOHmotX1WKFOvk z5(t$Wh^13vl;+pnYvJGDz&_0Hd3Z4;Iwa-i3p|*RN7n?VJ(whUPdW>Z-;6)Re8n2# z-mvf6o!?>6wheB9q}v~&dvd0V`8x&pQkUuK_D?Hw^j;RM-bi_`5eQE5AOIzG0y`Hr zceFx7x-<*yfAk|XDgPyOkJ?){VGnT`7$LeSO!n|o=;?W4SaGHt4ngsy@=h-_(^qX)(0u=Duy02~Fr}XWzKB5nkU$y`$67%d^(`GrAYwJ? zN75&RKTlGC%FP27M06zzm}Y6l2(iE*T6kdZPzneMK9~m)s7J^#Q=B(Okqm1xB7wy< zNC>)8Tr$IG3Q7?bxF%$vO1Y^Qhy>ZUwUmIW5J4=ZxC|U)R+zg4OD$pnQ{cD`lp+MM zS3RitxImPC0)C|_d18Shpt$RL5iIK~H z)F39SLwX^vpz;Dcl0*WK*$h%t0FVt`Wkn<=rQ6@wht+6|3?Yh*EUe+3ISF zbbV(J6NNG?VNIXC)AE#(m$5Q?&@mjIzw_9V!g0#+F?)2LW2+_rf>O&`o;DA!O39Rg ziOyYKXbDK!{#+cj_j{g;|IF`G77qoNBMl8r@EIUBf+7M|eND2#Y#-x=N_k3a52*fi zp-8K}C~U4$$76)@;@M@6ZF*IftXfwyZ0V+6QESKslI-u!+R+?PV=#65d04(UI%}`r z{q6{Q#z~xOh}J=@ZN<07>bOdbSI(Tfcu|gZ?{YVVcOPTTVV52>&GrxwumlIek}OL? zeGFo#sd|C_=JV#Cu^l9$fSlH*?X|e?MdAj8Uw^@Dh6+eJa?A?2Z#)K zvr7I|GqB~N_NU~GZ?o1A+fc@%HlF$71Bz{jOC{B*x=?TsmF0DbFiNcnIuRENZA43a zfFR89OAhqSn|1~L4sA9nVHsFV4xdIY_Ix>v0|gdP(tJ^7ifMR_2i4McL#;94*tSY) zbwcRqCo$AnpV)qGHZ~Iw_2Q1uDS2XvFff#5BXjO!w&1C^$Pv^HwXT~vN0l}QsTFOz zp|y%Om9}{#!%cPR8d8sc4Y@BM+smy{aU#SHY>>2oh1pK+%DhPqc2)`!?wF{8(K$=~ z<4Sq&*`ThyQETvmt^NaN{Ef2FQ)*)|ywK%o-@1Q9PQ_)$nJqzHjxk4}L zJRnK{sYP4Wy(5Xiw*@M^=SUS9iCbSS(P{bKcfQ(vU?F~)j{~tD>z2I#!`eFrSHf;v zquo)*?AW$#+qP}n$%<{;wr$()*yw5N`8_rOTs^kOqyY;dIjsdw*6k_mL}v2V9C_*sK<_L8 za<3)C%4nRybn^plZ(y?erFuRVE9g%mzsJzEi5CTx?wwx@dpDFSOAubRa_#m+=AzZ~ z^0W#O2zIvWEkxf^QF660(Gy8eyS`R$N#K)`J732O1rK4YHBmh|7zZ`!+_91uj&3d} zKUqDuDQ8YCmvx-Jv*$H%{MrhM zw`g@pJYDvZp6`2zsZ(dm)<*5p3nup(AE6}i#Oh=;dhOA=V7E}98CO<1Lp3*+&0^`P zs}2;DZ15cuT($%cwznqmtTvCvzazAVu5Ub5YVn#Oo1X|&MsVvz8c5iwRi43-d3T%tMhcK#ke{i-MYad@M~0B_p`Iq){RLadp-6!peP^OYHTq~^vM zqTr5=CMAw|k3QxxiH;`*;@GOl(PXrt(y@7xo$)a3Fq4_xRM_3+44!#E zO-YL^m*@}MVI$5PM|N8Z2kt-smM>Jj@Dkg5%`lYidMIbt4v=Miqj4-sEE z)1*5VCqF1I{KZVw`U0Wa!+)|uiOM|=gM65??+k|{E6%76MqT>T+;z{*&^5Q9ikL2D zN2}U$UY)=rIyUnWo=yQ@55#sCZeAC}cQA(tg5ZhqLtu*z>4}mbfoZ>JOj-|a2fR$L zQ(7N$spJL_BHb6Bf%ieO10~pQX%@^WKmQOQNOUe4h|M}XOTRL`^QVpN$MjJ7t+UdP zDdzcK3e7_fdv)PPR>O|-`kVC1_O08_WGcQXj*W5d?}3yE?-fZ_@mE-zcq6^Mn49!; zDDcus*@4dFIyZ%_d3*MO=kk3$MQ^?zaDR1-o<<7T=;`8 zz2(w>U9IQ+pZ<*B;4dE@LnlF7YwNG>la#rQ@mC4u@@0_pf40+<&t)+9(YOgCP9(aJ z5v7SRi(y4;fWR)oHRxf2|Va=?P zXq&7GtTYd+3U{Wm5?#e7gDwz#OFbvHL4Jq{BGhNYzh|U!1$_WEJef&NKDD9)*$d+e ztXF1-rvO5OBm{g9Mo8x?^YB;J|G*~3m@2y%Fyx6eb*O^lW- z`JUL?!exvd&SL_w89KoQxw5ZZ}7$FD4s>z`!3R}6vcFf0lWNYjH$#P z<)0DiPN%ASTkjWqlBB;8?RX+X+y>z*$H@l%_-0-}UJ>9l$`=+*lIln9lMi%Q7CK-3 z;bsfk5N?k~;PrMo)_!+-PO&)y-pbaIjn;oSYMM2dWJMX6tsA5>3QNGQII^3->manx z(J+2-G~b34{1^sgxplkf>?@Me476Wwog~$mri{^`b3K0p+sxG4oKSwG zbl!m9DE87k>gd9WK#bURBx%`(=$J!4d*;!0&q;LW82;wX{}KbPAZtt86v(tum_1hN z0{g%T0|c(PaSb+NAF^JX;-?=e$Lm4PAi|v%(9uXMU>IbAlv*f{Ye3USUIkK`^A=Vn zd))fSFUex3D@nsdx6-@cfO1%yfr4+0B!uZ)cHCJdZNcsl%q9;#%k@1jh9TGHRnH2(ef0~sB(`82IC_71#zbg=NL$r=_9UD-~ z8c54_zA@jEhkJpL?U`$p&|XF}OpRvr`~}+^BYBtiFB1!;FX;a3=7jkFSET)41C@V` zxhfS)O-$jRJ|R}CL{=N{{^0~c8WuLOC?`>JKmFGi?dlfss4Y^AAtV#FoLvWoHsEeg zAAOc+PXl@WoSOOu_6Tz~K=>OK@KL#^re(1oPrhcen@+#ouGG|g(;A5(SVuE~rp$?# zR$o(46m}O~QtU{!N-s}RfYh+?*m9v#w@;=DEXI;!CEf0bHEgI<~T7&VnIvtG%o=s@3c zG1AT(J>!bph%Z1^xT_aO>@%jWnTW=8Z^2k0?aJ(8R5VA}H+mDh>$b9ua{)I5X9$%b z&O%F;3AIW&9j3=Q1#8uL%4_2mc3xX2AdzYJi%#Q#PEY3lk<#u=Pc?EJ7qt4WZX)bH481F8hwMr^9C^N8KUiWIgcVa=V` z4_7By=0Fkq>M6N?Bis+nc$YOqN4Qs@KDdQCy0TTi;SQ7^#<wi9E4T)##ZVvS(SK4#6j^QjHIUh<0_ZD2Yl+t?Z2;4zA zvI<(>jLvJae#sIA`qHl0lnkcU$>Rrkcnp{E;VZwW`cucIIWi{hftjEx-7>xXWRsa4VH(CCyuleyG8a+wOY8l*y>n@ zxZb}o=p9lR)9N^FKfkvPH-t2{qDE=hG8Z!`JO>6aJ^hKJVyIV&qGo*YSpoU(d)&OE ziv2#o`&W>(IK~sH{_5aPL;qcn{2%Gae+r5G4yMl5U)EB>ZidEo|F@f)70WN%Pxo`= zQ+U-W9}iLlF=`VeGD0*EpI!(lVJHy(%9yFZkS_GMSF?J*$bq+2vW37rwn;9?9%g(Jhwc<`lHvf6@SfnQaA&aF=los z0>hw9*P}3mWaZ|N5+NXIqz#8EtCtYf-szHPI`%!HhjmeCnZCim3$IX?5Il%muqrPr zyUS#WRB(?RNxImUZHdS&sF8%5wkd0RIb*O#0HH zeH~m^Rxe1;4d(~&pWGyPBxAr}E(wVwlmCs*uyeB2mcsCT%kwX|8&Pygda=T}x{%^7 z)5lE5jl0|DKd|4N*_!(ZLrDL5Lp&WjO7B($n9!_R3H(B$7*D zLV}bNCevduAk2pJfxjpEUCw;q$yK=X-gH^$2f}NQyl(9ymTq>xq!x0a7-EitRR3OY zOYS2Qh?{_J_zKEI!g0gz1B=_K4TABrliLu6nr-`w~g2#zb zh7qeBbkWznjeGKNgUS8^^w)uLv*jd8eH~cG-wMN+{*42Z{m(E{)>K7O{rLflN(vC~ zRcceKP!kd)80=8ttH@14>_q|L&x0K^N0Ty{9~+c>m0S<$R@e11>wu&=*Uc^^`dE9RnW+)N$re2(N@%&3A?!JdI?Vx;X=8&1+=;krE8o%t z32Gi2=|qi=F?kmSo19LqgEPC5kGeJ5+<3TpUXV3Yik_6(^;SJw=Cz`dq(LN)F9G<$ za-aTiEiE}H(a>WITnJ+qG$3eCqrKgXFRiIv=@1C4zGNV!+ z{{7_AulEPXdR+~$sJ+yHA73j_w^4>UHZFnK$xsp}YtpklHa57+9!NfhOuU7m4@WQp z5_qb`)p|6atW#^b;KIj?8mWxF(!eN<#8h=Ohzw&bagGAS4;O^;d-~#Ct0*gpp_4&( ztwlS2Jf#9i>=e5+X8QSy**-JE&6{$GlkjNzNJY;K5&h|iDT-6%4@g;*JK&oA8auCovoA0+S(t~|vpG$yI+;aKSa{{Y(Tnm{ zzWuo^wgB?@?S9oKub=|NZNEDc;5v@IL*DBqaMkgn@z+IeaE^&%fZ0ZGLFYEubRxP0WG`S| zRCRXWt+ArtBMCRqB725odpDu(qdG;jez|6*MZE_Ml<4ehK_$06#r3*=zC9q}YtZ*S zBEb2?=5|Tt;&QV^qXpaf?<;2>07JVaR^L9-|MG6y=U9k{8-^iS4-l_D(;~l=zLoq% zVw05cIVj1qTLpYcQH0wS1yQ47L4OoP;otb02V!HGZhPnzw`@TRACZZ_pfB#ez4wObPJYcc%W>L8Z*`$ZPypyFuHJRW>NAha3z?^PfHsbP*-XPPq|`h} zljm&0NB7EFFgWo%0qK`TAhp220MRLHof1zNXAP6At4n#(ts2F+B`SaIKOHzEBmCJ3 z$7Z&kYcKWH&T!=#s5C8C_UMQ4F^CFeacQ{e0bG?p5J~*mOvg>zy_C{A4sbf!JT+JK z>9kMi=5@{1To&ILA)1wwVpOJ&%@yfuRwC9cD2`0CmsURi5pr2nYb6oBY&EmL9Gd@i zj{F}h!T*#a<@6mKzogszCSUCq5pxGeCq-w2|M>ZzLft79&A-&!AH~#ER1?Z=ZavC0 z)V05~!^Nl{E5wrkBLnrxLoO|AG&hoOa6AV2{KWL#X*UItj_W`}DEbIUxa;huN0S#` zUtXHi+cPyg-=Gad`2Aw-HWO*;`_&j9B3GHLy(f^@Do@Wu*5{FANC+>M*e6(YAz4k^ zcb_n4oJgrykBM1T!VN(2`&(rNBh+UcE}oL@A~Fj}xf0|qtJK?WzUk{t=M15p!)i7k zM!`qg^o;xR*VM49 zcY_1Yv0?~;V7`h7c&Rj;yapzw2+H%~-AhagWAfI0U`2d7$SXt=@8SEV_hpyni~8B| zmy7w?04R$7leh>WYSu8)oxD`88>7l=AWWJmm9iWfRO z!Aa*kd7^Z-3sEIny|bs9?8<1f)B$Xboi69*|j5E?lMH6PhhFTepWbjvh*7 zJEKyr89j`X>+v6k1O$NS-`gI;mQ(}DQdT*FCIIppRtRJd2|J?qHPGQut66-~F>RWs=TMIYl6K=k7`n1c%*gtLMgJM2|D;Hc|HNidlC>-nKm5q2 zBXyM)6euzXE&_r%C06K*fES5`6h-_u>4PZs^`^{bxR?=s!7Ld0`}aJ?Z6)7x1^ zt3Yi`DVtZ*({C;&E-sJ1W@dK29of-B1lIm)MV4F?HkZ_3t|LrpIuG~IZdWO@(2S6& zB2jA7qiiGi%HO2fU5|yY#aC<57DNc7T%q9L>B_Qh@v#)x(?}*zr1f4C4p8>~v2JFR z8=g|BIpG$W)QEc#GV1A}_(>v&=KTqZbfm)rqdM>}3n%;mv2z*|8%@%u)nQWi>X=%m?>Thn;V**6wQEj#$rU&_?y|xoCLe4=2`e&7P16L7LluN^#&f1#Gsf<{` z>33Bc8LbllJfhhAR?d7*ej*Rty)DHwVG)3$&{XFKdG?O-C=-L9DG$*)_*hQicm`!o zib(R-F%e@mD*&V`$#MCK=$95r$}E<4%o6EHLxM0&K$=;Z#6Ag0Tcl9i+g`$Pcz&tP zgds)TewipwlXh0T)!e~d+ES8zuwFIChK+c4;{!RC4P(|E4$^#0V*HhXG80C;ZD-no z!u+uQ;GCpm^iAW&odDVeo+LJU6qc$4+CJ6b6T&Y^K3(O_bN{@A{&*c6>f6y@EJ+34 zscmnr_m{V`e8HdZ>xs*=g6DK)q2H5Xew?8h;k{)KBl;fO@c_1uRV>l#Xr+^vzgsub zMUo8k!cQ>m1BnO>TQ<)|oBHVATk|}^c&`sg>V5)u-}xK*TOg%E__w<*=|;?? z!WptKGk*fFIEE-G&d8-jh%~oau#B1T9hDK;1a*op&z+MxJbO!Bz8~+V&p-f8KYw!B zIC4g_&BzWI98tBn?!7pt4|{3tm@l+K-O>Jq08C6x(uA)nuJ22n`meK;#J`UK0b>(e z2jhQ{rY;qcOyNJR9qioLiRT51gfXchi2#J*wD3g+AeK>lm_<>4jHCC>*)lfiQzGtl zPjhB%U5c@-(o}k!hiTtqIJQXHiBc8W8yVkYFSuV_I(oJ|U2@*IxKB1*8gJCSs|PS+EIlo~NEbD+RJ^T1 z@{_k(?!kjYU~8W&!;k1=Q+R-PDVW#EYa(xBJ2s8GKOk#QR92^EQ_p-?j2lBlArQgT z0RzL+zbx-Y>6^EYF-3F8`Z*qwIi_-B5ntw#~M}Q)kE% z@aDhS7%)rc#~=3b3TW~c_O8u!RnVEE10YdEBa!5@&)?!J0B{!Sg}Qh$2`7bZR_atZ zV0Nl8TBf4BfJ*2p_Xw+h;rK@{unC5$0%X}1U?=9!fc2j_qu13bL+5_?jg+f$u%)ZbkVg2a`{ZwQCdJhq%STYsK*R*aQKU z=lOv?*JBD5wQvdQIObh!v>HG3T&>vIWiT?@cp$SwbDoV(?STo3x^DR4Yq=9@L5NnN z_C?fdf!HDWyv(?Uw={r`jtv_67bQ5WLFEsf@p!P3pKvnKh_D}X@WTX^xml)D^Sj8Er?RRo2GLWxu`-Bsc ztZ*OU?k$jdB|C6uJtJ#yFm{8!oAQj<0X}2I(9uuw#fiv5bdF$ZBOl@h<#V401H;_` zu5-9V`$k1Mk44+9|F}wIIjra8>7jLUQF|q zIi8JCWez)_hj3aHBMn6(scZd9q#I<3MZzv}Yjc^t_gtGunP?|mAs+s!nGtNlDQ?ZO zgtG2b3s#J8Wh#0z1E|n_(y*F5-s7_LM0Rj3atDhs4HqmZc|?8LDFFu}YWZ}^8D`Yi z`AgJWbQ)dK(Qn?%Z=YDi#f%pLZu_kRnLrC2Qu|V>iD=z=8Y%}YY=g8bb~&dj;h7(T zPhji+7=m2hP~Xw`%Ma7o#?jo#+{IY&YkSeg^os)9>3?ZB z|Bt1-;uj0%|M_9k;#6c+)a)0oA}8+=h^#A_o=QR@jX^|y`YIR9V8ppGX>)FS%X>eB zD&v$!{eebt&-}u8z2t`KZLno>+UPceqXzuZe2u zHYz7U9}_Sw2da@ugQjBJCp(MNp~mVSk>b9nN*8UE`)88xXr88KXWmTa;FKKrd{Zy> zqL}@fo*7-ImF(Ad!5W7Z#;QLsABck0s8aWQohc@PmX3TK#f$`734%ifVd{M!J1;%A z)qjpf=kxPgv5NpUuUyc=C%MzLufCgTEFXQawxJo)rv4xG&{TKfV;V#ggkxefi`{sS zX+NQ8yc>qcdU zUuLM~0x32S& z|NdQ-wE6O{{U-(dCn@}Ty2i=)pJeb-?bP+BGRkLHp&;`Vup!}`pJdth`04rFPy;$a zkU=wWy;P$BMzf+0DM(IbYh`Dk*60l?3LAU;z3I^tHbXtB5H$Op=VEPL8!mydG>$T@S9;?^}mmDK)+x*TCN_Z`%SG{Hv0;P*>(P@^xe2%mUldaqF9$ zG+Oq<5)pQ+V4%%R>bK|~veGY4T&ALmnT@W*I)aT~2(zk>&L9PVG9&;LdC%xAUA`gC4KOGLHiqxbxMTA^!+T*7G;rF z;7ZNc3t&xd!^{e|E(7-FHu@!VrWQ8CB=pP;#jG#yi6(!BfCV(rrY~7D)0vCp_Ra@9 zSuu)to5ArdCAYX}MU&4u6}*{oe=Ipe09Z7|z41Y&lh`olz{lmO>wZpnwx+x4!~7@37|N~@wr=Tqf*+}4H{7GE*BvptMyhTAwu?VYEaj~BiJm7 zQw98FiwJTx0`qY8Y+268mkV#!grHt3S_69w?1TRi-P^2iNv=ajmQIkoX7OkY=Cpvk zs;-Gv?R(YEAb(%@0tNz)_r8bwE zPh75RwYWr?wPZ0rkG<5WwX|fjqCBP4^etDs4{ZF9+|c#@Y60nB)I_U5Z$FYe=SLXI zn}7T@%LLA>*fWf9X?vSD3tpXSEk%H{*`ZmRik>=se}`HWHKL|HHiXovNzTS~-4e?1 zgVLCWv@)(($B*C3rGn`N#nzUyVrSw>OiD;4`i15QHhdicm}A(CP)UO>PO(3!(=v-x zrsKIUCbJMb>=IB}20b{69IdU(vQ%Ti0Zm?VLQoL++HK(G%^P{wuH;|@Cn7Ncybw%D zDhWh??1)6j5j7RbEy-{rVefvMhV|Su8n9`m>4LU^TanMzUIy>S&UbSKJW56C(K5NX z*Ypzh@KaMD=ank_G}Di5SaDTz3@Ze;5$pkK$7Pz?SBj&njRD4so5e0Msp_p}|D8aq zDvU@2s@T_?)?f5XEWS3j_%6%AK-4aXU5!Xzk{fL%mI~AYWP?q}8X}}ZV3ZzKLFvmm zOHWR3OY0l)pZ#y@qGPkjS~mGj&J8uJnU<~+n?qrBTsf>8jN~i17c~Ry=4wM6YrgqZ@h`8`?iL&$8#fYrt7MinX)gEl7Sh_TS zOW{AyVh%SzW|QYBJo8iEVrA!yL(Lm&j6GB0|c?~N{~?Qyj^qjbs>E~lpWo!q!lNwfr(DPZVe zaazh2J{{o=*AQ|Wxz*!pBwYx_9+G$12{5G3V!0F=yB=tPa zEgh47ryFGZc;E%A{m4lJoik6@^k%E0{99pIL1gE;NqT!1dl5UV>RkEWtP)3f_5hG6 zs%M}qX?DNaI+4HN*-wn`HOjlEz0}K{o0fG~_%%c8sDq)6Z2)6msormgjhmtdzv;Hy{BwHXKp&3Bf9paw+J4r-E zBoWmEr6%r3t?F`38eCyr+)`In1&qS9`gcQ|rHBP`LlCl=_x?ck0lISju@hW*d~EQ) zU2sgl#~^(ye%SeZR%gZ=&?1ZxeU1v@44;`}yi^j0*Efg1lIFcC*xEj}Y~k|(I&}7z zXXi2xe>mc_cC`K=v8&-5p%=m=z47Z6HQUzNi5=oCeJ$-Bo#B0=i}CemYbux7I~B*e z3hSneMn$KHNXf4;wr5fkuA+)IzWs8gJ%$o0Q^vfnXQLnABJW;NRN(83Dcbu9dLnvo z6mweq2@yPK%0|R9vT)B$&|S!QO6f(~J^Z+b`G(j1;HKOq_fG$-36zvBI$`hvA94i( zGPGVo&Y%nRsodWyzn0bD0VZlG?=0M23Mc2V1_7>R^3`|z_5B;}JnIp0FI}9XNKJ^o z7xYKOFdYxX?UW~4PC!hVz86aP+dsOkBA(sz3J+6$KL`SU4tRwWnnCQN z&+C92x#?WNBaxf?Q^Q}@QD5rC=@aj8SIg;(QG06k^C5bZFwmiAyFl|qPX^@e2*J%m z1Fu_Jk5oZEB&%YN54Y8;?#l#GYHr->Q>-?72QSIc+Gx^C%;!$ezH>t<=o$&#w*Y_Y7=|PH*+o57yb>b&zpTUQv)0raRzrkL=hA-Z(10vNYDiT487% zzp2zr4ujA#rQ;Hxh7moX(VldzylrhKvPnl9Fb?LCt#|==!=?2aiZ`$Wx*^Lv@5r_ySpQ_vQ{h2_>I`Wd|GjXY?!>=X8v}wmTc+Nqi-?ln zQa28}pDfvjpheaM2>AYDC2x`+&QYH(jGqHDYLi}w55O5^e9s=Ui^hQ~xG*&TU8I}Y zeH~7!$!=a+1_RZe{6G$BICI6R2PKE{gYW8_ss!VY*4uXw8`?o>p=fC>n&DGzxJ$&w zoIxdMA4I503p(>m9*FnFeEJQ5Nd^WK*>I_79(IA)e#hr2qZ8Y!RMcbS}R z(2;{C#FXUv_o-0C=w18S!7fh!MXAN-iF!Oq4^n#Q{ktGsqj0nd~}H&v#Brb}6cd=q75>E;O8p?6a;CR4FiN zxyB?rmw)!Kxrh&7DbPei$lj)r+fDY&=qH+ zKX`VtQ=2fc?BwarW+heGX&C!Qk;F;mEuPC*8 z0Tv0h2v&J#wCU_0q-Wq9SHLOvx@F!QQQN+qN^-r-OgGRYhpu%J-L~SiU7o@0&q6t( zxtimUlrTO)Zk6SnXsm8l$`GW-ZHKNo1a}<%U4Ng z(k8=jTPjoZZ%$(tdr@17t|MV8uhdF4s|HbPO)SF`++T%r=cNRx&$BkW7|$)u%Anm; zGOv)GmwW*J5DzeI8Vk_HZ4v?Mmz$vpL#M%+vyeiW;BK6w|_S0 z{pqGZxI%-~r~b@=F#^|^+pwQE*qc8+b7!b}A$8OjqA%6=i?yI;3BcDP1xU_UVYa?^ z3o-aYI`X%p!w>>cRe_3rtp}@f1d&AQZ_2eeB;1_+9(`jpC22z+w%(kh6G3}Rz&~U_ z5_LxI)7~`nP=ZdVO&`rUP8`b-t^Vqi;Yt~Ckxauk>cj@W0v=E}$00?Jq(sxBcQHKc z(W}uAA*+e%Q)ybLANOe7gb4w^eX#gI%i56{GJz6NVMA{tQ! z3-}Mdjxfy6C#;%_-{5h|d0xP0YQ!qQ^uV*Y&_F9pP!A;qx#0w*)&xPF0?%{;8t+uWA#vrZ|CBD0wz@?M=ge(^#$y< zIEBv1wmL`NKAe&)7@UC9H^t0E0$}Odd>u4cQGdKdlfCn0`goK~uQ0xrP*{VJ*TjR; za16!CM>-msM@KcxU|HsEGgn{v>uy1R?slG}XL5)*rLTNHdYowI*;qe~TZH z|1Ez0TXrc@khWdmgZJKV6+aJVlFsv5z~PhdC>=^tL5BC|3tyMuXSdsEC3L0qw60S>ecX zi&`-rZ=GqxfrH{+JvkuOY?{d?;HZmv z2@4+ep(g+yG6W%NrdJe2%miVnb8nX{yXK>?5DC#GA6IIXU-`!?8+xm(8r)Vi;=?g! zmOK)$jQv~nakv-|`0=Z`-Ir1%2q8~>T7-k=DyG^Rjk7|!y(QO&)cBEKdBrv~E$7_y z&?K!6DP;Qr_0fbbj86^W(4M{lqGx6Mb;`H;>IDqqGG@3I+oZg_)nb=k|ItMkuX2Y@ zYzDmMV~3{y43}y%IT+)nBCIzi^Cr1gEfyrjrQ7gXAmE$4Hj(&CuyWXjDrkV~uP>9T zCX5cXn!1oEjO!P#71iyGh#q+8qrD8)h#wE#x;bz+a^sQyAntO(UhxFVUqR^dux8 zOsN=Nzw5imC7U~@t^#gLo}j#vge3C6o(%0V5<0d~1qlxe4%yD~{EDGzZ40)ZIXytB zg3^NFa(98n#OwV!DJqgy;xitYp)Q(W$(J0<0Xr5DHFYO$zuUkC(4}Zv2uB`O@_TR7 zG3Ehp!K;YLl%2&*oz3`{p|hj`Bzd(@BMVVA2ruucGsD0mj`^a1Qw3WsT7_z)c_<&j zvy(u5yod#@5~XT5KRPqKKp*2Q`rN!6gd#Wdh9;806oaWGi6~pB78)SYEhIYZDo*^} z-93olUg^Vh29G^}wQ8p(BK0(<7R6(8><}Bia@h%62o%ONE`~PiaIdfy!HGUm0GZdJ z&^aK^@JP|8YL`L(zI6Y#c%Q{6*APf`DU#$22PjfSP@T4xKHW~A(vL$pvf+~p{QLdx^j4sUA;?IZ zVWID3OA_VkZ_3?~Yy1yn?4Ev^r}1~c!n9;Z7pRn*D$^J%4QyWNvPkKF5{{bMBefvT zFZu|hco!0Me-__dyLe6S!}>m?I-x%1{Zr3_Qi!(T@)hh%zBE1my2AWl^XY#v%TSX3 z;?rn8Chf+?>SQ|v8gl$*f5dpix{i;?651ezum2tQCU`9sKxuZG2A9o(M~}G`*q2m#iW# z?0fJS+j_XxOk1fb+Nx6$rZqhg!x}eO!3nMy6a@4doqY&?(c`8$^B?0InG4T&{mu*3 zpcYaf)z__Dgr%+6UFYYXSu(oRrPYGviL~FKc{0X%tnt+9slAC|W0F8l^(@8qDXks~ zOZgs?O-6e-12Q>w5d?|E$P&oyah^mqd(Cu#uNtjCpp&F}G&biuW49LGkFCDEYe0S* zo-W_}-yR$%Z^03i8{&R&oU1BbY9$ER3RR5LjocL5er=CclJwCH>M6ge$R*Wi zd3zUoE*~?a1owq&DiT2#_Q)~tr$;Q=BJrMHrG@j3^J=#U3 zmd)ubgUu(9g(qmjx~7+!$9^%~fpi9$*n=+HfX&<>a}qkD;Ky@piqolGdF>VEX?(!DuO z{=7v}0Y|$@o3c`s^K3&3uMD0T1NMMrgwn$+g{=Tr&IHH@S`Aj4zn z{Mpln$!B->uUYTFe+75e!ee*euX`W%xA&g!-%s-YJ-sJP*(~t=44RSN6K5u7}a9;40`KN#fg#N>-s?YE6*qS9zkP2*=!a%O&aJ4>)JR>{O6n)(@ z$2mBny!kLLgnPgrX&!fTVnSXLEY}ZR{fLL4Jw;uI;)DhJJ<;%5&X%lg5)mYwwyHK=W zS`3yPe&Ncy_OA!;HvQV1TI3}7jib>EhqT!PZIoDg_Wm4OraFX|nGmCsXj|{&g!(_; z;(_uG68gxxy{T#wPPuETHggw6G8nCyc`=x89;arkuB%&7rbL&VzCm|jQFg8me78tu z2l-K|IsFgX@am)(c=1IWYX5fhCjIZ&9MBs9(Qg*`U5T`@H2xqzQxj`1bK#2gmDn2=yI!n0*6A2{JuA3~uX7 zsXocdxHHMV^?dsW+s}S8j8Mq!pjB8=NytY%-MEgx+HnavDcotwYmA{J%RzlLhZ{?t-W6 zr-JA(qw%OVMtv?N?75aid-cY`ZJLFT`fh-fZ0()^P(3wyQ`wDHG$9cUmEr^~!;iGV z#ukG&nXeLHarXD$=({)#Es!?%=2*`or!FE4N6XWEo>>`}ocE?kmQb+2JP;-))sn0V zoC6&be>gf!XD#yJO`FCF(Ts|~ zUbO#y44!V-U|&SEr1#r^_fJ1Ql3isjfCVAfvNga7OBJG^YAP`r8d{))?5D{xm+FB~ z*>D&s+(Z(o*)gx|EpJAYlnk@A&=zpkYvak{W~Y}~8M_p7Uu1bY#7m{Mq-#4-xw3lH z{(8=+O+WrU)^C(;qRm%NiKnO+<0W6EF|>n#fw%OKxr!@d%dWHOmv~#M2{eIlxaRW% z;k6v=< zZ{5W}@ik?!__~T?0QX0xX^^}Isw8Ey-yXCwQkS!)xT-ZdV6A`#HdMECf78X){%6)7 znLSKwqK}!hdkVk2QjAZ?j%&Id%WY~^<$ntL2p8J;eq$VCp%Cg{)oW&%Z3vp6ihm9D zIlPC#zVE^>62fNwZqsk)mt+E#rrU@%4vWtkYK)Qv$a*}$T2ZJCtTFI`tuLb*7j`!^eR`?d9h2TjF-h2Yr+ z){T|kWBNyrA5vpZE{Ez_)pG7Zf%QXqW)R@(<_0oOP?cwg&gib`IjKTzN_R*5A)G>_ z1r#qXr5i)U$$wv(kXfodOg=h$UZk78c@50K^wOMcKCx26s{q}vdOioj1n!&if0FRY zSi@$}gn4KW;2<;+lY?&>M6GNrRtfUTEIzqih@yLMQA2(17m3)hLTa@zlj=oHqaCG5 zYg71D3e}v36DjH++<*=MXgd2q&dP^6f&^KctfDe(SQrvy5JXC@BG#|N_^XbfxhcV) z>KV$aMxcL*ISc0|0;+<2ix7U7xq8m48=~j!a`g?SzE5}(Y;hxqEHJg_+qB99$}py7 z*ZPXL?FKLA>0uVicvq3okpoLZE#OG@fv^+k0{35pf`XdVT)1< z#mV4mcikkivZcE(=0rgfv&#+yZJrAOX&VDL(}Zx8@&$yi4Y1kmEK&uL<}ZqWr05mr zcSwaqH=squnLs+UCn@yp#WNQuIv$~B*sN_NAACD>N3k_$E(j~}Uvqda!_ zZcu7UrsR_q-P2YTrg|lijt8kyqL>T@ab#-a7i>%#*eoxFfgx(FoPa(y1nDI{z#Pz^ zfF~)6RBc?#ivEF<@XVD*#9r^r-;*<^(tE%UtWw^oom83;$5d{UoUbmAP(3Z)14YTK zMXQ#mz9yw>*8D^82vL^|%lyo|ZiQPd&{<*wCZI%up=wadl~C~cRJ!=Hjc&F)FNlnd zgNI|iSIMyqh=qV(z+HbldU4}!sqMs1R?t*RV!S*WW>qW_GF4NJ&vb-{2sJjiTIpL; z{bC@V&EhO|>GuDv7`%$kO<-P@^VI+y zl0tXGm|eISy)fiY3m8_Yaz>`Q=B(Yi8EH71{wfM*8ziS3BIju?26ujw==Xh4x5rH71h?Z859IWq(i#9 zLt0wt?(QBsL(q4yCv&g4t0jJvu^@FtJJk`8YXb{{(OdTS%rGxnPR)xY#6=?AWjD5M2n z5GZ@@ulO|JN34J-2y*-Nh@6|?RkFHwSj$e}p}mbc3Y}*el{O31RU0Z_E48@5O~5n;kDJy}a$x&Lc;27DTvAd@s^9>IA@$q{m6K?eZqOJGKpgCT!Zhld>#d^DAK+MDP}|3h zZ{i!ENw;mW62Pq^|FY#w?@8U6Nvjgi(sKW}&uvgjz0YIS>%Sxk1`5 z`qk`C2*bWd|0I4L=_~s(^2F$Bv7OTjo*G+gBD=Rq-~$7t{Bo|mmck(d6ywQ*UbIjkS>qtkH~Zs(sq zEYNB4xxdYmy+G=${gOjGGfSQQLi1D*{&en*3{wyd7U3M)y^FX(+d)eFi?9oMy@64c zwL?!q#*eJ$eayb4lc!B$W%M4B$4dH>9eFXwjfk5U@}6vXOWDiiLMYP3^VYlG$yDjaC({9tyL4NxPb{x=ADdJ7Bl5EHzU6h-Cbke zwi+34LGVF=G%>d5Q7C>n!)%!LT`UZ0v^YN1WrcjC(pS!&vek-SK#kj^EL9!l?TvY% zOkz%!#5Cf^2JFrvNeU5ZL1_aI(M~e4?~kId$T!A@Z$?f40q#~5HuElkRMQV+6r0>J zK9y=%I^m-_xwRNyO<2Zq-0W6!frE$jT$C3Qi3d>0911QPc`Ky6`~Y<)?mMy*u`nz8 z={b()Z;8DqbWJ?MdOsaF6Zn)$d>DQpRHM~bD3cq=Rw_fzWpiwtJFY`BF}hTFCeh+C zs-4A}MCP}`EInNzh3hRoZ6L1a`J7}T&wh9#HItmHBCRwefpQ97*u{--QH=5>MSZud zv_%DacJS+lsxlJ0q=40vs-8P$Q$_Pt)JM=)|1dcFO&JWY8KwhiP$a&Ua*Z z$BTW#lu4QZna#vZECq#Q?Up_(@`0#(@~0?mG{qA#^rZDq^&6T=pbGL8nU?BY-TwKE zPmMqhP_w?q1B~|43T5=Hl(Bi-+{yY;Acv4i9u}oWC+@^i*}l}=dg`Y~E%dTn;rqj5 z&3pLFHjC62jcxW_a@Jj2Ce%eToCB!6OV*6I0!XF9Hq7orpm-RpizSSHx890&_kCQ% z$cKVw-`WnDvv5Lq?L!qGDcUPtgmotX=C`~Smjg&oM5V?}gAzL%WkRwLmNZyrCbKwC zcsUD3O0ruLr%s`B5W)IYjzLTXcAqinas75T_j&1_m!m!^ORvk6_bYvK||DIVE@IUjWQ z0dQ(H9=a-c`@{Q=uj?JC8g`r$a>)gR#=2%vuea5B_BAp;*QX&I;N?>jHYFR=q?8sq zatBJBYX`tr1BQxIgACJ==*ivk$UjW^Maod6-=SzI3MMUbCqu!3wVHt!Be?M@)2aK+$Rv(?iH18-}e+rDznPRv< zi!{-5NNHE)eqVEeYl>F5S{6w^8L$0p7l|M;(^c+Ei|{V7!!8;xiDx@QK4Pl8Iel7N z*9%$ISyQPK_+5tc2c9jhX%sfIOCZf-E%K9X7Z6N0Nvp!~v(KAZvWnaHK^SQSragIF zVIC_7tGTXeU(TRqj?owTmj{SXNtf7;9evoBURMB5R`8R1$@$}FCS%ugA{4igxOhRi z*q_y$&&!mHF1$S}2279&m0^nFxDV#WvV&?Pphq(craPjcBtveg0Nqdm9tXL4lN{t= z?BLepVnp$U5KskjvVX-GjEf=M3mOTZb|Z$Hp*yytey0C^{cH*v>gqF&-j?gcEj4)l)cdGBmB(^HrSe_)qzf z+TZ^Yo4|GWz=Oi3m`r(hV`iZHb_mu63g(JXPMW4p9JhL_(tg+XQnmR0&52UUA|nZI zvjwOx(fNtZ`8!#|4$7GoJPQ`;T?hKOi`^`kFOyX;C4KfC(U-(CX?Qh2!RTe!4raMP zjLaC7qL_tJ?^0!T9ibZe!m-x!u7o%2dHK{uYZ~#+vERAv-G-MQeYQ*~DILuFpu02u z(Qc)=bHqb4{fs+hdKa5etlX z3EW#vlbEZmWT>X{3WbgW)8~u=8IGuRc<=?KoDXg5V`jf%i^Ai`Cd9=&FH6d|N9uJl z>QhxtW_{}H10BF}GQNitk~V=GnB%NI1Xv-6-OeaI&Amg0s{4i4;HhP$6oc(L-}yHt zej63({`5VLSoIef7D3Z9BA5x<9$^x?PhV=6A@Nu=QiJo@*o?M@*6-UA@EdV@bQCR< z9>{N%eK;Y#U-@XDBBCT^j=?<|y|lsAWrXsf`t%4VT{)63oxQe^u_5NuOq{rsrRd}Z zOx&OldRtR4leEX#r$9`gPJtbHccH!JgZK&3x`tJ<_{kv)E?$LhZ?brv`Cc}X%cWC7<@6yqM2O&m(rB`1v-TiqcQmA5n$rbGJ4zs({=R-I%6}*^UQ)wi9WuzW%Ri%&5 zTdd%>+GvADk+4q#3s5qne99`MC)X_#=p1!d?(mcKDW=Efc31Jso)9M49O0OMeP&7~ zIm!vorpxBSbvSiczr^?WP&e&-!3GLxCIaR5?PGeLgwYT;lYu9UE8SwmXR(D?A^s`7 z^F4di(+oHh%$DZjj7F3_-Y9}k^uCKeSC?Jd7h>RZIDZ{wcbh|9w4)p$dmv7|gX1n& zkrYjSso~;~qMMzZUQ5AC+GUvuj@y{4E&&v(+OE-rS^J7iE~Yz1 zCQ9hAI&0X2_H8CKZMqo00MsxtwjvM{`AdSaZ8#Y?5zPI;a+0`JF52!uVwr@5Ufctm zm;5G%gI&utfGa~fv6!jHh9d1r3TYD zEOlrbyFnDl5J%sEO>HErK~WWE6I$_eXp!dbphDf zc;~oWDQylVa=y?q;c>SKzvZ~R(ZE2csFwf@10@zaZxFAYWaV9TFMh(QuqxNhPUav~ zzCkoe8-lM{?vh}kdM6EMCH(eLK3Rt{HsEJ+4fve=xAVq(cUc9fO9g1%zI+QfFOb@0 zePFU(&?Np9w3&xs)ZwPnQniC0%xs8(Hyx{7*Ot51*`9&2^h7@!nmzuF`3pl8ep#Ls z<)nk7ts}`9tGgaVJWC-3w;B~$juY6m+7XgfzjR4I=oV}E9LRGf4@cI>d3z%CYyURI z7lRn11g!D34zI6|26>?CELeIh?cEv_GCCMd5&g<=9-)pe8iXINQ}4IljYsQyfRz|( z<%w=HN4ZOQKJ9e7DOUhjA7A%-xcR%2`@1?U&u}rvqNc_8l9dUT_S`4TKJ;yezIdp} z?qDAfx6IHQ7YlO;EAP%d4U2O7jU`Uh(um!J`hJ_3&mmQez8AqWLQEftYJuMdCj27t zoV#b!c0d8al0j1yveY6)U#kPCh%OfL>P=%WE^LQew^k-QqZ{rjX6PqOd2K7>1^VUB z`&H@+vW=wH0UY>88nXCH@RKCY&?bR%8-53b{;@>|;uzDd5f`Z% zaSC<8OLh|b@ZnBET?My38fV9~ku2cPfcWZl7nW|pkQKfFlp@xRt+K0Tj@gdvVAQXP z?i45RNE4W#Kf0%Pp2=?hESkG}EK557cwn0r1{uWeG53_tb!9bg&R8R_d4s5N0poc- zr>1g0W~1oha&#@_irbqnL)jJ@Z=y7J3fCQ@qlr{6(%rSs2rpkS1QIU^tieJ-xq%nd ze-C=#{@E+Kzb&SJ2KM~9q^4Yk^jyXa#{;P)y`YsFvfzX?%V~r6GciP4eX~$vk{-C? zeipAYsMSp`Z~&-Jc*dt}m-A_w&cnb#~sIdbU{uCayd>nWKDxQ9!%R zTrgS~+>TqXgrN~e2&eeWdPhuHP2*#K1=f^B@UGZBjFq- z;mtKYyul9ZNuq89XEoeSg7^qld5^R}FHpbyRyk1pRPMDO$_Kqi*sp1hk&UpUKc!V! zJZpCQc!)@X+%qOQMP)CU@Qe|=IG@|DZ~o#j>TBFQxH>8rJ#0y`XO9ukvc)kJ6LY3$ zY}{(tri#32!LjVY^exC3Ky)i$NY6v^*>X5y8F65pYYjt^T^X<=zm=)Cr=>dcId>?I zR^0I?)=)|}ak7wG)&Ar#A&60BRp}&NWFPy7zt)yl3aObS?sB8fxfU9ayR{$#%S<#3 zrsbmi#bDSP)@w%iYS%&wyyIB??LJ0Q%aD^!XXYk3)tQt~x_YU?y4KVKl{MJ)KSz&f zV;tJ1smY(dLM6zZXVAWND3L|(W=q~HjA6OkjQ+kx-EuqtaaQQPaa=2_wwuW@G*1>e z_TqB;+1@yuHg}YYpEJL&Sw~jD3Xeb(Wo(-nz6`#gbP7?agYT>j_R%+^h{1>7W&cP{s8epLY9Ky6mU*u*!QBn zI7T~WL-_qj+~Hdpr}qtfjZmD;eI%H0SP~~ifqoD59-q)R9_Z zKr6OeoZT!Za#k5yo&CCmzLbGP*6ggJ@2QPhIY^aMXjVjQ@D+-E#qmAjuL{o@NCUDF zFy)B~$j`rK7Iz$L>_Jl~O?IJu2P3 zlHQ@${Jgcvp`PKu7p;6Fr=4y1?8nJ;=~jls^gx4&_O4+)C-OGc5)L0+R!&uI&qQID zhV&ZQ@+2={Z|2F%WoOu9Ljt}|0r;!e zCBx(uAViqOffibUBOVEH_IlV=57ZQSQ~Te5(wmsO+o_CCNAgCJzZ3ly84J34_Zf#SwQ9q8i41 zE>u$JuO$kQq*W6MDo$Eu?3jJAFUt&>Qy#K{lT-Vx z6=kceU^v`;vBRoFxQED5TL+=>QJ!iaxV^Z2r#%CaaEWgbs1ysT$&~sem&74AEC!;< zcGDH;CENBJ&hfI!@G5ezCK!sXzdB@m#a(q8KeX;U=yl6AujNz z{}huJlo1yL$DlAsi{12aS?CJ*{xuIIV4wf-V6E?L4E!5BWMQ0Zh4uel*xZJ}QQuPE z-u#DdD6hH6`;nVJ>O}8iuWxH>Z2vc>a;iFbm)nrbj$ps$6aa4TjfVZVZr7dK+E_E# z+S`ErJDM9i{HX815lax33Wl(;H~m|sF28cs+hB$%2pjyXgubo5p_%ay3!*?212bxX z@1{$rzY6~DK*{`5@oRm0>(9INQX61!{Ip#NymIM*g~u=D)UFH!NcfQ(AsZXVOPv5) zX?=4bI9>9;>HvTACiBNDt)x;_}tsJousTuWrG- zDUSM9|4|IRSy@PhdB$sAk4b;vRr>Nt@t3OB<#_*dl_7P>FGcFF3-DA?KBW00A<;2=*&`^P8}cEZW!GSO9(+{;-V@ zd%%C8KEDYD$pC#x%zb4bfVJ|kgWcG0-UNZT9@2=R|Wz+H2iJ2A29LV z#Dye7Qn~^KUqOIS)8EGZC9w+k*Sq|}?ze$| zKpJrq7cvL=dV^7%ejE4Cn@aE>Q}b^ELnd#EUUf703IedX{*S;n6P|BELgooxW`$lE z2;lhae}w#VCPR>N+{A=T+qyn;-Jk!Dn2`C1H{l?&Wv&mW{)_(?+|T+JGMPf)s$;=d z5J27Mw}F4!tB`@`mkAnI1_G4%{WjW<(=~4PFy#B)>ubz@;O|2J^F9yq(EB<9e9})4 z{&vv)&j^s`f|tKquM7lG$@pD_AFY;q=hx31Z;lY;$;aa>NbnT| kh{^d0>dn0}#6IV5TMroUdkH8gdhnkj_&0LYo6ArC2O!h?t^fc4 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 16/83] =?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 17/83] =?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 18/83] =?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 19/83] =?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 20/83] =?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 21/83] =?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 22/83] 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 23/83] 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 24/83] 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 25/83] 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 26/83] 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 27/83] =?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 28/83] =?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 29/83] 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 30/83] 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 31/83] 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 32/83] 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 33/83] =?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 34/83] 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 35/83] =?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 36/83] =?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 37/83] =?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 38/83] =?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 39/83] 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 40/83] 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 41/83] =?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 42/83] =?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 43/83] 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 44/83] =?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 45/83] =?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 46/83] =?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 47/83] =?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 48/83] =?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 49/83] =?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 50/83] =?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 51/83] =?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 52/83] =?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 53/83] =?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 54/83] =?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 55/83] =?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 56/83] =?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 57/83] =?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 58/83] =?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 59/83] =?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 60/83] =?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 61/83] =?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 62/83] =?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 63/83] =?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 64/83] =?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 65/83] =?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 66/83] =?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 67/83] =?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 68/83] =?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 69/83] =?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 70/83] =?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 71/83] =?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 72/83] =?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 73/83] =?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 74/83] =?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 75/83] =?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 76/83] =?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 77/83] =?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 78/83] =?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 79/83] =?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 80/83] =?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 81/83] -- --- .../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 82/83] -- --- .../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 83/83] -- --- .../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);