Browse Source

代码优化

Woody 1 month ago
parent
commit
3d603a5847
16 changed files with 109 additions and 36 deletions
  1. 6 6
      framework-base/src/main/java/com/chelvc/framework/base/context/SessionContextHolder.java
  2. 2 2
      framework-base/src/main/java/com/chelvc/framework/base/context/ThreadContextHolder.java
  3. 58 0
      framework-common/src/main/java/com/chelvc/framework/common/util/NumberUtils.java
  4. 1 1
      framework-database/src/main/java/com/chelvc/framework/database/interceptor/CustomizeMybatisPlusInterceptor.java
  5. 3 4
      framework-database/src/main/java/com/chelvc/framework/database/interceptor/DynamicInvokeInterceptor.java
  6. 29 13
      framework-database/src/main/java/com/chelvc/framework/database/interceptor/Tables.java
  7. 1 1
      framework-dubbo/src/main/java/com/chelvc/framework/dubbo/interceptor/DubboProviderInterceptor.java
  8. 1 1
      framework-kafka/src/main/java/com/chelvc/framework/kafka/context/KafkaContextHolder.java
  9. 1 1
      framework-kafka/src/main/java/com/chelvc/framework/kafka/fallback/KafkaMemorySender.java
  10. 1 1
      framework-kafka/src/main/java/com/chelvc/framework/kafka/fallback/KafkaPersistentSender.java
  11. 1 1
      framework-kafka/src/main/java/com/chelvc/framework/kafka/interceptor/KafkaSessionInterceptor.java
  12. 1 1
      framework-redis/src/main/java/com/chelvc/framework/redis/context/RedisStreamHolder.java
  13. 1 1
      framework-rocketmq/src/main/java/com/chelvc/framework/rocketmq/consumer/RocketMQListener.java
  14. 1 1
      framework-rocketmq/src/main/java/com/chelvc/framework/rocketmq/context/RocketMQContextHolder.java
  15. 1 1
      framework-rocketmq/src/main/java/com/chelvc/framework/rocketmq/fallback/RocketMQMemoryProducer.java
  16. 1 1
      framework-rocketmq/src/main/java/com/chelvc/framework/rocketmq/fallback/RocketMQPersistentProducer.java

+ 6 - 6
framework-base/src/main/java/com/chelvc/framework/base/context/SessionContextHolder.java

@@ -630,12 +630,12 @@ public class SessionContextHolder implements ServletRequestListener {
     }
 
     /**
-     * 清空上下文信息
+     * 移除上下文会话信息
      */
-    public static void clearSessionContext() {
-        Deque<Session> sessions = SESSION_CONTEXT.get();
-        sessions.poll();
-        if (sessions.isEmpty()) {
+    public static void removeSessionContext() {
+        Deque<Session> deque = SESSION_CONTEXT.get();
+        deque.poll();
+        if (deque.isEmpty()) {
             SESSION_CONTEXT.remove();
         }
     }
@@ -647,6 +647,6 @@ public class SessionContextHolder implements ServletRequestListener {
 
     @Override
     public void requestDestroyed(ServletRequestEvent event) {
-        clearSessionContext();
+        removeSessionContext();
     }
 }

+ 2 - 2
framework-base/src/main/java/com/chelvc/framework/base/context/ThreadContextHolder.java

@@ -105,7 +105,7 @@ public final class ThreadContextHolder {
             } catch (Exception e) {
                 log.error(e.getMessage(), e);
             } finally {
-                SessionContextHolder.clearSessionContext();
+                SessionContextHolder.removeSessionContext();
             }
         }, executor);
     }
@@ -138,7 +138,7 @@ public final class ThreadContextHolder {
             } catch (Exception e) {
                 log.error(e.getMessage(), e);
             } finally {
-                SessionContextHolder.clearSessionContext();
+                SessionContextHolder.removeSessionContext();
             }
             return null;
         }, executor);

+ 58 - 0
framework-common/src/main/java/com/chelvc/framework/common/util/NumberUtils.java

@@ -18,6 +18,17 @@ public final class NumberUtils {
      */
     public static final int DEFAULT_DECIMAL_SCALE = 8;
 
+    /**
+     * 数字缩/放字符数组
+     */
+    private static final char[] REDUCE_ENLARGE_CHARS = {
+            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
+            'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+            'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
+    };
+
     /**
      * 默认小数四舍五入模式
      */
@@ -350,4 +361,51 @@ public final class NumberUtils {
         }
         return decimal.toPlainString();
     }
+
+    /**
+     * 将数字缩小为字符串
+     *
+     * @param number 数字
+     * @return 字符串
+     */
+    public static String reduce(long number) {
+        if (number < 0) {
+            number = ((long) 2 * 0x7fffffff) + number + 2;
+        }
+        int size = 32, pos = size;
+        int seed = REDUCE_ENLARGE_CHARS.length;
+        char[] buffer = new char[size];
+        while ((number / seed) > 0) {
+            buffer[--pos] = REDUCE_ENLARGE_CHARS[(int) (number % seed)];
+            number /= seed;
+        }
+        buffer[--pos] = REDUCE_ENLARGE_CHARS[(int) (number % seed)];
+        return new String(buffer, pos, (size - pos));
+    }
+
+    /**
+     * 将字符串放大为数字
+     *
+     * @param reduce 数字缩小字符串
+     * @return 数字
+     */
+    public static long enlarge(String reduce) {
+        if (StringUtils.isEmpty(reduce)) {
+            return 0;
+        }
+
+        long number = 0, base = 1;
+        char[] chars = reduce.toCharArray();
+        for (int i = chars.length - 1; i >= 0; i--) {
+            int index = 0;
+            for (int j = 0, length = REDUCE_ENLARGE_CHARS.length; j < length; j++) {
+                if (REDUCE_ENLARGE_CHARS[j] == chars[i]) {
+                    index = j;
+                }
+            }
+            number += index * base;
+            base *= REDUCE_ENLARGE_CHARS.length;
+        }
+        return number;
+    }
 }

+ 1 - 1
framework-database/src/main/java/com/chelvc/framework/database/interceptor/CustomizeMybatisPlusInterceptor.java

@@ -67,7 +67,7 @@ public abstract class CustomizeMybatisPlusInterceptor extends MybatisPlusInterce
             try {
                 return super.intercept(invocation);
             } finally {
-                Tables.setContext(null);
+                Tables.removeContext();
             }
         }
         return super.intercept(invocation);

+ 3 - 4
framework-database/src/main/java/com/chelvc/framework/database/interceptor/DynamicInvokeInterceptor.java

@@ -13,7 +13,6 @@ import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
 import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.chelvc.framework.common.util.ObjectUtils;
-import com.chelvc.framework.common.util.StringUtils;
 import com.chelvc.framework.database.config.DatabaseProperties;
 import com.chelvc.framework.database.context.DatabaseContextHolder;
 import com.chelvc.framework.database.entity.Creatable;
@@ -1057,9 +1056,9 @@ public class DynamicInvokeInterceptor implements Interceptor {
                 }
 
                 String unquote = SQLUtils.unquote(table.getName());
-                String schema = ObjectUtils.ifNull(Tables.getContext(), Tables.Context::getSchema);
-                String key = StringUtils.isEmpty(schema) ? unquote : (schema + StringPool.DOT + unquote);
-                Map<String, ItemsList> expressions = ObjectUtils.ifNull(providers.get(key), p -> p.get(tb));
+                String schema = Objects.requireNonNull(Tables.getContext()).getSchema();
+                Expressions.Provider provider = providers.get(schema + StringPool.DOT + unquote);
+                Map<String, ItemsList> expressions = ObjectUtils.ifNull(provider, p -> p.get(tb));
                 if (ObjectUtils.isEmpty(expressions)) {
                     return false;
                 }

+ 29 - 13
framework-database/src/main/java/com/chelvc/framework/database/interceptor/Tables.java

@@ -1,7 +1,9 @@
 package com.chelvc.framework.database.interceptor;
 
 import java.io.Serializable;
+import java.util.ArrayDeque;
 import java.util.Collections;
+import java.util.Deque;
 import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -28,9 +30,9 @@ import org.apache.ibatis.type.UnknownTypeHandler;
  */
 final class Tables {
     /**
-     * 执行上下文
+     * 上下文
      */
-    private static final ThreadLocal<Context> CONTEXT = new ThreadLocal<>();
+    private static final ThreadLocal<Deque<Context>> CONTEXT = ThreadLocal.withInitial(ArrayDeque::new);
 
     /**
      * 表名称/对象映射表
@@ -64,6 +66,15 @@ final class Tables {
             this.id = id;
             this.schema = schema;
         }
+
+        /**
+         * 获取命名空间
+         *
+         * @return 命名空间
+         */
+        public String getNamespace() {
+            return this.id.substring(0, this.id.lastIndexOf('.'));
+        }
     }
 
     /**
@@ -187,7 +198,7 @@ final class Tables {
      * @return 上下文实例
      */
     public static Context getContext() {
-        return CONTEXT.get();
+        return CONTEXT.get().peek();
     }
 
     /**
@@ -196,10 +207,17 @@ final class Tables {
      * @param context 上下文实例
      */
     public static void setContext(Context context) {
-        if (context == null) {
+        CONTEXT.get().push(context);
+    }
+
+    /**
+     * 移除上下文
+     */
+    public static void removeContext() {
+        Deque<Context> deque = CONTEXT.get();
+        deque.poll();
+        if (deque.isEmpty()) {
             CONTEXT.remove();
-        } else {
-            CONTEXT.set(context);
         }
     }
 
@@ -224,19 +242,17 @@ final class Tables {
      * @return 表信息
      */
     public static Table getTable(@NonNull String name) {
-        Context context = getContext();
         String unquote = SQLUtils.unquote(name);
-        String schema = ObjectUtils.ifNull(context, Context::getSchema);
-        String key = StringUtils.isEmpty(schema) ? unquote : (schema + StringPool.DOT + unquote);
+        Context context = Objects.requireNonNull(getContext());
+        String key = context.getSchema() + StringPool.DOT + unquote;
         Table table = TABLE_NAME_MAPPING.get(key);
         if (table == null) {
             table = TABLE_NAME_MAPPING.computeIfAbsent(key, k -> {
                 boolean quoted = SQLUtils.isQuoted(name);
-                String id = ObjectUtils.ifNull(context, Context::getId);
-                String namespace = StringUtils.isEmpty(id) ? null : id.substring(0, id.lastIndexOf('.'));
+                String namespace = context.getNamespace();
                 for (TableInfo info : TableInfoHelper.getTableInfos()) {
-                    String s = info.getCurrentNamespace(), n = getSimpleName(info.getTableName());
-                    if ((Objects.equals(s, namespace) || StringUtils.isEmpty(namespace))
+                    String n = getSimpleName(info.getTableName());
+                    if (Objects.equals(info.getCurrentNamespace(), namespace)
                             && (Objects.equals(n, name) || (quoted && Objects.equals(n, unquote)))) {
                         return new Table(info);
                     }

+ 1 - 1
framework-dubbo/src/main/java/com/chelvc/framework/dubbo/interceptor/DubboProviderInterceptor.java

@@ -54,7 +54,7 @@ public class DubboProviderInterceptor implements Filter {
         try {
             return this.processing(invoker, invocation);
         } finally {
-            SessionContextHolder.clearSessionContext();
+            SessionContextHolder.removeSessionContext();
         }
     }
 }

+ 1 - 1
framework-kafka/src/main/java/com/chelvc/framework/kafka/context/KafkaContextHolder.java

@@ -142,7 +142,7 @@ public final class KafkaContextHolder {
         try {
             consumer.accept(payload);
         } finally {
-            SessionContextHolder.clearSessionContext();
+            SessionContextHolder.removeSessionContext();
         }
     }
 

+ 1 - 1
framework-kafka/src/main/java/com/chelvc/framework/kafka/fallback/KafkaMemorySender.java

@@ -55,7 +55,7 @@ public class KafkaMemorySender<K, V> extends KafkaFallbackSender<K, V> {
             } catch (Exception e) {
                 log.error("Kafka message send failed: {}", message.topic(), e);
             } finally {
-                SessionContextHolder.clearSessionContext();
+                SessionContextHolder.removeSessionContext();
             }
             ThreadUtils.sleep(5000);
             return false;

+ 1 - 1
framework-kafka/src/main/java/com/chelvc/framework/kafka/fallback/KafkaPersistentSender.java

@@ -39,7 +39,7 @@ public class KafkaPersistentSender<K, V> extends KafkaFallbackSender<K, V> {
             try {
                 this.client.save(fallback);
             } finally {
-                SessionContextHolder.clearSessionContext();
+                SessionContextHolder.removeSessionContext();
             }
         } else {
             this.client.save(fallback);

+ 1 - 1
framework-kafka/src/main/java/com/chelvc/framework/kafka/interceptor/KafkaSessionInterceptor.java

@@ -53,6 +53,6 @@ public class KafkaSessionInterceptor implements ProducerInterceptor<Object, Obje
     @Override
     public void afterRecord(ConsumerRecord<Object, Object> record, Consumer<Object, Object> consumer) {
         // 清空当前会话
-        SessionContextHolder.clearSessionContext();
+        SessionContextHolder.removeSessionContext();
     }
 }

+ 1 - 1
framework-redis/src/main/java/com/chelvc/framework/redis/context/RedisStreamHolder.java

@@ -372,7 +372,7 @@ public final class RedisStreamHolder {
         try {
             consumer.accept(payload);
         } finally {
-            SessionContextHolder.clearSessionContext();
+            SessionContextHolder.removeSessionContext();
         }
     }
 

+ 1 - 1
framework-rocketmq/src/main/java/com/chelvc/framework/rocketmq/consumer/RocketMQListener.java

@@ -36,7 +36,7 @@ public interface RocketMQListener<T> {
                 try {
                     this.consume(message.getLeft());
                 } finally {
-                    SessionContextHolder.clearSessionContext();
+                    SessionContextHolder.removeSessionContext();
                 }
             });
         }

+ 1 - 1
framework-rocketmq/src/main/java/com/chelvc/framework/rocketmq/context/RocketMQContextHolder.java

@@ -230,7 +230,7 @@ public final class RocketMQContextHolder {
         try {
             return function.apply(message);
         } finally {
-            SessionContextHolder.clearSessionContext();
+            SessionContextHolder.removeSessionContext();
         }
     }
 

+ 1 - 1
framework-rocketmq/src/main/java/com/chelvc/framework/rocketmq/fallback/RocketMQMemoryProducer.java

@@ -62,7 +62,7 @@ public class RocketMQMemoryProducer extends RocketMQFallbackProducer {
             } catch (Exception e) {
                 log.error("RocketMQ message send failed: {}", RocketMQContextHolder.topic(message), e);
             } finally {
-                SessionContextHolder.clearSessionContext();
+                SessionContextHolder.removeSessionContext();
             }
             ThreadUtils.sleep(5000);
             return false;

+ 1 - 1
framework-rocketmq/src/main/java/com/chelvc/framework/rocketmq/fallback/RocketMQPersistentProducer.java

@@ -63,7 +63,7 @@ public class RocketMQPersistentProducer extends RocketMQFallbackProducer {
             try {
                 this.save(message, transaction);
             } finally {
-                SessionContextHolder.clearSessionContext();
+                SessionContextHolder.removeSessionContext();
             }
         } else {
             this.save(message, transaction);