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-motan/pom.xml b/transaction-motan/pom.xml
deleted file mode 100644
index 9bdcbfa7b..000000000
--- a/transaction-motan/pom.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
- 4.0.0
-
-
-
- com.codingapi
- tx-lcn
- 4.1.0
-
-
- 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 74574604d..000000000
--- a/transaction-motan/src/main/java/com/codingapi/tx/motan/interceptor/TransactionAspect.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.codingapi.tx.motan.interceptor;
-
-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 HIGHEST_PRECEDENCE;
- }
-
-
-}
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 3e4b1cbd2..000000000
--- a/transaction-motan/src/main/java/com/codingapi/tx/motan/interceptor/TxManagerInterceptor.java
+++ /dev/null
@@ -1,32 +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;
- try {
- groupId = (String) RpcContext.getContext().getAttribute("tx-group");
- } catch (Exception e) {
- }
- return aspectBeforeService.around(groupId, point);
- }
-}
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 b0ae2bff1..000000000
--- a/transaction-motan/src/main/java/com/codingapi/tx/motan/listener/TransactionSocketListener.java
+++ /dev/null
@@ -1,26 +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 {
- initService.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-springcloud/.gitignore b/transaction-springcloud/.gitignore
deleted file mode 100644
index e371e574f..000000000
--- a/transaction-springcloud/.gitignore
+++ /dev/null
@@ -1,19 +0,0 @@
-.DS_Store
-node_modules/
-dist/
-npm-debug.log
-test/unit/coverage
-test/e2e/reports
-selenium-debug.log
-
-.classpath
-.project
-.settings/
-target/
-out/
-output/
-
-.idea/
-*.iml
-logging.path_IS_UNDEFINED/
-nohup.out
diff --git a/transaction-springcloud/pom.xml b/transaction-springcloud/pom.xml
index 5342e94ae..4c890ce05 100644
--- a/transaction-springcloud/pom.xml
+++ b/transaction-springcloud/pom.xml
@@ -1,30 +1,22 @@
-
4.0.0
com.codingapi
tx-lcn
- 4.1.0
+ 4.2.0
- com.codingapi
transaction-springcloud
- ${lcn.last.version}
-
transaction-springcloud
https://github.com/codingapi/tx-lcn
transaction-springcloud project for Spring Boot
-
- 1.3.2.RELEASE
- 4.3.7.RELEASE
-
-
-
@@ -34,23 +26,37 @@
- org.springframework.cloud
- spring-cloud-starter-feign
- ${spring-cloud.version}
-
-
- com.google.guava
- guava
-
-
+ org.springframework
+ spring-context
+ ${org.springframework-version}
+
+ com.netflix.ribbon
+ ribbon-core
+ 2.2.5
+
org.springframework
- spring-context
+ spring-web
${org.springframework-version}
-
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-ribbon
+ 2.0.1.RELEASE
+
+
+ com.netflix.feign
+ feign-core
+ 8.18.0
+ runtime
+
+
+ org.springframework.boot
+ spring-boot
+ ${spring-cloud.version}
+
diff --git a/transaction-springcloud/src/main/java/com/codingapi/tx/RequestInterceptorConfiguration.java b/transaction-springcloud/src/main/java/com/codingapi/tx/RequestInterceptorConfiguration.java
index 1b7c36f17..7aea96456 100644
--- a/transaction-springcloud/src/main/java/com/codingapi/tx/RequestInterceptorConfiguration.java
+++ b/transaction-springcloud/src/main/java/com/codingapi/tx/RequestInterceptorConfiguration.java
@@ -1,9 +1,12 @@
package com.codingapi.tx;
import com.codingapi.tx.springcloud.feign.TransactionRestTemplateInterceptor;
+import com.codingapi.tx.springcloud.http.TransactionHttpRequestInterceptor;
import feign.RequestInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
/**
* create by lorne on 2018/1/18
@@ -15,4 +18,13 @@ public class RequestInterceptorConfiguration {
public RequestInterceptor requestInterceptor(){
return new TransactionRestTemplateInterceptor();
}
+
+ @Bean
+ public TransactionHttpRequestInterceptor transactionHttpRequestInterceptor(@Autowired(required = false) RestTemplate restTemplate){
+ TransactionHttpRequestInterceptor transactionHttpRequestInterceptor = new TransactionHttpRequestInterceptor();
+ if(restTemplate != null){
+ restTemplate.getInterceptors().add(transactionHttpRequestInterceptor);
+ }
+ return transactionHttpRequestInterceptor;
+ }
}
diff --git a/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/interceptor/TransactionAspect.java b/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/interceptor/TransactionAspect.java
index db649e382..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
@@ -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;
@@ -12,38 +13,41 @@
/**
* 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() {
- return HIGHEST_PRECEDENCE;
+ public int getOrder()
+ {
+ return Constants.ASPECT_ORDER;
}
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/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..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,30 +4,37 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.web.context.WebServerInitializedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
-public class ServerListener implements ApplicationListener {
+public class ServerListener implements ApplicationListener {
private Logger logger = LoggerFactory.getLogger(ServerListener.class);
+ @Value("${server.port}")
private int serverPort;
@Autowired
private InitService initService;
@Override
- public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
- logger.info("onApplicationEvent -> onApplicationEvent. "+event.getEmbeddedServletContainer());
- this.serverPort = event.getEmbeddedServletContainer().getPort();
-
- initService.start();
+ public void onApplicationEvent(WebServerInitializedEvent event) {
+ logger.info("onApplicationEvent -> onApplicationEvent. "+event.getWebServer());
+ this.serverPort = event.getWebServer().getPort();
+
+ Thread thread = new Thread(() -> {
+ // 若连接不上txmanager start()方法将阻塞
+ initService.start();
+ });
+ thread.setName("TxInit-thread");
+ thread.start();
}
- public int getPort() {
- return this.serverPort;
+ public int getServerPort() {
+ return serverPort;
}
}
diff --git a/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/service/impl/ModelNameServiceImpl.java b/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/service/impl/ModelNameServiceImpl.java
index a9b6f9de4..5fff0e50a 100644
--- a/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/service/impl/ModelNameServiceImpl.java
+++ b/transaction-springcloud/src/main/java/com/codingapi/tx/springcloud/service/impl/ModelNameServiceImpl.java
@@ -44,7 +44,7 @@ private String getIp() {
}
private int getPort() {
- int port = serverListener.getPort();
+ int port = serverListener.getServerPort();
int count = 0;
while (port == 0) {
try {
@@ -52,7 +52,7 @@ private int getPort() {
} catch (InterruptedException e) {
e.printStackTrace();
}
- port = serverListener.getPort();
+ port = serverListener.getServerPort();
count++;
if(count==2000){
diff --git a/transaction-springcloud/src/main/resources/banner.txt b/transaction-springcloud/src/main/resources/banner.txt
new file mode 100644
index 000000000..9161fc577
--- /dev/null
+++ b/transaction-springcloud/src/main/resources/banner.txt
@@ -0,0 +1,13 @@
+
+ >=> >=> >==> >=>
+ >=> >=> >=> >> >=> >=>
+ >=> >=> >=> >=> >=>
+ >=> >=> >=> >=>>=>
+ >=> >=> >=> > >=>
+ >=> >=> >=> >=> >>=>
+ >=======> >===> >=> >=>
+
+ LCN-Client version:4.2.0
+
+
+
diff --git a/tx-client/.editorconfig b/tx-client/.editorconfig
deleted file mode 100644
index e291365a9..000000000
--- a/tx-client/.editorconfig
+++ /dev/null
@@ -1,9 +0,0 @@
-root = true
-
-[*]
-charset = utf-8
-indent_style = space
-indent_size = 4
-end_of_line = lf
-insert_final_newline = true
-trim_trailing_whitespace = true
diff --git a/tx-client/.gitignore b/tx-client/.gitignore
deleted file mode 100644
index e371e574f..000000000
--- a/tx-client/.gitignore
+++ /dev/null
@@ -1,19 +0,0 @@
-.DS_Store
-node_modules/
-dist/
-npm-debug.log
-test/unit/coverage
-test/e2e/reports
-selenium-debug.log
-
-.classpath
-.project
-.settings/
-target/
-out/
-output/
-
-.idea/
-*.iml
-logging.path_IS_UNDEFINED/
-nohup.out
diff --git a/tx-client/pom.xml b/tx-client/pom.xml
index 08574c890..f185e56e5 100644
--- a/tx-client/pom.xml
+++ b/tx-client/pom.xml
@@ -6,31 +6,30 @@
com.codingapi
tx-lcn
- 4.1.0
+ 4.2.0
com.codingapi
tx-client
- ${lcn.last.version}
tx-client
https://github.com/codingapi/tx-lcn
tx-client project for Spring Boot
-
-
- 4.3.7.RELEASE
- 19.0
- 4.0.38
- 1.1.3
- 4.0.0
- 1.7.7
-
-
-
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+ ${spring-cloud-starter-openfeign.version}
+
+
+ org.springframework.cloud
+ spring-cloud-starter-ribbon
+ 1.4.4.RELEASE
+
+
com.github.1991wangliang
lorne_core
@@ -43,19 +42,17 @@
4.1.12.Final
-
org.aspectj
aspectjweaver
- 1.8.4
+ ${org.aspectj.version}
org.aspectj
aspectjrt
- 1.8.4
+ ${org.aspectj.version}
-
org.slf4j
slf4j-api
@@ -77,22 +74,18 @@
${org.slf4j-version}
-
-
javax.servlet
javax.servlet-api
3.1.0
-
org.springframework
spring-context
${org.springframework-version}
-
com.caucho
hessian
diff --git a/tx-client/src/main/java/com/codingapi/tx/Constants.java b/tx-client/src/main/java/com/codingapi/tx/Constants.java
index c7c8fb771..7dded7743 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,9 @@ public class Constants {
*/
public static TxServer txServer;
+ /**
+ * 主切面的 order值
+ */
+ public static final int ASPECT_ORDER = 1000;
+
}
diff --git a/tx-client/src/main/java/com/codingapi/tx/MQTxManagerFegin.java b/tx-client/src/main/java/com/codingapi/tx/MQTxManagerFegin.java
new file mode 100644
index 000000000..c6ca8ae9b
--- /dev/null
+++ b/tx-client/src/main/java/com/codingapi/tx/MQTxManagerFegin.java
@@ -0,0 +1,41 @@
+package com.codingapi.tx;
+
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * @author yizhishang
+ */
+@FeignClient(value = "tx-manager")
+public interface MQTxManagerFegin {
+
+ /**
+ * 检查并清理事务数据
+ * @param groupId 事务组id
+ * @param waitTaskId 任务id
+ * @return 事务状态
+ */
+ @GetMapping("/tx/manager/cleanNotifyTransactionHttp")
+ String cleanNotifyTransactionHttp(@RequestParam(value = "groupId") String groupId, @RequestParam(value = "waitTaskId") String waitTaskId);
+
+ /**
+ * 记录补偿事务数据到tm
+ */
+ @PostMapping("/tx/manager/sendCompensateMsg")
+ String sendCompensateMsg(@RequestParam("currentTime") long currentTime, @RequestParam("groupId") String groupId,
+ @RequestParam("model") String model, @RequestParam("address") String address,
+ @RequestParam("uniqueKey") String uniqueKey,
+ @RequestParam("className") String className, @RequestParam("methodStr") String methodStr,
+ @RequestParam("data") String data, @RequestParam("time") long time,
+ @RequestParam("startError") int startError);
+
+ /**
+ * 获取TM服务地址
+ * @return txServer
+ */
+ @GetMapping("/tx/manager/getServer")
+ String getServer();
+
+}
diff --git a/tx-client/src/main/java/com/codingapi/tx/annotation/TxTransaction.java b/tx-client/src/main/java/com/codingapi/tx/annotation/TxTransaction.java
index 6540ddc45..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
@@ -32,4 +32,17 @@
*/
Class extends Throwable>[] noRollbackFor() default {};
+ /**
+ * 事务模式 仅在事务发起方配置有效
+ * @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/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/TxCompensateLocal.java b/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxCompensateLocal.java
index c4053460a..19037daf2 100644
--- a/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxCompensateLocal.java
+++ b/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxCompensateLocal.java
@@ -6,7 +6,7 @@
*/
public class TxCompensateLocal {
- private final static ThreadLocal currentLocal = new InheritableThreadLocal();
+ private final static ThreadLocal currentLocal = new InheritableThreadLocal<>();
private String groupId;
diff --git a/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxTransactionInfo.java b/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxTransactionInfo.java
index 7c4c87c41..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
@@ -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;
@@ -11,8 +12,7 @@
public class TxTransactionInfo {
- private TxTransaction transaction;
-
+ private TxTransaction txTransaction;
private TxTransactionLocal txTransactionLocal;
@@ -24,17 +24,25 @@ public class TxTransactionInfo {
private TransactionInvocation invocation;
+ 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;
}
+ public TxTransactionMode getMode() {
+ return mode;
+ }
+
+ public void setMode(TxTransactionMode mode) {
+ this.mode = mode;
+ }
- public TxTransaction getTransaction() {
- return transaction;
+ public TxTransaction getTxTransaction() {
+ return txTransaction;
}
public TxTransactionLocal getTxTransactionLocal() {
diff --git a/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxTransactionLocal.java b/tx-client/src/main/java/com/codingapi/tx/aop/bean/TxTransactionLocal.java
index d5998d716..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
@@ -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;
@@ -18,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;
@@ -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/TransactionServerFactoryServiceImpl.java b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TransactionServerFactoryServiceImpl.java
index 229c89e92..f47a9d9d3 100644
--- a/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TransactionServerFactoryServiceImpl.java
+++ b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TransactionServerFactoryServiceImpl.java
@@ -1,23 +1,24 @@
package com.codingapi.tx.aop.service.impl;
-
import com.codingapi.tx.aop.bean.TxTransactionInfo;
import com.codingapi.tx.aop.service.TransactionServer;
import com.codingapi.tx.aop.service.TransactionServerFactoryService;
import com.codingapi.tx.datasource.ILCNTransactionControl;
-import com.codingapi.tx.netty.service.NettyService;
+import com.codingapi.tx.framework.utils.SocketManager;
import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-
-
/**
- * Created by lorne on 2017/6/8.
+ * @author lorne
+ * @date 2017/6/8
*/
@Service
public class TransactionServerFactoryServiceImpl implements TransactionServerFactoryService {
+ private Logger logger = LoggerFactory.getLogger(TransactionServerFactoryServiceImpl.class);
@Autowired
private TransactionServer txStartTransactionServer;
@@ -31,48 +32,53 @@ public class TransactionServerFactoryServiceImpl implements TransactionServerFac
@Autowired
private TransactionServer txRunningNoTransactionServer;
- @Autowired
- private NettyService nettyService;
-
@Autowired
private ILCNTransactionControl transactionControl;
-
+ @Override
public TransactionServer createTransactionServer(TxTransactionInfo info) throws Throwable {
+ if (!SocketManager.getInstance().isNetState()) {
+ //检查socket通讯是否正常 (第一次执行时启动txRunningTransactionServer的业务处理控制,然后嵌套调用其他事务的业务方法时都并到txInServiceTransactionServer业务处理下)
+ logger.warn("tx-manager not connected.");
+ return txDefaultTransactionServer;
+ }
+ /*********分布式事务处理逻辑***********/
+ logger.info("分布式事务处理逻辑...开始");
- /*********分布式事务处理逻辑*开始***********/
-
- /** 尽当Transaction注解不为空,其他都为空时。表示分布式事务开始启动 **/
- if (info.getTransaction() != null && info.getTransaction().isStart() && info.getTxTransactionLocal() == null && StringUtils.isEmpty(info.getTxGroupId())) {
+ /** 事务发起方:仅当TxTransaction注解不为空,其他都为空时。表示分布式事务开始启动 **/
+ if (info.getTxTransaction() != null && info.getTxTransaction().isStart() && info.getTxTransactionLocal() == null && StringUtils.isEmpty(info.getTxGroupId())) {
//检查socket通讯是否正常 (当启动事务的主业务方法执行完以后,再执行其他业务方法时将进入txInServiceTransactionServer业务处理)
- if (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;
}
}
-
- /** 分布式事务已经开启,业务进行中 **/
+ /** 事务参与方:分布式事务已经开启,业务进行中 **/
+ logger.debug("事务参与方:分布式事务已经开启,业务进行中");
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 {
- if(!transactionControl.isNoTransactionOperation()) { //有事务业务的操作
- return txRunningTransactionServer;
- }else {
+ /** 表示整个应用没有获取过DB连接 || 无事务业务的操作 **/
+ if (transactionControl.isNoTransactionOperation() || info.getTxTransaction().readOnly()) {
return txRunningNoTransactionServer;
+ } else {
+ return txRunningTransactionServer;
}
}
} else {
- throw new Exception("tx-manager not connected ,please check tx-manager server ");
+ logger.warn("tx-manager not connected.");
+ return txDefaultTransactionServer;
}
}
/*********分布式事务处理逻辑*结束***********/
-
+ logger.debug("分布式事务处理逻辑*结束");
return txDefaultTransactionServer;
}
}
diff --git a/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxDefaultTransactionServerImpl.java b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxDefaultTransactionServerImpl.java
index 7dca22511..b7df72477 100644
--- a/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxDefaultTransactionServerImpl.java
+++ b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxDefaultTransactionServerImpl.java
@@ -3,6 +3,8 @@
import com.codingapi.tx.aop.bean.TxTransactionInfo;
import com.codingapi.tx.aop.service.TransactionServer;
import org.aspectj.lang.ProceedingJoinPoint;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
/**
@@ -11,10 +13,11 @@
@Service(value = "txDefaultTransactionServer")
public class TxDefaultTransactionServerImpl implements TransactionServer {
-
+ private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public Object execute(ProceedingJoinPoint point, TxTransactionInfo info) throws Throwable {
+ logger.info("默认事务管理器...");
return point.proceed();
}
}
diff --git a/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxRunningNoTransactionServerImpl.java b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxRunningNoTransactionServerImpl.java
index a26372a49..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,9 +23,11 @@ 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 no db transaction, groupId: " + txGroupId);
+ logger.debug("--->begin readonly transaction, groupId: " + txGroupId);
long t1 = System.currentTimeMillis();
@@ -34,6 +36,8 @@ 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.setReadOnly(true);
TxTransactionLocal.setCurrent(txTransactionLocal);
try {
@@ -43,7 +47,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/TxRunningTransactionServerImpl.java b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxRunningTransactionServerImpl.java
index b2a606bf7..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,16 +46,15 @@ public Object execute(final ProceedingJoinPoint point, final TxTransactionInfo i
boolean isHasIsGroup = transactionControl.hasGroup(txGroupId);
-
TxTransactionLocal txTransactionLocal = new TxTransactionLocal();
txTransactionLocal.setGroupId(txGroupId);
txTransactionLocal.setHasStart(false);
txTransactionLocal.setKid(kid);
txTransactionLocal.setHasIsGroup(isHasIsGroup);
txTransactionLocal.setMaxTimeOut(Constants.txServer.getCompensateMaxWaitTime());
+ txTransactionLocal.setMode(info.getMode());
TxTransactionLocal.setCurrent(txTransactionLocal);
-
try {
Object res = point.proceed();
@@ -94,6 +92,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);
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..7dcdbcb1f 100644
--- a/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxStartTransactionServerImpl.java
+++ b/tx-client/src/main/java/com/codingapi/tx/aop/service/impl/TxStartTransactionServerImpl.java
@@ -35,7 +35,9 @@ public class TxStartTransactionServerImpl implements TransactionServer {
public Object execute(ProceedingJoinPoint point,final TxTransactionInfo info) throws Throwable {
//分布式事务开始执行
- logger.debug("--->begin start transaction");
+ logger.info("事务发起方...");
+
+ logger.debug("--->分布式事务开始执行 begin start transaction");
final long start = System.currentTimeMillis();
@@ -44,16 +46,17 @@ public Object execute(ProceedingJoinPoint point,final TxTransactionInfo info) th
final String groupId = TxCompensateLocal.current()==null?KidUtils.generateShortUuid():TxCompensateLocal.current().getGroupId();
//创建事务组
+ logger.debug("创建事务组并发送消息");
txManagerService.createTransactionGroup(groupId);
-
TxTransactionLocal txTransactionLocal = new TxTransactionLocal();
txTransactionLocal.setGroupId(groupId);
txTransactionLocal.setHasStart(true);
txTransactionLocal.setMaxTimeOut(Constants.txServer.getCompensateMaxWaitTime());
+ txTransactionLocal.setMode(info.getTxTransaction().mode());
+ txTransactionLocal.setReadOnly(info.getTxTransaction().readOnly());
TxTransactionLocal.setCurrent(txTransactionLocal);
-
try {
Object obj = point.proceed();
state = 1;
@@ -99,7 +102,7 @@ public Object execute(ProceedingJoinPoint point,final TxTransactionInfo info) th
long end = System.currentTimeMillis();
long time = end - start;
if ((executeConnectionError == 1&&rs == 1)||(lastState == 1 && rs == 0)) {
- //记录补偿日志
+ logger.debug("记录补偿日志");
txManagerService.sendCompensateMsg(groupId, time, info,executeConnectionError);
}
}else{
@@ -111,7 +114,7 @@ public Object execute(ProceedingJoinPoint point,final TxTransactionInfo info) th
}
TxTransactionLocal.setCurrent(null);
- logger.debug("<---end start transaction");
+ logger.debug("<---分布式事务 end start transaction");
logger.debug("start transaction over, res -> groupId:" + groupId + ", now state:" + (lastState == 1 ? "commit" : "rollback"));
}
@@ -130,7 +133,7 @@ private int rollbackException(TxTransactionInfo info,Throwable throwable){
}
//回滚异常检测.
- for(Class extends Throwable> rollbackFor:info.getTransaction().rollbackFor()){
+ for(Class extends Throwable> rollbackFor:info.getTxTransaction().rollbackFor()){
//存在关系
if(rollbackFor.isAssignableFrom(throwable.getClass())){
@@ -140,7 +143,7 @@ private int rollbackException(TxTransactionInfo info,Throwable throwable){
}
//不回滚异常检测.
- for(Class extends Throwable> rollbackFor:info.getTransaction().noRollbackFor()){
+ for(Class extends Throwable> rollbackFor:info.getTxTransaction().noRollbackFor()){
//存在关系
if(rollbackFor.isAssignableFrom(throwable.getClass())){
diff --git a/tx-client/src/main/java/com/codingapi/tx/config/ConfigReader.java b/tx-client/src/main/java/com/codingapi/tx/config/ConfigReader.java
deleted file mode 100644
index 63e90b257..000000000
--- a/tx-client/src/main/java/com/codingapi/tx/config/ConfigReader.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.codingapi.tx.config;
-
-import com.codingapi.tx.config.service.TxManagerTxUrlService;
-import com.lorne.core.framework.utils.config.ConfigUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationContext;
-import org.springframework.stereotype.Component;
-
-/**
- * create by lorne on 2017/11/13
- */
-@Component
-public class ConfigReader {
-
-
- private Logger logger = LoggerFactory.getLogger(ConfigReader.class);
-
-
- private TxManagerTxUrlService txManagerTxUrlService;
-
- @Autowired
- private ApplicationContext spring;
-
-
- public String getTxUrl() {
-
- try {
- txManagerTxUrlService = spring.getBean(TxManagerTxUrlService.class);
- }catch (Exception e){
- logger.debug("load default txManagerTxUrlService ");
- }
-
- if(txManagerTxUrlService == null){
- txManagerTxUrlService = new TxManagerTxUrlService() {
-
- private final String configName = "tx.properties";
-
- private final String configKey = "url";
-
- @Override
- public String getTxUrl() {
- return ConfigUtils.getString(configName,configKey);
- }
- };
-
- logger.debug("load default txManagerTxUrlService");
- }else{
- logger.debug("load txManagerTxUrlService");
- }
-
- return txManagerTxUrlService.getTxUrl();
- }
-
-
-}
diff --git a/tx-client/src/main/java/com/codingapi/tx/config/service/TxManagerTxUrlService.java b/tx-client/src/main/java/com/codingapi/tx/config/service/TxManagerTxUrlService.java
deleted file mode 100644
index 3d8004658..000000000
--- a/tx-client/src/main/java/com/codingapi/tx/config/service/TxManagerTxUrlService.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.codingapi.tx.config.service;
-
-/**
- * create by lorne on 2017/11/18
- */
-public interface TxManagerTxUrlService {
-
- String getTxUrl();
-}
diff --git a/tx-client/src/main/java/com/codingapi/tx/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/datasource/AbstractResourceProxy.java b/tx-client/src/main/java/com/codingapi/tx/datasource/AbstractResourceProxy.java
index bcfe99551..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
@@ -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();
@@ -76,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());
@@ -95,6 +102,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++){
@@ -124,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 ");
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/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-client/src/main/java/com/codingapi/tx/netty/service/MQTxManagerFeginService.java b/tx-client/src/main/java/com/codingapi/tx/netty/service/MQTxManagerFeginService.java
new file mode 100644
index 000000000..d1f0314ce
--- /dev/null
+++ b/tx-client/src/main/java/com/codingapi/tx/netty/service/MQTxManagerFeginService.java
@@ -0,0 +1,38 @@
+package com.codingapi.tx.netty.service;
+
+/**
+ * @author yizhishang
+ */
+public interface MQTxManagerFeginService {
+
+ /**
+ * 检查并清理事务数据
+ * @param groupId 事务组id
+ * @param waitTaskId 任务id
+ * @return 事务状态
+ */
+ String cleanNotifyTransactionHttp(String groupId, String waitTaskId);
+
+ /**
+ * 记录补偿事务数据到tm
+ * @param currentTime 时间
+ * @param groupId 事务组id
+ * @param model 模块名称
+ * @param address 模块地址
+ * @param uniqueKey 唯一标示
+ * @param className 事务启动类
+ * @param methodStr 事务启动方法
+ * @param data 切面数据
+ * @param time 执行时间
+ * @param startError 启动模块异常
+ * @return 是否保存成功
+ */
+ String sendCompensateMsg(long currentTime, String groupId, String model, String address, String uniqueKey, String className, String methodStr, String data, long time,int startError);
+
+ /**
+ * 获取TM服务地址
+ * @return txServer
+ */
+ String getServer();
+
+}
diff --git a/tx-client/src/main/java/com/codingapi/tx/netty/service/TxManagerHttpRequestHelper.java b/tx-client/src/main/java/com/codingapi/tx/netty/service/TxManagerHttpRequestHelper.java
deleted file mode 100644
index c3438938d..000000000
--- a/tx-client/src/main/java/com/codingapi/tx/netty/service/TxManagerHttpRequestHelper.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.codingapi.tx.netty.service;
-
-
-import com.lorne.core.framework.utils.http.HttpUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationContext;
-import org.springframework.stereotype.Component;
-
-/**
- * create by lorne on 2017/11/17
- */
-@Component
-public class TxManagerHttpRequestHelper {
-
-
- private TxManagerHttpRequestService httpRequestService;
-
- @Autowired
- private ApplicationContext spring;
-
- private Logger logger = LoggerFactory.getLogger(TxManagerHttpRequestHelper.class);
-
-
- private void reloadHttpRequestService(){
- try {
- httpRequestService = spring.getBean(TxManagerHttpRequestService.class);
- }catch (Exception e){
- logger.debug("load default httpRequestService ");
- }
-
- if(httpRequestService==null){
- httpRequestService = new TxManagerHttpRequestService() {
- @Override
- public String httpGet(String url) {
- return HttpUtils.get(url);
- }
-
- @Override
- public String httpPost(String url, String params) {
- return HttpUtils.post(url, params);
- }
- };
- logger.info("load default HttpRequestService .");
- }else {
- logger.info("load HttpRequestService .");
- }
- }
-
- public String httpGet(String url) {
- reloadHttpRequestService();
- return httpRequestService.httpGet(url);
- }
-
- public String httpPost(String url, String params) {
- reloadHttpRequestService();
- return httpRequestService.httpPost(url,params);
- }
-
-
-}
diff --git a/tx-client/src/main/java/com/codingapi/tx/netty/service/TxManagerHttpRequestService.java b/tx-client/src/main/java/com/codingapi/tx/netty/service/TxManagerHttpRequestService.java
deleted file mode 100644
index e8ae5769d..000000000
--- a/tx-client/src/main/java/com/codingapi/tx/netty/service/TxManagerHttpRequestService.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.codingapi.tx.netty.service;
-
-/**
- * create by lorne on 2017/11/17
- */
-public interface TxManagerHttpRequestService {
-
- String httpGet(String url);
-
- String httpPost(String url, String params);
-
-}
diff --git a/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerFeginServiceImpl.java b/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerFeginServiceImpl.java
new file mode 100644
index 000000000..bc6a7c2c8
--- /dev/null
+++ b/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerFeginServiceImpl.java
@@ -0,0 +1,48 @@
+package com.codingapi.tx.netty.service.impl;
+
+import com.codingapi.tx.MQTxManagerFegin;
+import com.codingapi.tx.netty.service.MQTxManagerFeginService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author yizhishang
+ */
+@Service
+public class MQTxManagerFeginServiceImpl implements MQTxManagerFeginService {
+
+ @Autowired
+ private MQTxManagerFegin mqTxManagerFegin;
+
+ /**
+ * 检查并清理事务数据
+ *
+ * @param groupId 事务组id
+ * @param waitTaskId 任务id
+ * @return 事务状态
+ */
+ @Override
+ public String cleanNotifyTransactionHttp(String groupId, String waitTaskId) {
+ return mqTxManagerFegin.cleanNotifyTransactionHttp(groupId, waitTaskId);
+ }
+
+ /**
+ * 记录补偿事务数据到tm
+ */
+ @Override
+ public String sendCompensateMsg(long currentTime, String groupId, String model, String address, String uniqueKey, String className, String methodStr, String data, long time,int startError) {
+ return mqTxManagerFegin.sendCompensateMsg(currentTime, groupId, model, address, uniqueKey, className, methodStr, data, time,startError);
+ }
+
+ /**
+ * 获取TM服务地址
+ *
+ * @return txServer
+ */
+ @Override
+ public String getServer() {
+ return mqTxManagerFegin.getServer();
+ }
+
+}
diff --git a/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerServiceImpl.java b/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerServiceImpl.java
index 5362b63d8..a6fbb4a10 100644
--- a/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerServiceImpl.java
+++ b/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/MQTxManagerServiceImpl.java
@@ -1,18 +1,16 @@
package com.codingapi.tx.netty.service.impl;
import com.alibaba.fastjson.JSONObject;
-import com.codingapi.tx.aop.bean.TxCompensateLocal;
import com.codingapi.tx.aop.bean.TxTransactionInfo;
import com.codingapi.tx.compensate.model.CompensateInfo;
import com.codingapi.tx.compensate.service.CompensateService;
-import com.codingapi.tx.config.ConfigReader;
import com.codingapi.tx.framework.utils.SerializerUtils;
import com.codingapi.tx.framework.utils.SocketManager;
import com.codingapi.tx.listener.service.ModelNameService;
import com.codingapi.tx.model.Request;
import com.codingapi.tx.model.TxGroup;
+import com.codingapi.tx.netty.service.MQTxManagerFeginService;
import com.codingapi.tx.netty.service.MQTxManagerService;
-import com.codingapi.tx.netty.service.TxManagerHttpRequestHelper;
import com.lorne.core.framework.utils.encode.Base64Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -27,15 +25,11 @@ public class MQTxManagerServiceImpl implements MQTxManagerService {
@Autowired
private ModelNameService modelNameService;
- @Autowired
- private ConfigReader configReader;
-
@Autowired
private CompensateService compensateService;
@Autowired
- private TxManagerHttpRequestHelper managerHelper;
-
+ private MQTxManagerFeginService mqTxManagerFeginService;
@Override
public void createTransactionGroup(String groupId) {
@@ -57,7 +51,6 @@ public TxGroup addTransactionGroup(String groupId, String taskId, boolean isGrou
return TxGroup.parser(json);
}
-
@Override
public int closeTransactionGroup(final String groupId, final int state) {
JSONObject jsonObject = new JSONObject();
@@ -100,8 +93,7 @@ public int cleanNotifyTransaction(String groupId, String taskId) {
@Override
public int cleanNotifyTransactionHttp(String groupId, String waitTaskId) {
- String url = configReader.getTxUrl() + "cleanNotifyTransactionHttp?groupId=" + groupId + "&taskId=" + waitTaskId;
- String clearRes = managerHelper.httpGet(url);
+ String clearRes = mqTxManagerFeginService.cleanNotifyTransactionHttp(groupId, waitTaskId);
if(clearRes==null){
return -1;
}
@@ -111,8 +103,7 @@ public int cleanNotifyTransactionHttp(String groupId, String waitTaskId) {
@Override
public String httpGetServer() {
- String url = configReader.getTxUrl() + "getServer";
- return managerHelper.httpGet(url);
+ return mqTxManagerFeginService.getServer();
}
@Override
@@ -133,7 +124,7 @@ public void sendCompensateMsg(String groupId, long time, TxTransactionInfo info,
CompensateInfo compensateInfo = new CompensateInfo(currentTime, modelName, uniqueKey, data, methodStr, className, groupId, address, time,startError);
- String json = managerHelper.httpPost(configReader.getTxUrl() + "sendCompensateMsg", compensateInfo.toParamsString());
+ String json = mqTxManagerFeginService.sendCompensateMsg(currentTime, groupId, modelName, address, uniqueKey, className, methodStr, data, time,startError);
compensateInfo.setResJson(json);
diff --git a/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/NettyControlServiceImpl.java b/tx-client/src/main/java/com/codingapi/tx/netty/service/impl/NettyControlServiceImpl.java
index 052a647b8..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
@@ -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;
@@ -49,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();
}
@@ -71,12 +71,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() {
diff --git a/tx-manager/.gitignore b/tx-manager/.gitignore
deleted file mode 100644
index 76331cfb8..000000000
--- a/tx-manager/.gitignore
+++ /dev/null
@@ -1,23 +0,0 @@
-target/
-!.mvn/wrapper/maven-wrapper.jar
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-nbproject/private/
-nbbuild/
-dist/
-nbdist/
-.nb-gradle/
\ No newline at end of file
diff --git a/tx-manager/.mvn/wrapper/maven-wrapper.jar b/tx-manager/.mvn/wrapper/maven-wrapper.jar
deleted file mode 100644
index 9cc84ea9b..000000000
Binary files a/tx-manager/.mvn/wrapper/maven-wrapper.jar and /dev/null differ
diff --git a/tx-manager/.mvn/wrapper/maven-wrapper.properties b/tx-manager/.mvn/wrapper/maven-wrapper.properties
deleted file mode 100644
index c31504370..000000000
--- a/tx-manager/.mvn/wrapper/maven-wrapper.properties
+++ /dev/null
@@ -1 +0,0 @@
-distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.0/apache-maven-3.5.0-bin.zip
diff --git a/tx-manager/mvnw b/tx-manager/mvnw
deleted file mode 100644
index 5bf251c07..000000000
--- a/tx-manager/mvnw
+++ /dev/null
@@ -1,225 +0,0 @@
-#!/bin/sh
-# ----------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-# ----------------------------------------------------------------------------
-
-# ----------------------------------------------------------------------------
-# Maven2 Start Up Batch script
-#
-# Required ENV vars:
-# ------------------
-# JAVA_HOME - location of a JDK home dir
-#
-# Optional ENV vars
-# -----------------
-# M2_HOME - location of maven2's installed home dir
-# MAVEN_OPTS - parameters passed to the Java VM when running Maven
-# e.g. to debug Maven itself, use
-# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
-# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
-# ----------------------------------------------------------------------------
-
-if [ -z "$MAVEN_SKIP_RC" ] ; then
-
- if [ -f /etc/mavenrc ] ; then
- . /etc/mavenrc
- fi
-
- if [ -f "$HOME/.mavenrc" ] ; then
- . "$HOME/.mavenrc"
- fi
-
-fi
-
-# OS specific support. $var _must_ be set to either true or false.
-cygwin=false;
-darwin=false;
-mingw=false
-case "`uname`" in
- CYGWIN*) cygwin=true ;;
- MINGW*) mingw=true;;
- Darwin*) darwin=true
- # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
- # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
- if [ -z "$JAVA_HOME" ]; then
- if [ -x "/usr/libexec/java_home" ]; then
- export JAVA_HOME="`/usr/libexec/java_home`"
- else
- export JAVA_HOME="/Library/Java/Home"
- fi
- fi
- ;;
-esac
-
-if [ -z "$JAVA_HOME" ] ; then
- if [ -r /etc/gentoo-release ] ; then
- JAVA_HOME=`java-config --jre-home`
- fi
-fi
-
-if [ -z "$M2_HOME" ] ; then
- ## resolve links - $0 may be a link to maven's home
- PRG="$0"
-
- # need this for relative symlinks
- while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG="`dirname "$PRG"`/$link"
- fi
- done
-
- saveddir=`pwd`
-
- M2_HOME=`dirname "$PRG"`/..
-
- # make it fully qualified
- M2_HOME=`cd "$M2_HOME" && pwd`
-
- cd "$saveddir"
- # echo Using m2 at $M2_HOME
-fi
-
-# For Cygwin, ensure paths are in UNIX format before anything is touched
-if $cygwin ; then
- [ -n "$M2_HOME" ] &&
- M2_HOME=`cygpath --unix "$M2_HOME"`
- [ -n "$JAVA_HOME" ] &&
- JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
- [ -n "$CLASSPATH" ] &&
- CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
-fi
-
-# For Migwn, ensure paths are in UNIX format before anything is touched
-if $mingw ; then
- [ -n "$M2_HOME" ] &&
- M2_HOME="`(cd "$M2_HOME"; pwd)`"
- [ -n "$JAVA_HOME" ] &&
- JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
- # TODO classpath?
-fi
-
-if [ -z "$JAVA_HOME" ]; then
- javaExecutable="`which javac`"
- if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
- # readlink(1) is not available as standard on Solaris 10.
- readLink=`which readlink`
- if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
- if $darwin ; then
- javaHome="`dirname \"$javaExecutable\"`"
- javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
- else
- javaExecutable="`readlink -f \"$javaExecutable\"`"
- fi
- javaHome="`dirname \"$javaExecutable\"`"
- javaHome=`expr "$javaHome" : '\(.*\)/bin'`
- JAVA_HOME="$javaHome"
- export JAVA_HOME
- fi
- fi
-fi
-
-if [ -z "$JAVACMD" ] ; then
- if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
- else
- JAVACMD="$JAVA_HOME/bin/java"
- fi
- else
- JAVACMD="`which java`"
- fi
-fi
-
-if [ ! -x "$JAVACMD" ] ; then
- echo "Error: JAVA_HOME is not defined correctly." >&2
- echo " We cannot execute $JAVACMD" >&2
- exit 1
-fi
-
-if [ -z "$JAVA_HOME" ] ; then
- echo "Warning: JAVA_HOME environment variable is not set."
-fi
-
-CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
-
-# traverses directory structure from process work directory to filesystem root
-# first directory with .mvn subdirectory is considered project base directory
-find_maven_basedir() {
-
- if [ -z "$1" ]
- then
- echo "Path not specified to find_maven_basedir"
- return 1
- fi
-
- basedir="$1"
- wdir="$1"
- while [ "$wdir" != '/' ] ; do
- if [ -d "$wdir"/.mvn ] ; then
- basedir=$wdir
- break
- fi
- # workaround for JBEAP-8937 (on Solaris 10/Sparc)
- if [ -d "${wdir}" ]; then
- wdir=`cd "$wdir/.."; pwd`
- fi
- # end of workaround
- done
- echo "${basedir}"
-}
-
-# concatenates all lines of a file
-concat_lines() {
- if [ -f "$1" ]; then
- echo "$(tr -s '\n' ' ' < "$1")"
- fi
-}
-
-BASE_DIR=`find_maven_basedir "$(pwd)"`
-if [ -z "$BASE_DIR" ]; then
- exit 1;
-fi
-
-export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
-echo $MAVEN_PROJECTBASEDIR
-MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin; then
- [ -n "$M2_HOME" ] &&
- M2_HOME=`cygpath --path --windows "$M2_HOME"`
- [ -n "$JAVA_HOME" ] &&
- JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
- [ -n "$CLASSPATH" ] &&
- CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
- [ -n "$MAVEN_PROJECTBASEDIR" ] &&
- MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
-fi
-
-WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
-
-exec "$JAVACMD" \
- $MAVEN_OPTS \
- -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
- "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
- ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/tx-manager/mvnw.cmd b/tx-manager/mvnw.cmd
deleted file mode 100644
index 019bd74d7..000000000
--- a/tx-manager/mvnw.cmd
+++ /dev/null
@@ -1,143 +0,0 @@
-@REM ----------------------------------------------------------------------------
-@REM Licensed to the Apache Software Foundation (ASF) under one
-@REM or more contributor license agreements. See the NOTICE file
-@REM distributed with this work for additional information
-@REM regarding copyright ownership. The ASF licenses this file
-@REM to you under the Apache License, Version 2.0 (the
-@REM "License"); you may not use this file except in compliance
-@REM with the License. You may obtain a copy of the License at
-@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing,
-@REM software distributed under the License is distributed on an
-@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-@REM KIND, either express or implied. See the License for the
-@REM specific language governing permissions and limitations
-@REM under the License.
-@REM ----------------------------------------------------------------------------
-
-@REM ----------------------------------------------------------------------------
-@REM Maven2 Start Up Batch script
-@REM
-@REM Required ENV vars:
-@REM JAVA_HOME - location of a JDK home dir
-@REM
-@REM Optional ENV vars
-@REM M2_HOME - location of maven2's installed home dir
-@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
-@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
-@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
-@REM e.g. to debug Maven itself, use
-@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
-@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
-@REM ----------------------------------------------------------------------------
-
-@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
-@echo off
-@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
-@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
-
-@REM set %HOME% to equivalent of $HOME
-if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
-
-@REM Execute a user defined script before this one
-if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
-@REM check for pre script, once with legacy .bat ending and once with .cmd ending
-if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
-if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
-:skipRcPre
-
-@setlocal
-
-set ERROR_CODE=0
-
-@REM To isolate internal variables from possible post scripts, we use another setlocal
-@setlocal
-
-@REM ==== START VALIDATION ====
-if not "%JAVA_HOME%" == "" goto OkJHome
-
-echo.
-echo Error: JAVA_HOME not found in your environment. >&2
-echo Please set the JAVA_HOME variable in your environment to match the >&2
-echo location of your Java installation. >&2
-echo.
-goto error
-
-:OkJHome
-if exist "%JAVA_HOME%\bin\java.exe" goto init
-
-echo.
-echo Error: JAVA_HOME is set to an invalid directory. >&2
-echo JAVA_HOME = "%JAVA_HOME%" >&2
-echo Please set the JAVA_HOME variable in your environment to match the >&2
-echo location of your Java installation. >&2
-echo.
-goto error
-
-@REM ==== END VALIDATION ====
-
-:init
-
-@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
-@REM Fallback to current working directory if not found.
-
-set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
-IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
-
-set EXEC_DIR=%CD%
-set WDIR=%EXEC_DIR%
-:findBaseDir
-IF EXIST "%WDIR%"\.mvn goto baseDirFound
-cd ..
-IF "%WDIR%"=="%CD%" goto baseDirNotFound
-set WDIR=%CD%
-goto findBaseDir
-
-:baseDirFound
-set MAVEN_PROJECTBASEDIR=%WDIR%
-cd "%EXEC_DIR%"
-goto endDetectBaseDir
-
-:baseDirNotFound
-set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
-cd "%EXEC_DIR%"
-
-:endDetectBaseDir
-
-IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
-
-@setlocal EnableExtensions EnableDelayedExpansion
-for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
-@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
-
-:endReadAdditionalConfig
-
-SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
-
-set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
-set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
-
-%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
-if ERRORLEVEL 1 goto error
-goto end
-
-:error
-set ERROR_CODE=1
-
-:end
-@endlocal & set ERROR_CODE=%ERROR_CODE%
-
-if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
-@REM check for post script, once with legacy .bat ending and once with .cmd ending
-if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
-if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
-:skipRcPost
-
-@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
-if "%MAVEN_BATCH_PAUSE%" == "on" pause
-
-if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
-
-exit /B %ERROR_CODE%
diff --git a/tx-manager/pom.xml b/tx-manager/pom.xml
index 4d163f987..684aee77a 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
jar
tx-manager
@@ -14,21 +14,35 @@
org.springframework.boot
spring-boot-starter-parent
- 1.5.4.RELEASE
+ 2.0.4.RELEASE
UTF-8
UTF-8
- 1.7
- 1.7
- 1.7
+ 1.8
+ 1.8
+ 1.8
19.0
- Dalston.SR1
+ Finchley.RELEASE
+ true
+ true
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring-cloud.version}
+ pom
+ import
+
+
+
+
@@ -43,7 +57,6 @@
-
io.netty
netty-all
@@ -52,31 +65,34 @@
org.springframework.cloud
- spring-cloud-starter-eureka-server
+ spring-cloud-starter-netflix-eureka-client
+ 2.0.0.RELEASE
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
- com.google.guava
- guava
+ org.springframework.boot
+ spring-boot-starter-tomcat
-
-
-
-
-
-
-
org.springframework.boot
- spring-boot-starter-web
+ spring-boot-starter-undertow
-
org.springframework.boot
- spring-boot-starter-redis
- 1.3.8.RELEASE
+ spring-boot-starter-data-redis
+
+
+
+ com.alibaba
+ fastjson
+ 1.2.47
@@ -87,19 +103,6 @@
-
-
-
-
- org.springframework.cloud
- spring-cloud-dependencies
- ${spring-cloud.version}
- pom
- import
-
-
-
-
@@ -144,26 +147,6 @@
-
- maven-assembly-plugin
-
- false
-
- src/main/build/package.xml
-
-
-
-
- make-assembly
- package
-
- single
-
-
-
-
-
-
org.springframework.boot
spring-boot-maven-plugin
diff --git a/tx-manager/src/main/build/package.xml b/tx-manager/src/main/build/package.xml
deleted file mode 100644
index 5b5cf98ea..000000000
--- a/tx-manager/src/main/build/package.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
- package
-
- zip
-
- true
-
-
- bin
- /
-
-
- src/main/resources
- /
-
-
- ${project.build.directory}
- /
-
- *.jar
-
-
-
-
-
- lib
- runtime
-
- ${groupId}:${artifactId}
-
-
-
-
diff --git a/tx-manager/src/main/java/com/codingapi/tm/ServletInitializer.java b/tx-manager/src/main/java/com/codingapi/tm/ServletInitializer.java
index f9ee98fd9..dbf897b36 100644
--- a/tx-manager/src/main/java/com/codingapi/tm/ServletInitializer.java
+++ b/tx-manager/src/main/java/com/codingapi/tm/ServletInitializer.java
@@ -1,18 +1,16 @@
package com.codingapi.tm;
import org.springframework.boot.builder.SpringApplicationBuilder;
-import org.springframework.boot.web.support.SpringBootServletInitializer;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
* Created by lorne on 2017/7/3.
*/
public class ServletInitializer extends SpringBootServletInitializer {
-
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(TxManagerApplication.class);
}
-
}
diff --git a/tx-manager/src/main/java/com/codingapi/tm/TxManagerApplication.java b/tx-manager/src/main/java/com/codingapi/tm/TxManagerApplication.java
index 156b2821f..e4b8112d8 100644
--- a/tx-manager/src/main/java/com/codingapi/tm/TxManagerApplication.java
+++ b/tx-manager/src/main/java/com/codingapi/tm/TxManagerApplication.java
@@ -2,15 +2,12 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
-
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+@EnableEurekaClient
@SpringBootApplication
-@EnableDiscoveryClient
public class TxManagerApplication {
-
-
public static void main(String[] args) {
SpringApplication.run(TxManagerApplication.class, args);
}
diff --git a/tx-manager/src/main/java/com/codingapi/tm/compensate/dao/impl/CompensateDaoImpl.java b/tx-manager/src/main/java/com/codingapi/tm/compensate/dao/impl/CompensateDaoImpl.java
index 46b7c2278..2969da2cf 100644
--- a/tx-manager/src/main/java/com/codingapi/tm/compensate/dao/impl/CompensateDaoImpl.java
+++ b/tx-manager/src/main/java/com/codingapi/tm/compensate/dao/impl/CompensateDaoImpl.java
@@ -6,6 +6,8 @@
import com.codingapi.tm.config.ConfigReader;
import com.codingapi.tm.redis.service.RedisServerService;
import com.lorne.core.framework.utils.DateUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -18,6 +20,7 @@
@Service
public class CompensateDaoImpl implements CompensateDao {
+ Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private RedisServerService redisServerService;
@@ -33,6 +36,7 @@ public String saveCompensateMsg(TransactionCompensateMsg transactionCompensateMs
String json = JSON.toJSONString(transactionCompensateMsg);
+ logger.debug("保存补偿数据至redis: {}", json);
redisServerService.saveCompensateMsg(name, json);
return name;
diff --git a/tx-manager/src/main/java/com/codingapi/tm/compensate/service/impl/CompensateServiceImpl.java b/tx-manager/src/main/java/com/codingapi/tm/compensate/service/impl/CompensateServiceImpl.java
index 84d183bd6..398455aa7 100644
--- a/tx-manager/src/main/java/com/codingapi/tm/compensate/service/impl/CompensateServiceImpl.java
+++ b/tx-manager/src/main/java/com/codingapi/tm/compensate/service/impl/CompensateServiceImpl.java
@@ -114,6 +114,7 @@ public void autoCompensate(final String compensateKey, TransactionCompensateMsg
final String json = JSON.toJSONString(transactionCompensateMsg);
logger.info("Auto Compensate->" + json);
//自动补偿业务执行...
+ logger.debug("自动补偿业务执行...");
final int tryTime = configReader.getCompensateTryTime();
boolean autoExecuteRes = false;
try {
@@ -278,9 +279,11 @@ public void reloadCompensate(TxGroup txGroup) {
}
}
}
+ logger.info("重新加载补偿数据...");
logger.info("Compensate Loaded->"+JSON.toJSONString(txGroup));
}
+ @Override
public TxGroup getCompensateByGroupId(String groupId) {
String json = compensateDao.getCompensateByGroupId(groupId);
if (json == null) {
diff --git a/tx-manager/src/main/java/com/codingapi/tm/listener/ApplicationStartListener.java b/tx-manager/src/main/java/com/codingapi/tm/listener/ApplicationStartListener.java
index ecb20d049..3d86c4918 100644
--- a/tx-manager/src/main/java/com/codingapi/tm/listener/ApplicationStartListener.java
+++ b/tx-manager/src/main/java/com/codingapi/tm/listener/ApplicationStartListener.java
@@ -1,7 +1,7 @@
package com.codingapi.tm.listener;
import com.codingapi.tm.Constants;
-import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent;
+import org.springframework.boot.web.context.WebServerInitializedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@@ -12,12 +12,12 @@
* create by lorne on 2017/8/7
*/
@Component
-public class ApplicationStartListener implements ApplicationListener {
+public class ApplicationStartListener implements ApplicationListener {
@Override
- public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
- int serverPort = event.getEmbeddedServletContainer().getPort();
+ public void onApplicationEvent(WebServerInitializedEvent event) {
+ int serverPort = event.getWebServer().getPort();
String ip = getIp();
Constants.address = ip+":"+serverPort;
}
diff --git a/tx-manager/src/main/java/com/codingapi/tm/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/java/com/codingapi/tm/manager/service/impl/MicroServiceImpl.java b/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/MicroServiceImpl.java
index 5a74ac913..5855b14bb 100644
--- a/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/MicroServiceImpl.java
+++ b/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/MicroServiceImpl.java
@@ -6,10 +6,14 @@
import com.codingapi.tm.manager.service.MicroService;
import com.codingapi.tm.model.TxServer;
import com.codingapi.tm.model.TxState;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.cloud.client.serviceregistry.Registration;
import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
@@ -23,6 +27,7 @@
@Service
public class MicroServiceImpl implements MicroService {
+ private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private RestTemplate restTemplate;
@@ -34,7 +39,11 @@ public class MicroServiceImpl implements MicroService {
@Autowired
private DiscoveryClient discoveryClient;
-
+ /**
+ * 服务注册
+ */
+ @Autowired
+ private Registration registration;
private boolean isIp(String ipAddress) {
String ip = "([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}";
@@ -43,15 +52,14 @@ private boolean isIp(String ipAddress) {
return matcher.matches();
}
-
-
@Override
public TxState getState() {
TxState state = new TxState();
- String ipAddress = discoveryClient.getLocalServiceInstance().getHost();
+ String ipAddress = registration.getHost();
if(!isIp(ipAddress)){
ipAddress = "127.0.0.1";
}
+ logger.info("ipAddress: {}, port: {}", ipAddress, Constants.socketPort);
state.setIp(ipAddress);
state.setPort(Constants.socketPort);
state.setMaxConnection(SocketManager.getInstance().getMaxConnection());
diff --git a/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/TxManagerSenderServiceImpl.java b/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/TxManagerSenderServiceImpl.java
index e5ee4e270..2edae671a 100644
--- a/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/TxManagerSenderServiceImpl.java
+++ b/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/TxManagerSenderServiceImpl.java
@@ -110,13 +110,11 @@ private void setChannel(List list) {
/**
* 事务提交或回归
*
- * @param checkSate
+ * @param checkSate 1-提交事务
*/
private boolean transaction(final TxGroup txGroup, final int checkSate) {
-
-
if (checkSate == 1) {
-
+ logger.info("事务提交");
//补偿请求,加载历史数据
if (txGroup.getIsCompensate() == 1) {
compensateService.reloadCompensate(txGroup);
@@ -135,8 +133,8 @@ public Boolean execute() {
final JSONObject jsonObject = new JSONObject();
jsonObject.put("a", "t");
-
- if (txGroup.getIsCompensate() == 1) { //补偿请求
+ /** 补偿请求 **/
+ if (txGroup.getIsCompensate() == 1) {
jsonObject.put("c", txInfo.getIsCommit());
} else { //正常业务
jsonObject.put("c", checkSate);
@@ -193,24 +191,25 @@ public Boolean execute() {
}
logger.info("--->" + hasOk + ",group:" + txGroup.getGroupId() + ",state:" + checkSate + ",list:" + txGroup.toJsonString());
return hasOk;
- }else{
- //回滚操作只发送通过不需要等待确认
- for (TxInfo txInfo : txGroup.getList()) {
- if(txInfo.getChannel()!=null) {
- if (txInfo.getIsGroup() == 0) {
- JSONObject jsonObject = new JSONObject();
- jsonObject.put("a", "t");
- jsonObject.put("c", checkSate);
- jsonObject.put("t", txInfo.getKid());
- String key = KidUtils.generateShortUuid();
- jsonObject.put("k", key);
- txInfo.getChannel().send(jsonObject.toJSONString());
- }
+ }
+
+ logger.info("事务回滚");
+ //回滚操作只发送通过不需要等待确认
+ for (TxInfo txInfo : txGroup.getList()) {
+ if(txInfo.getChannel()!=null) {
+ if (txInfo.getIsGroup() == 0) {
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("a", "t");
+ jsonObject.put("c", checkSate);
+ jsonObject.put("t", txInfo.getKid());
+ String key = KidUtils.generateShortUuid();
+ jsonObject.put("k", key);
+ txInfo.getChannel().send(jsonObject.toJSONString());
}
}
- txManagerService.deleteTxGroup(txGroup);
- return true;
}
+ txManagerService.deleteTxGroup(txGroup);
+ return true;
}
diff --git a/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/TxManagerServiceImpl.java b/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/TxManagerServiceImpl.java
index da6e1360f..76700de76 100644
--- a/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/TxManagerServiceImpl.java
+++ b/tx-manager/src/main/java/com/codingapi/tm/manager/service/impl/TxManagerServiceImpl.java
@@ -23,8 +23,6 @@
@Service
public class TxManagerServiceImpl implements TxManagerService {
-
-
@Autowired
private ConfigReader configReader;
@@ -42,12 +40,12 @@ public class TxManagerServiceImpl implements TxManagerService {
@Autowired
private CompensateService compensateService;
-
private Logger logger = LoggerFactory.getLogger(TxManagerServiceImpl.class);
@Override
public TxGroup createTransactionGroup(String groupId) {
+ logger.info("创建事物组");
TxGroup txGroup = new TxGroup();
if (compensateService.getCompensateByGroupId(groupId)!=null) {
txGroup.setIsCompensate(1);
@@ -65,6 +63,8 @@ public TxGroup createTransactionGroup(String groupId) {
@Override
public TxGroup addTransactionGroup(String groupId, String taskId, int isGroup, String channelAddress, String methodStr) {
+
+ logger.info("添加事务组子对象...");
String key = getTxGroupKey(groupId);
TxGroup txGroup = getTxGroup(groupId);
if (txGroup==null) {
@@ -77,7 +77,6 @@ public TxGroup addTransactionGroup(String groupId, String taskId, int isGroup, S
txInfo.setIsGroup(isGroup);
txInfo.setMethodStr(methodStr);
-
ModelInfo modelInfo = ModelInfoManager.getInstance().getModelByChannelName(channelAddress);
if(modelInfo!=null) {
txInfo.setUniqueKey(modelInfo.getUniqueKey());
@@ -94,6 +93,7 @@ public TxGroup addTransactionGroup(String groupId, String taskId, int isGroup, S
@Override
public boolean rollbackTransactionGroup(String groupId) {
+ logger.info("设置强制回滚事务...");
String key = getTxGroupKey(groupId);
TxGroup txGroup = getTxGroup(groupId);
if (txGroup==null) {
@@ -106,6 +106,7 @@ public boolean rollbackTransactionGroup(String groupId) {
@Override
public int cleanNotifyTransaction(String groupId, String taskId) {
+ logger.info("检查事务组数据...");
int res = 0;
logger.info("start-cleanNotifyTransaction->groupId:"+groupId+",taskId:"+taskId);
String key = getTxGroupKey(groupId);
@@ -169,6 +170,7 @@ public int cleanNotifyTransaction(String groupId, String taskId) {
@Override
public int closeTransactionGroup(String groupId,int state) {
+ logger.info("关闭事务组");
String key = getTxGroupKey(groupId);
TxGroup txGroup = getTxGroup(groupId);
if(txGroup==null){
diff --git a/tx-manager/src/main/java/com/codingapi/tm/redis/JedisClusterConfig.java b/tx-manager/src/main/java/com/codingapi/tm/redis/JedisClusterConfig.java
deleted file mode 100644
index 6f7112431..000000000
--- a/tx-manager/src/main/java/com/codingapi/tm/redis/JedisClusterConfig.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package com.codingapi.tm.redis;
-
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.core.env.MapPropertySource;
-import org.springframework.data.redis.connection.RedisClusterConfiguration;
-import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
-import org.springframework.data.redis.core.RedisTemplate;
-import redis.clients.jedis.HostAndPort;
-import redis.clients.jedis.JedisCluster;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Created by lorne on 2017/10/31.
- */
-@ConditionalOnClass({JedisCluster.class})
-@EnableConfigurationProperties(RedisProperties.class)
-public class JedisClusterConfig {
-
- @Autowired
- private RedisProperties redisProperties;
-
- @Bean
- public JedisCluster jedisClusterFactory() {
- String[] serverArray = redisProperties.getNodes().split(",");
- Set nodes = new HashSet();
- for (String ipPort: serverArray) {
- String[] ipPortPair = ipPort.split(":");
- nodes.add(new HostAndPort(ipPortPair[0].trim(),Integer.valueOf(ipPortPair[1].trim())));
- }
- return new JedisCluster(nodes, redisProperties.getCommandTimeout());
- }
-
- @Bean
- public RedisTemplate redisTemplateFactory(){
- RedisTemplate redisTemplate =new RedisTemplate();
- redisTemplate.setConnectionFactory(jedisConnectionFactory());
-
- //指定具体序列化方式 不过这种方式不是很好,一个系统中可能对应值的类型不一样,如果全部使用StringRedisSerializer 序列化
- //会照成其他类型报错,所以还是推荐使用第一种,直接指定泛型的类型,spring 会根据指定类型序列化。
-// redisTemplate.setKeySerializer( new StringRedisSerializer());
-// redisTemplate.setValueSerializer(new StringRedisSerializer());
-// redisTemplate.setHashKeySerializer(new StringRedisSerializer());
-// redisTemplate.setHashValueSerializer(new StringRedisSerializer());
- return redisTemplate;
- }
-
-
- /**
- * redisCluster配置
- * @return
- */
- @Bean
- public RedisClusterConfiguration redisClusterConfiguration() {
- Map source = new HashMap();
- source.put("spring.redis.cluster.nodes", redisProperties.getNodes());
- source.put("spring.redis.cluster.timeout", redisProperties.getCommandTimeout());
- return new RedisClusterConfiguration(new MapPropertySource("RedisClusterConfiguration", source));
- }
-
-
- /**
- * 其实在JedisConnectionFactory的afterPropertiesSet()方法 中
- * if(cluster !=null) this.cluster =createCluster();
- * 也就是当
- * spring.redis.cluster.nodes 配置好的情况下,就可以实例化 JedisCluster.
- * 也就是说,我们使用JedisCluster 的方式只需要在application.properties 配置文件中
- *
- * #redis cluster
- * spring.redis.cluster.nodes=127.0.0.1:7000,127.0.0.1:7001,127.0.0.1:7002
- *
- * RedisTemplate.afterPropertiesSet() 中查看到最终方法中使用了JedisCluster 对象。
- * 也就是说 redisTemplate依赖jedis ,内部操作的就是jedis,同理内部也操作jedisCluster.
- *
- *
- * @return
- */
- @Bean
- public JedisConnectionFactory jedisConnectionFactory() {
- return new JedisConnectionFactory(redisClusterConfiguration());
- }
-}
\ No newline at end of file
diff --git a/tx-manager/src/main/java/com/codingapi/tm/redis/RedisConfig.java b/tx-manager/src/main/java/com/codingapi/tm/redis/RedisConfig.java
deleted file mode 100644
index 81ceae8f6..000000000
--- a/tx-manager/src/main/java/com/codingapi/tm/redis/RedisConfig.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.codingapi.tm.redis;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.data.redis.core.StringRedisTemplate;
-import redis.clients.jedis.JedisPoolConfig;
-
-/**
- * Created by lorne on 2017/7/5.
- */
-
-@EnableAutoConfiguration
-public class RedisConfig {
-
- private static Logger logger = LoggerFactory.getLogger(RedisConfig.class);
-
- @Bean
- @ConfigurationProperties(prefix = "spring.redis")
- public JedisPoolConfig getRedisConfig() {
- JedisPoolConfig config = new JedisPoolConfig();
- return config;
- }
-
- @Bean
- @ConfigurationProperties(prefix = "spring.redis")
- public JedisConnectionFactory getConnectionFactory() {
- JedisConnectionFactory factory = new JedisConnectionFactory();
- JedisPoolConfig config = getRedisConfig();
- factory.setPoolConfig(config);
- logger.info("JedisConnectionFactory bean init success.");
- return factory;
- }
-
-
- @Bean
- public RedisTemplate, ?> getRedisTemplate() {
- return new StringRedisTemplate(getConnectionFactory());
- }
-}
diff --git a/tx-manager/src/main/java/com/codingapi/tm/redis/RedisProperties.java b/tx-manager/src/main/java/com/codingapi/tm/redis/RedisProperties.java
deleted file mode 100644
index bd1815c95..000000000
--- a/tx-manager/src/main/java/com/codingapi/tm/redis/RedisProperties.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.codingapi.tm.redis;
-
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.stereotype.Component;
-
-/**
- * Created by lorne on 2017/10/31.
- */
-
-@Component
-@ConfigurationProperties(prefix = "spring.redis.cluster")
-public class RedisProperties {
-
-
- private String nodes;
-
- private Integer commandTimeout;
-
- public String getNodes() {
- return nodes;
- }
-
- public void setNodes(String nodes) {
- this.nodes = nodes;
- }
-
- public Integer getCommandTimeout() {
- return commandTimeout;
- }
-
- public void setCommandTimeout(Integer commandTimeout) {
- this.commandTimeout = commandTimeout;
- }
-}
diff --git a/tx-manager/src/main/java/com/codingapi/tm/redis/configuration/RedisTemplateConfig.java b/tx-manager/src/main/java/com/codingapi/tm/redis/configuration/RedisTemplateConfig.java
new file mode 100644
index 000000000..e1322625f
--- /dev/null
+++ b/tx-manager/src/main/java/com/codingapi/tm/redis/configuration/RedisTemplateConfig.java
@@ -0,0 +1,52 @@
+package com.codingapi.tm.redis.configuration;
+
+import com.alibaba.fastjson.parser.ParserConfig;
+import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author yizhishhang
+ * @description 使用一个Transfer类间接注入RedisConnectionFactory
+ * Created on 2018/4/18 0018 10:21
+ */
+@Component
+public class RedisTemplateConfig
+{
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Bean
+ public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory)
+ {
+ logger.info("redis...初始化");
+
+ RedisTemplate redisTemplate = new RedisTemplate<>();
+ redisTemplate.setConnectionFactory(redisConnectionFactory);
+
+ FastJsonRedisSerializer