From b58df982bda78124dd785f595a5519cb88b7d3a9 Mon Sep 17 00:00:00 2001
From: java110 <928255095@qq.com>
Date: 星期一, 06 七月 2020 00:09:02 +0800
Subject: [PATCH] 事务问题优化

---
 java110-core/src/main/java/com/java110/core/factory/Java110TransactionalFactory.java |  125 ++++++++++++++++++++++++++++++++++++++---
 1 files changed, 115 insertions(+), 10 deletions(-)

diff --git a/java110-core/src/main/java/com/java110/core/factory/Java110TransactionalFactory.java b/java110-core/src/main/java/com/java110/core/factory/Java110TransactionalFactory.java
index 3924d01..d49dcc9 100644
--- a/java110-core/src/main/java/com/java110/core/factory/Java110TransactionalFactory.java
+++ b/java110-core/src/main/java/com/java110/core/factory/Java110TransactionalFactory.java
@@ -1,6 +1,20 @@
 package com.java110.core.factory;
 
+import com.alibaba.fastjson.JSONObject;
+import com.java110.dto.order.OrderDto;
+import com.java110.utils.constant.ServiceConstant;
+import com.java110.utils.factory.ApplicationContextFactory;
 import com.java110.utils.util.StringUtil;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.HttpStatusCodeException;
+import org.springframework.web.client.RestTemplate;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -15,11 +29,27 @@
  **/
 public class Java110TransactionalFactory {
 
+    private static Logger logger = LoggerFactory.getLogger(Java110TransactionalFactory.class);
+
+    //璁㈠崟鏈嶅姟
+    private static final String URL_API = ServiceConstant.SERVICE_ORDER_URL + "/order/oIdApi";
+
+    /**
+     * 鍒涘缓浜嬪姟ID
+     */
+    private static final String CREATE_O_ID = URL_API + "/createOId";
+
+    /**
+     * 鍥為��浜嬪姟ID
+     */
+    private static final String FALLBACK_O_ID = URL_API + "/fallBackOId";
+
+
     //鍏ㄥ眬浜嬪姟ID
-    public static final String T_ID = "t-id";
+    public static final String O_ID = "O-ID";
 
     //褰撳墠鏈嶅姟ID
-    public static final String SERVICE_ID = "service-id";
+    public static final String SERVICE_ID = "SERVICE-ID";
 
     private static ThreadLocal<Map<String, String>> threadLocal = new ThreadLocal<Map<String, String>>() {
         @Override
@@ -44,17 +74,92 @@
         return threadLocal.get();
     }
 
-    public static String getOrCreateTId(){
-        String tId = get(T_ID);
-
-        if(StringUtil.isEmpty(tId)){
-
+    public static String getOrCreateOId(OrderDto orderDto) {
+        //鍏ㄥ眬浜嬪姟寮�鍚��
+        if (StringUtils.isEmpty(orderDto.getoId())) {
+            createOId(orderDto);
         }
-        return "";
+        String oId = get(O_ID);
+        return oId;
     }
 
-    private void createTId(){
-
+    /**
+     * 鑾峰彇浜嬪姟ID
+     *
+     * @return
+     */
+    public static String getOId() {
+        String oId = get(O_ID);
+        return oId;
     }
 
+    /**
+     * 鍒涘缓浜嬪姟
+     *
+     * @param orderDto
+     */
+    private static void createOId(OrderDto orderDto) {
+        RestTemplate restTemplate = ApplicationContextFactory.getBean("restTemplate", RestTemplate.class);
+        HttpHeaders header = new HttpHeaders();
+        HttpEntity<String> httpEntity = new HttpEntity<String>(JSONObject.toJSONString(orderDto), header);
+        ResponseEntity<String> responseEntity = null;
+        try {
+            responseEntity = restTemplate.exchange(CREATE_O_ID, HttpMethod.POST, httpEntity, String.class);
+        } catch (HttpStatusCodeException e) { //杩欓噷spring 妗嗘灦 鍦�4XX 鎴� 5XX 鏃舵姏鍑� HttpServerErrorException 寮傚父锛岄渶瑕侀噸鏂板皝瑁呬竴涓�
+            responseEntity = new ResponseEntity<String>(e.getResponseBodyAsString(), e.getStatusCode());
+        } catch (Exception e) {
+            responseEntity = new ResponseEntity<String>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
+        } finally {
+            logger.debug("璇锋眰鍦板潃涓�,{} 璇锋眰璁㈠崟鏈嶅姟淇℃伅锛寋},璁㈠崟鏈嶅姟杩斿洖淇℃伅锛寋}", CREATE_O_ID, httpEntity, responseEntity);
+        }
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            throw new IllegalArgumentException("鍒涘缓浜嬪姟澶辫触" + responseEntity.getBody());
+        }
+        JSONObject order = JSONObject.parseObject(responseEntity.getBody());
+
+        if (!order.containsKey("oId") || StringUtils.isEmpty(order.getString("oId"))) {
+            throw new IllegalArgumentException("鍒涘缓浜嬪姟澶辫触" + responseEntity.getBody());
+        }
+        orderDto.setoId(order.getString("oId"));
+        //灏嗕簨鍔D 瀛樻斁璧锋潵
+        put(O_ID, orderDto.getoId());
+    }
+
+    /**
+     * 澶勭悊澶辫触锛屽洖閫�浜嬪姟
+     */
+    public static void fallbackOId() {
+        String oId = getOId();
+        if (StringUtil.isEmpty(oId)) {
+            //褰撳墠娌℃湁寮�鍚簨鍔℃棤闇�鍥為��
+            logger.debug("褰撳墠娌℃湁寮�鍚簨鍔℃棤闇�鍥為��");
+            return;
+        }
+        OrderDto orderDto = new OrderDto();
+        orderDto.setoId(oId);
+        RestTemplate restTemplate = ApplicationContextFactory.getBean("restTemplate", RestTemplate.class);
+        HttpHeaders header = new HttpHeaders();
+        HttpEntity<String> httpEntity = new HttpEntity<String>(JSONObject.toJSONString(orderDto), header);
+        ResponseEntity<String> responseEntity = null;
+        try {
+            responseEntity = restTemplate.exchange(FALLBACK_O_ID, HttpMethod.POST, httpEntity, String.class);
+        } catch (HttpStatusCodeException e) { //杩欓噷spring 妗嗘灦 鍦�4XX 鎴� 5XX 鏃舵姏鍑� HttpServerErrorException 寮傚父锛岄渶瑕侀噸鏂板皝瑁呬竴涓�
+            responseEntity = new ResponseEntity<String>(e.getResponseBodyAsString(), e.getStatusCode());
+        } catch (Exception e) {
+            responseEntity = new ResponseEntity<String>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
+        } finally {
+            logger.debug("鍥為��浜嬪姟 璇锋眰鍦板潃涓�,{} 璇锋眰璁㈠崟鏈嶅姟淇℃伅锛寋},璁㈠崟鏈嶅姟杩斿洖淇℃伅锛寋}", FALLBACK_O_ID, httpEntity, responseEntity);
+        }
+
+        if (responseEntity.getStatusCode() == HttpStatus.NOT_FOUND) {
+            //褰撳墠娌℃湁寮�鍚簨鍔℃棤闇�鍥為��
+            logger.debug("褰撳墠娌℃湁寮�鍚簨鍔℃棤闇�鍥為��");
+            return;
+        }
+
+        if (responseEntity.getStatusCode() == HttpStatus.BAD_REQUEST) {
+            throw new IllegalArgumentException("鍥為��浜嬪姟澶辫触" + responseEntity.getBody());
+        }
+
+    }
 }

--
Gitblit v1.8.0