diff --git a/README.md b/README.md index cf01bd66..406e0d61 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ CCFlow 驰聘低代码-流程-表单 - https://gitee.com/opencc/RuoYi-JFlow
| 数据脱敏 | 采用 注解 + jackson 序列化期间脱敏 支持不同模块不同的脱敏条件
支持多种策略 如身份证、手机号、地址、邮箱、银行卡等 可自行扩展 | 无 | | 数据加解密 | 采用 注解 + mybatis 拦截器 对存取数据期间自动加解密
支持多种策略 如BASE64、AES、RSA、SM2、SM4等 | 无 | | 数据翻译 | 采用 注解 + jackson 序列化期间动态修改数据 数据进行翻译
支持多种模式: `映射翻译` `直接翻译` `其他扩展条件翻译` 接口化两步即可完成自定义扩展 内置多种翻译实现 | 无 | -| 多数据源框架 | 采用 dynamic-datasource 支持世面大部分数据库
通过yml配置即可动态管理异构不同种类的数据库 也可通过前端页面添加数据源
支持spel表达式从请求头参数等条件切换数据源 | 基于 druid 手动编写代码配置数据源 配置繁琐 支持性差 | +| 多数据源框架 | 采用 dynamic-datasource 支持市面大部分数据库
通过yml配置即可动态管理异构不同种类的数据库 也可通过前端页面添加数据源
支持spel表达式从请求头参数等条件切换数据源 | 基于 druid 手动编写代码配置数据源 配置繁琐 支持性差 | | 多数据源事务 | 采用 dynamic-datasource 支持多数据源不同种类的数据库事务回滚 | 不支持 | | 数据库连接池 | 采用 HikariCP Spring官方内置连接池 配置简单 以性能与稳定性闻名天下 | 采用 druid bug众多 社区维护差 活跃度低 配置众多繁琐性能一般 | | 数据库主键 | 采用 雪花ID 基于时间戳的 有序增长 唯一ID 再也不用为分库分表 数据合并主键冲突重复而发愁 | 采用 数据库自增ID 支持数据量有限 不支持多数据源主键唯一 | diff --git a/config/nacos/application-common.yml b/config/nacos/application-common.yml index 29cd9b3f..8249270b 100644 --- a/config/nacos/application-common.yml +++ b/config/nacos/application-common.yml @@ -85,6 +85,16 @@ spring: # 控制台地址 从1.3.0开始使用 server-name 注册 # dashboard: localhost:8718 + bus: + id: ${spring.application.name} + base-packages: org.dromara.**.event + # 消息总线 也可以使用 kafka 参考 spring-cloud-bus 用法 + rabbitmq: + host: localhost + port: 5672 + username: ruoyi + password: ruoyi123 + # redis通用配置 子服务可以自行配置进行覆盖 data: redis: diff --git a/config/nacos/ruoyi-gateway.yml b/config/nacos/ruoyi-gateway.yml index b70b6d58..ba82112a 100644 --- a/config/nacos/ruoyi-gateway.yml +++ b/config/nacos/ruoyi-gateway.yml @@ -5,6 +5,7 @@ security: enabled: true excludeUrls: - /system/notice + - /workflow/model/save - /workflow/model/editModelXml # 不校验白名单 ignore: diff --git a/config/nacos/ruoyi-job.yml b/config/nacos/ruoyi-job.yml index 7fdfc501..1c9298f3 100644 --- a/config/nacos/ruoyi-job.yml +++ b/config/nacos/ruoyi-job.yml @@ -24,6 +24,8 @@ snail-job: server-name: ruoyi-snailjob-server # 服务名优先 ip垫底 host: 127.0.0.1 - port: 1788 + port: 17888 # 详见 script/sql/ry_job.sql `sj_namespace` 表 namespace: ${spring.profiles.active} + # 随主应用端口飘逸 + port: 2${server.port} diff --git a/config/nacos/ruoyi-snailjob-server.yml b/config/nacos/ruoyi-snailjob-server.yml index d8dda8e2..4440fc4f 100644 --- a/config/nacos/ruoyi-snailjob-server.yml +++ b/config/nacos/ruoyi-snailjob-server.yml @@ -21,7 +21,7 @@ snail-job: # 拉取重试数据的每批次的大小 job-pull-page-size: 1000 # 服务端 netty 端口 - netty-port: 1788 + netty-port: 17888 # 重试和死信表的分区总数 total-partition: 2 # 一个客户端每秒最多接收的重试数量指令 diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 7a5eff86..8b2adada 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -173,7 +173,7 @@ services: TZ: Asia/Shanghai ports: - "8800:8800" - - "1788:1788" + - "17888:17888" volumes: - /docker/snailjob/logs/:/ruoyi/snailjob/logs privileged: true @@ -363,19 +363,22 @@ services: - "10909:10909" - "10912:10912" environment: - JAVA_OPT_EXT: -server -Xms512M -Xmx512M -Xmn256m + JAVA_OPT: -server -Xms512M -Xmx512M + NAMESRV_ADDR: 127.0.0.1:9876 + # --enable-proxy 开启broker与proxy共用模式 生产部署建议将proxy单独部署 command: sh mqbroker --enable-proxy -c /home/rocketmq/rocketmq-5.2.0/conf/broker.conf depends_on: - - mqnamesrv + - rmqnamesrv volumes: - /docker/rocketmq/broker1/conf/broker.conf:/home/rocketmq/rocketmq-5.2.0/conf/broker.conf - /docker/rocketmq/broker1/logs:/home/rocketmq/logs/rocketmqlogs - /docker/rocketmq/broker1/store:/home/rocketmq/store + privileged: true network_mode: "host" rmqconsole: - image: styletang/rocketmq-console-ng - container_name: mqconsole + image: apacherocketmq/rocketmq-dashboard:latest + container_name: rmqconsole ports: - "19876:19876" environment: @@ -453,7 +456,7 @@ services: network_mode: "host" sky-oap: - image: apache/skywalking-oap-server:9.3.0 + image: apache/skywalking-oap-server:9.7.0 container_name: sky-oap ports: - "11800:11800" @@ -470,7 +473,7 @@ services: network_mode: "host" sky-ui: - image: apache/skywalking-ui:9.3.0 + image: apache/skywalking-ui:9.7.0 container_name: sky-ui ports: - "18080:18080" diff --git a/docker/nginx/conf/nginx.conf b/docker/nginx/conf/nginx.conf index 176ff729..ed01e597 100644 --- a/docker/nginx/conf/nginx.conf +++ b/docker/nginx/conf/nginx.conf @@ -56,7 +56,7 @@ http { # } # 限制外网访问内网 actuator 相关路径 - location ~ ^(/[^/]*)?/actuator(/.*)?$ { + location ~ ^(/[^/]*)?/actuator.*(/.*)?$ { return 403; } diff --git a/docker/rocketmq/broker1/conf/broker.conf b/docker/rocketmq/broker1/conf/broker.conf index 9d36a61b..39eeff6c 100644 --- a/docker/rocketmq/broker1/conf/broker.conf +++ b/docker/rocketmq/broker1/conf/broker.conf @@ -15,8 +15,6 @@ flushDiskType = ASYNC_FLUSH # 设置broker节点所在服务器的ip地址(**这个非常重要,主从模式下,从节点会根据主节点的brokerIP2来同步数据,如果不配置,主从无法同步,brokerIP1设置为自己外网能访问的ip,服务器双网卡情况下必须配置,比如阿里云这种,主节点需要配置ip1和ip2,从节点只需要配置ip1即可) # 此ip由使用环境决定 本机使用 127 局域网使用 192 外网使用 外网ip brokerIP1 = 192.168.31.165 -#nameServer地址,分号分割 -namesrvAddr = 127.0.0.1:9876 #Broker 对外服务的监听端口, listenPort = 10911 #是否允许Broker自动创建Topic diff --git a/docker/skywalking/agent/LICENSE b/docker/skywalking/agent/LICENSE index c78714d0..a5c6f781 100644 --- a/docker/skywalking/agent/LICENSE +++ b/docker/skywalking/agent/LICENSE @@ -215,12 +215,13 @@ Apache 2.0 licenses The following components are provided under the Apache License. See project link for details. The text of each license is the standard Apache 2.0 license. - raphw (byte-buddy) 1.12.19: http://bytebuddy.net/ , Apache 2.0 - Google: grpc-java 1.50.0: https://github.com/grpc/grpc-java, Apache 2.0 + raphw (byte-buddy) 1.14.9: http://bytebuddy.net/ , Apache 2.0 + Google: grpc-java 1.53.0: https://github.com/grpc/grpc-java, Apache 2.0 Google: gson 2.8.9: https://github.com/google/gson , Apache 2.0 Google: proto-google-common-protos 2.0.1: https://github.com/googleapis/googleapis , Apache 2.0 Google: jsr305 3.0.2: http://central.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.0/jsr305-3.0.0.pom , Apache 2.0 - netty 4.1.86: https://github.com/netty/netty/blob/4.1/LICENSE.txt, Apache 2.0 + Google: guava 32.0.1: https://github.com/google/guava , Apache 2.0 + netty 4.1.100: https://github.com/netty/netty/blob/4.1/LICENSE.txt, Apache 2.0 ======================================================================== BSD licenses diff --git a/docker/skywalking/agent/NOTICE b/docker/skywalking/agent/NOTICE index 673951e2..f95d82a9 100644 --- a/docker/skywalking/agent/NOTICE +++ b/docker/skywalking/agent/NOTICE @@ -1,5 +1,5 @@ Apache SkyWalking -Copyright 2017-2023 The Apache Software Foundation +Copyright 2017-2024 The Apache Software Foundation This product includes software developed at The Apache Software Foundation (http://www.apache.org/). diff --git a/docker/skywalking/agent/activations/apm-toolkit-kafka-activation-8.14.0.jar b/docker/skywalking/agent/activations/apm-toolkit-kafka-activation-9.2.0.jar similarity index 56% rename from docker/skywalking/agent/activations/apm-toolkit-kafka-activation-8.14.0.jar rename to docker/skywalking/agent/activations/apm-toolkit-kafka-activation-9.2.0.jar index 7e0efc8e..4e5913d2 100644 Binary files a/docker/skywalking/agent/activations/apm-toolkit-kafka-activation-8.14.0.jar and b/docker/skywalking/agent/activations/apm-toolkit-kafka-activation-9.2.0.jar differ diff --git a/docker/skywalking/agent/activations/apm-toolkit-logback-1.x-activation-8.14.0.jar b/docker/skywalking/agent/activations/apm-toolkit-logback-1.x-activation-8.14.0.jar deleted file mode 100644 index bc0cbd3f..00000000 Binary files a/docker/skywalking/agent/activations/apm-toolkit-logback-1.x-activation-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/activations/apm-toolkit-logback-1.x-activation-9.2.0.jar b/docker/skywalking/agent/activations/apm-toolkit-logback-1.x-activation-9.2.0.jar new file mode 100644 index 00000000..ac90705b Binary files /dev/null and b/docker/skywalking/agent/activations/apm-toolkit-logback-1.x-activation-9.2.0.jar differ diff --git a/docker/skywalking/agent/activations/apm-toolkit-logging-common-8.14.0.jar b/docker/skywalking/agent/activations/apm-toolkit-logging-common-8.14.0.jar deleted file mode 100644 index 74d34f88..00000000 Binary files a/docker/skywalking/agent/activations/apm-toolkit-logging-common-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/activations/apm-toolkit-logging-common-9.2.0.jar b/docker/skywalking/agent/activations/apm-toolkit-logging-common-9.2.0.jar new file mode 100644 index 00000000..741fcac3 Binary files /dev/null and b/docker/skywalking/agent/activations/apm-toolkit-logging-common-9.2.0.jar differ diff --git a/docker/skywalking/agent/activations/apm-toolkit-meter-activation-8.14.0.jar b/docker/skywalking/agent/activations/apm-toolkit-meter-activation-8.14.0.jar deleted file mode 100644 index 29115f4d..00000000 Binary files a/docker/skywalking/agent/activations/apm-toolkit-meter-activation-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/activations/apm-toolkit-meter-activation-9.2.0.jar b/docker/skywalking/agent/activations/apm-toolkit-meter-activation-9.2.0.jar new file mode 100644 index 00000000..aefab9f9 Binary files /dev/null and b/docker/skywalking/agent/activations/apm-toolkit-meter-activation-9.2.0.jar differ diff --git a/docker/skywalking/agent/activations/apm-toolkit-micrometer-activation-8.14.0.jar b/docker/skywalking/agent/activations/apm-toolkit-micrometer-activation-9.2.0.jar similarity index 65% rename from docker/skywalking/agent/activations/apm-toolkit-micrometer-activation-8.14.0.jar rename to docker/skywalking/agent/activations/apm-toolkit-micrometer-activation-9.2.0.jar index 25970a97..03e02011 100644 Binary files a/docker/skywalking/agent/activations/apm-toolkit-micrometer-activation-8.14.0.jar and b/docker/skywalking/agent/activations/apm-toolkit-micrometer-activation-9.2.0.jar differ diff --git a/docker/skywalking/agent/activations/apm-toolkit-opentracing-activation-8.14.0.jar b/docker/skywalking/agent/activations/apm-toolkit-opentracing-activation-9.2.0.jar similarity index 55% rename from docker/skywalking/agent/activations/apm-toolkit-opentracing-activation-8.14.0.jar rename to docker/skywalking/agent/activations/apm-toolkit-opentracing-activation-9.2.0.jar index c2b5c32e..23bd1304 100644 Binary files a/docker/skywalking/agent/activations/apm-toolkit-opentracing-activation-8.14.0.jar and b/docker/skywalking/agent/activations/apm-toolkit-opentracing-activation-9.2.0.jar differ diff --git a/docker/skywalking/agent/activations/apm-toolkit-trace-activation-8.14.0.jar b/docker/skywalking/agent/activations/apm-toolkit-trace-activation-8.14.0.jar deleted file mode 100644 index 5cef0d54..00000000 Binary files a/docker/skywalking/agent/activations/apm-toolkit-trace-activation-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/activations/apm-toolkit-trace-activation-9.2.0.jar b/docker/skywalking/agent/activations/apm-toolkit-trace-activation-9.2.0.jar new file mode 100644 index 00000000..fb7b7645 Binary files /dev/null and b/docker/skywalking/agent/activations/apm-toolkit-trace-activation-9.2.0.jar differ diff --git a/docker/skywalking/agent/activations/apm-toolkit-webflux-activation-8.14.0.jar b/docker/skywalking/agent/activations/apm-toolkit-webflux-activation-8.14.0.jar deleted file mode 100644 index 0aed4fa9..00000000 Binary files a/docker/skywalking/agent/activations/apm-toolkit-webflux-activation-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/activations/apm-toolkit-webflux-activation-9.2.0.jar b/docker/skywalking/agent/activations/apm-toolkit-webflux-activation-9.2.0.jar new file mode 100644 index 00000000..cf447c5d Binary files /dev/null and b/docker/skywalking/agent/activations/apm-toolkit-webflux-activation-9.2.0.jar differ diff --git a/docker/skywalking/agent/config/agent.config b/docker/skywalking/agent/config/agent.config index f214269a..45b09a35 100644 --- a/docker/skywalking/agent/config/agent.config +++ b/docker/skywalking/agent/config/agent.config @@ -20,6 +20,7 @@ collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800} # ${service name} = [${group name}::]${logic name} # The group name is optional only. agent.service_name=${SW_AGENT_NAME:Your_ApplicationName} +agent.service_name#length=${SW_AGENT_NAME_MAX_LENGTH:50} # The agent namespace agent.namespace=${SW_AGENT_NAMESPACE:} @@ -48,18 +49,10 @@ agent.ignore_suffix=${SW_AGENT_IGNORE_SUFFIX:.jpg,.jpeg,.js,.css,.png,.bmp,.gif, # SkyWalking team may ask for these files in order to resolve compatible problem. agent.is_open_debugging_class=${SW_AGENT_OPEN_DEBUG:false} -# If true, SkyWalking agent will cache all instrumented classes files to memory or disk files (decided by class cache mode), -# allow other javaagent to enhance those classes that enhanced by SkyWalking agent. -agent.is_cache_enhanced_class=${SW_AGENT_CACHE_CLASS:false} - -# The instrumented classes cache mode: MEMORY or FILE -# MEMORY: cache class bytes to memory, if instrumented classes is too many or too large, it may take up more memory -# FILE: cache class bytes in `/class-cache` folder, automatically clean up cached class files when the application exits -agent.class_cache_mode=${SW_AGENT_CLASS_CACHE_MODE:MEMORY} - # Instance name is the identity of an instance, should be unique in the service. If empty, SkyWalking agent will # generate an 32-bit uuid. BY Default, SkyWalking uses UUID@hostname as the instance name. Max length is 50(UTF-8 char) agent.instance_name=${SW_AGENT_INSTANCE_NAME:} +agent.instance_name#length=${SW_AGENT_INSTANCE_NAME_MAX_LENGTH:50} # service instance properties in json format. e.g. agent.instance_properties_json = {"org": "apache-skywalking"} agent.instance_properties_json=${SW_INSTANCE_PROPERTIES_JSON:} @@ -163,8 +156,10 @@ buffer.channel_size=${SW_BUFFER_CHANNEL_SIZE:5} buffer.buffer_size=${SW_BUFFER_BUFFER_SIZE:300} # If true, skywalking agent will enable profile when user create a new profile task. Otherwise disable profile. profile.active=${SW_AGENT_PROFILE_ACTIVE:true} -# Parallel monitor segment count +# Parallel monitor endpoint thread count profile.max_parallel=${SW_AGENT_PROFILE_MAX_PARALLEL:5} +# Max monitoring sub-tasks count of one single endpoint access +profile.max_accept_sub_parallel=${SW_AGENT_PROFILE_MAX_ACCEPT_SUB_PARALLEL:5} # Max monitor segment time(minutes), if current segment monitor time out of limit, then stop it. profile.duration=${SW_AGENT_PROFILE_DURATION:10} # Max dump thread stack depth @@ -246,7 +241,7 @@ plugin.kafka.bootstrap_servers=${SW_KAFKA_BOOTSTRAP_SERVERS:localhost:9092} plugin.kafka.get_topic_timeout=${SW_GET_TOPIC_TIMEOUT:10} # Kafka producer configuration. Read [producer configure](http://kafka.apache.org/24/documentation.html#producerconfigs) # to get more details. Check document for more details and examples. -plugin.kafka.producer_config=${sw_plugin_kafka_producer_config:} +plugin.kafka.producer_config=${SW_PLUGIN_KAFKA_PRODUCER_CONFIG:} # Configure Kafka Producer configuration in JSON format. Notice it will be overridden by plugin.kafka.producer_config[key], if the key duplication. plugin.kafka.producer_config_json=${SW_PLUGIN_KAFKA_PRODUCER_CONFIG_JSON:} # Specify which Kafka topic name for Meter System data to report to. @@ -263,6 +258,8 @@ plugin.kafka.topic_management=${SW_PLUGIN_KAFKA_TOPIC_MANAGEMENT:skywalking-mana plugin.kafka.topic_logging=${SW_PLUGIN_KAFKA_TOPIC_LOGGING:skywalking-logs} # isolate multi OAP server when using same Kafka cluster (final topic name will append namespace before Kafka topics with `-` ). plugin.kafka.namespace=${SW_KAFKA_NAMESPACE:} +# Specify which class to decode encoded configuration of kafka.You can set encoded information in `plugin.kafka.producer_config_json` or `plugin.kafka.producer_config` if you need. +plugin.kafka.decode_class=${SW_KAFKA_DECODE_CLASS:} # Match spring beans with regular expression for the class name. Multiple expressions could be separated by a comma. This only works when `Spring annotation plugin` has been activated. plugin.springannotation.classname_match_regex=${SW_SPRINGANNOTATION_CLASSNAME_MATCH_REGEX:} # Whether or not to transmit logged data as formatted or un-formatted. @@ -271,6 +268,10 @@ plugin.toolkit.log.transmit_formatted=${SW_PLUGIN_TOOLKIT_LOG_TRANSMIT_FORMATTED plugin.lettuce.trace_redis_parameters=${SW_PLUGIN_LETTUCE_TRACE_REDIS_PARAMETERS:false} # If set to positive number and `plugin.lettuce.trace_redis_parameters` is set to `true`, Redis command parameters would be collected and truncated to this length. plugin.lettuce.redis_parameter_max_length=${SW_PLUGIN_LETTUCE_REDIS_PARAMETER_MAX_LENGTH:128} +# Specify which command should be converted to write operation +plugin.lettuce.operation_mapping_write=${SW_PLUGIN_LETTUCE_OPERATION_MAPPING_WRITE:getset,set,setbit,setex,setnx,setrange,strlen,mset,msetnx,psetex,incr,incrby,incrbyfloat,decr,decrby,append,hmset,hset,hsetnx,hincrby,hincrbyfloat,hdel,rpoplpush,rpush,rpushx,lpush,lpushx,lrem,ltrim,lset,brpoplpush,linsert,sadd,sdiff,sdiffstore,sinterstore,sismember,srem,sunion,sunionstore,sinter,zadd,zincrby,zinterstore,zrange,zrangebylex,zrangebyscore,zrank,zrem,zremrangebylex,zremrangebyrank,zremrangebyscore,zrevrange,zrevrangebyscore,zrevrank,zunionstore,xadd,xdel,del,xtrim} +# Specify which command should be converted to read operation +plugin.lettuce.operation_mapping_read=${SW_PLUGIN_LETTUCE_OPERATION_MAPPING_READ:getrange,getbit,mget,hvals,hkeys,hlen,hexists,hget,hgetall,hmget,blpop,brpop,lindex,llen,lpop,lrange,rpop,scard,srandmember,spop,sscan,smove,zlexcount,zscore,zscan,zcard,zcount,xget,get,xread,xlen,xrange,xrevrange} # If set to true, the parameters of the cypher would be collected. plugin.neo4j.trace_cypher_parameters=${SW_PLUGIN_NEO4J_TRACE_CYPHER_PARAMETERS:false} # If set to positive number, the `db.cypher.parameters` would be truncated to this length, otherwise it would be completely saved, which may cause performance problem. @@ -311,3 +312,13 @@ plugin.redisson.redis_parameter_max_length=${SW_PLUGIN_REDISSON_REDIS_PARAMETER_ plugin.redisson.operation_mapping_write=${SW_PLUGIN_REDISSON_OPERATION_MAPPING_WRITE:getset,set,setbit,setex,setnx,setrange,strlen,mset,msetnx,psetex,incr,incrby,incrbyfloat,decr,decrby,append,hmset,hset,hsetnx,hincrby,hincrbyfloat,hdel,rpoplpush,rpush,rpushx,lpush,lpushx,lrem,ltrim,lset,brpoplpush,linsert,sadd,sdiff,sdiffstore,sinterstore,sismember,srem,sunion,sunionstore,sinter,zadd,zincrby,zinterstore,zrange,zrangebylex,zrangebyscore,zrank,zrem,zremrangebylex,zremrangebyrank,zremrangebyscore,zrevrange,zrevrangebyscore,zrevrank,zunionstore,xadd,xdel,del,xtrim} # Specify which command should be converted to read operation plugin.redisson.operation_mapping_read=${SW_PLUGIN_REDISSON_OPERATION_MAPPING_READ:getrange,getbit,mget,hvals,hkeys,hlen,hexists,hget,hgetall,hmget,blpop,brpop,lindex,llen,lpop,lrange,rpop,scard,srandmember,spop,sscan,smove,zlexcount,zscore,zscan,zcard,zcount,xget,get,xread,xlen,xrange,xrevrange} +# This config item controls that whether the Netty-http plugin should collect the http body of the request. +plugin.nettyhttp.collect_request_body=${SW_PLUGIN_NETTYHTTP_COLLECT_REQUEST_BODY:false} +# When `HTTP_COLLECT_REQUEST_BODY` is enabled, how many characters to keep and send to the OAP backend, use negative values to keep and send the complete body. +plugin.nettyhttp.filter_length_limit=${SW_PLUGIN_NETTYHTTP_FILTER_LENGTH_LIMIT:1024} +# When `HTTP_COLLECT_REQUEST_BODY` is enabled and content-type start with HTTP_SUPPORTED_CONTENT_TYPES_PREFIX, collect the body of the request , multiple paths should be separated by `,` +plugin.nettyhttp.supported_content_types_prefix=${SW_PLUGIN_NETTYHTTP_SUPPORTED_CONTENT_TYPES_PREFIX:application/json,text/} +# If set to true, the keys of messages would be collected by the plugin for RocketMQ Java client. +plugin.rocketmqclient.collect_message_keys=${SW_PLUGIN_ROCKETMQCLIENT_COLLECT_MESSAGE_KEYS:false} +# If set to true, the tags of messages would be collected by the plugin for RocketMQ Java client. +plugin.rocketmqclient.collect_message_tags=${SW_PLUGIN_ROCKETMQCLIENT_COLLECT_MESSAGE_TAGS:false} diff --git a/docker/skywalking/agent/plugins/apm-canal-1.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-canal-1.x-plugin-8.14.0.jar deleted file mode 100644 index ba56f4d1..00000000 Binary files a/docker/skywalking/agent/plugins/apm-canal-1.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-canal-1.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-canal-1.x-plugin-9.2.0.jar new file mode 100644 index 00000000..8e2f3b08 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-canal-1.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-customize-enhance-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-customize-enhance-plugin-8.14.0.jar deleted file mode 100644 index 73ac283e..00000000 Binary files a/docker/skywalking/agent/plugins/apm-customize-enhance-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-customize-enhance-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-customize-enhance-plugin-9.2.0.jar new file mode 100644 index 00000000..95fea1f5 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-customize-enhance-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-dubbo-3.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-dubbo-3.x-plugin-9.2.0.jar similarity index 53% rename from docker/skywalking/agent/plugins/apm-dubbo-3.x-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-dubbo-3.x-plugin-9.2.0.jar index ac256818..6decdd1c 100644 Binary files a/docker/skywalking/agent/plugins/apm-dubbo-3.x-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-dubbo-3.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-dubbo-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-dubbo-plugin-9.2.0.jar similarity index 67% rename from docker/skywalking/agent/plugins/apm-dubbo-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-dubbo-plugin-9.2.0.jar index ead98fd2..0690afdf 100644 Binary files a/docker/skywalking/agent/plugins/apm-dubbo-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-dubbo-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-ehcache-2.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-ehcache-2.x-plugin-9.2.0.jar new file mode 100644 index 00000000..7fcc3313 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-ehcache-2.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-elasticsearch-6.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-elasticsearch-6.x-plugin-8.14.0.jar deleted file mode 100644 index 3a4cd21a..00000000 Binary files a/docker/skywalking/agent/plugins/apm-elasticsearch-6.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-elasticsearch-6.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-elasticsearch-6.x-plugin-9.2.0.jar new file mode 100644 index 00000000..5ad7d91c Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-elasticsearch-6.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-elasticsearch-7.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-elasticsearch-7.x-plugin-8.14.0.jar deleted file mode 100644 index 11245eda..00000000 Binary files a/docker/skywalking/agent/plugins/apm-elasticsearch-7.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-elasticsearch-7.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-elasticsearch-7.x-plugin-9.2.0.jar new file mode 100644 index 00000000..a6a8472a Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-elasticsearch-7.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-fastjson-1.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-fastjson-1.x-plugin-9.2.0.jar new file mode 100644 index 00000000..9e374268 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-fastjson-1.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-feign-default-http-9.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-feign-default-http-9.x-plugin-8.14.0.jar deleted file mode 100644 index f42e91f7..00000000 Binary files a/docker/skywalking/agent/plugins/apm-feign-default-http-9.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-feign-default-http-9.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-feign-default-http-9.x-plugin-9.2.0.jar new file mode 100644 index 00000000..dadf4428 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-feign-default-http-9.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-grpc-1.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-grpc-1.x-plugin-8.14.0.jar deleted file mode 100644 index 71d1b3b3..00000000 Binary files a/docker/skywalking/agent/plugins/apm-grpc-1.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-grpc-1.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-grpc-1.x-plugin-9.2.0.jar new file mode 100644 index 00000000..f3ca8e72 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-grpc-1.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-gson-2.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-gson-2.x-plugin-9.2.0.jar new file mode 100644 index 00000000..5a3efc89 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-gson-2.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-guava-cache-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-guava-cache-plugin-9.2.0.jar similarity index 54% rename from docker/skywalking/agent/plugins/apm-guava-cache-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-guava-cache-plugin-9.2.0.jar index 715deb25..f99308c7 100644 Binary files a/docker/skywalking/agent/plugins/apm-guava-cache-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-guava-cache-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-guava-eventbus-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-guava-eventbus-plugin-9.2.0.jar similarity index 53% rename from docker/skywalking/agent/plugins/apm-guava-eventbus-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-guava-eventbus-plugin-9.2.0.jar index ac151f12..46f53cba 100644 Binary files a/docker/skywalking/agent/plugins/apm-guava-eventbus-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-guava-eventbus-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-h2-1.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-h2-1.x-plugin-8.14.0.jar deleted file mode 100644 index 31142055..00000000 Binary files a/docker/skywalking/agent/plugins/apm-h2-1.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-h2-1.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-h2-1.x-plugin-9.2.0.jar new file mode 100644 index 00000000..5fdcff2c Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-h2-1.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-hikaricp-3.x-4.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-hikaricp-3.x-4.x-plugin-8.14.0.jar deleted file mode 100644 index 27f989f7..00000000 Binary files a/docker/skywalking/agent/plugins/apm-hikaricp-3.x-4.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-hikaricp-3.x-4.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-hikaricp-3.x-4.x-plugin-9.2.0.jar new file mode 100644 index 00000000..6ad4a270 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-hikaricp-3.x-4.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-httpClient-4.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-httpClient-4.x-plugin-8.14.0.jar deleted file mode 100644 index 4b31b34b..00000000 Binary files a/docker/skywalking/agent/plugins/apm-httpClient-4.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-httpClient-4.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-httpClient-4.x-plugin-9.2.0.jar new file mode 100644 index 00000000..e69de29b diff --git a/docker/skywalking/agent/plugins/apm-httpasyncclient-4.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-httpasyncclient-4.x-plugin-8.14.0.jar deleted file mode 100644 index 5326cf8d..00000000 Binary files a/docker/skywalking/agent/plugins/apm-httpasyncclient-4.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-httpasyncclient-4.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-httpasyncclient-4.x-plugin-9.2.0.jar new file mode 100644 index 00000000..d2e960d4 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-httpasyncclient-4.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-httpclient-3.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-httpclient-3.x-plugin-8.14.0.jar deleted file mode 100644 index 106698ea..00000000 Binary files a/docker/skywalking/agent/plugins/apm-httpclient-3.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-httpclient-3.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-httpclient-3.x-plugin-9.2.0.jar new file mode 100644 index 00000000..77dbdb23 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-httpclient-3.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-httpclient-5.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-httpclient-5.x-plugin-8.14.0.jar deleted file mode 100644 index 8baec781..00000000 Binary files a/docker/skywalking/agent/plugins/apm-httpclient-5.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-httpclient-5.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-httpclient-5.x-plugin-9.2.0.jar new file mode 100644 index 00000000..2c89b4a2 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-httpclient-5.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-httpclient-commons-8.14.0.jar b/docker/skywalking/agent/plugins/apm-httpclient-commons-9.2.0.jar similarity index 51% rename from docker/skywalking/agent/plugins/apm-httpclient-commons-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-httpclient-commons-9.2.0.jar index 5b6ea35e..bd7fc47d 100644 Binary files a/docker/skywalking/agent/plugins/apm-httpclient-commons-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-httpclient-commons-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-hutool-http-5.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-hutool-http-5.x-plugin-8.14.0.jar deleted file mode 100644 index 723f23db..00000000 Binary files a/docker/skywalking/agent/plugins/apm-hutool-http-5.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-hutool-http-5.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-hutool-http-5.x-plugin-9.2.0.jar new file mode 100644 index 00000000..4e386f9e Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-hutool-http-5.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-hystrix-1.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-hystrix-1.x-plugin-9.2.0.jar new file mode 100644 index 00000000..e4f4f082 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-hystrix-1.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-influxdb-2.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-influxdb-2.x-plugin-8.14.0.jar deleted file mode 100644 index 2b81cbcc..00000000 Binary files a/docker/skywalking/agent/plugins/apm-influxdb-2.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-influxdb-2.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-influxdb-2.x-plugin-9.2.0.jar new file mode 100644 index 00000000..edd45c1b Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-influxdb-2.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-jackson-2.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-jackson-2.x-plugin-9.2.0.jar new file mode 100644 index 00000000..9643e73d Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-jackson-2.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-jdbc-commons-8.14.0.jar b/docker/skywalking/agent/plugins/apm-jdbc-commons-8.14.0.jar deleted file mode 100644 index 7b50f7dc..00000000 Binary files a/docker/skywalking/agent/plugins/apm-jdbc-commons-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-jdbc-commons-9.2.0.jar b/docker/skywalking/agent/plugins/apm-jdbc-commons-9.2.0.jar new file mode 100644 index 00000000..f29e69c8 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-jdbc-commons-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-jdk-forkjoinpool-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-jdk-forkjoinpool-plugin-9.2.0.jar new file mode 100644 index 00000000..6134cb73 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-jdk-forkjoinpool-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-jdk-http-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-jdk-http-plugin-9.2.0.jar similarity index 52% rename from docker/skywalking/agent/plugins/apm-jdk-http-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-jdk-http-plugin-9.2.0.jar index b2cec5e8..35d7264b 100644 Binary files a/docker/skywalking/agent/plugins/apm-jdk-http-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-jdk-http-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-jdk-threading-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-jdk-threading-plugin-9.2.0.jar similarity index 50% rename from docker/skywalking/agent/plugins/apm-jdk-threading-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-jdk-threading-plugin-9.2.0.jar index b85617f0..c9d98aed 100644 Binary files a/docker/skywalking/agent/plugins/apm-jdk-threading-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-jdk-threading-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-jdk-threadpool-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-jdk-threadpool-plugin-8.14.0.jar deleted file mode 100644 index 3694fa30..00000000 Binary files a/docker/skywalking/agent/plugins/apm-jdk-threadpool-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-jdk-threadpool-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-jdk-threadpool-plugin-9.2.0.jar new file mode 100644 index 00000000..48e603ee Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-jdk-threadpool-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-kafka-commons-8.14.0.jar b/docker/skywalking/agent/plugins/apm-kafka-commons-9.2.0.jar similarity index 50% rename from docker/skywalking/agent/plugins/apm-kafka-commons-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-kafka-commons-9.2.0.jar index b9f07425..f4142041 100644 Binary files a/docker/skywalking/agent/plugins/apm-kafka-commons-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-kafka-commons-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-kafka-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-kafka-plugin-9.2.0.jar similarity index 60% rename from docker/skywalking/agent/plugins/apm-kafka-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-kafka-plugin-9.2.0.jar index a4a107f3..63f5d4bb 100644 Binary files a/docker/skywalking/agent/plugins/apm-kafka-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-kafka-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-kotlin-coroutine-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-kotlin-coroutine-plugin-8.14.0.jar deleted file mode 100644 index 705c7cd4..00000000 Binary files a/docker/skywalking/agent/plugins/apm-kotlin-coroutine-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-kotlin-coroutine-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-kotlin-coroutine-plugin-9.2.0.jar new file mode 100644 index 00000000..a9ab20b2 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-kotlin-coroutine-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-kylin-jdbc-2.6.x-3.x-4.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-kylin-jdbc-2.6.x-3.x-4.x-plugin-9.2.0.jar new file mode 100644 index 00000000..3ee08f64 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-kylin-jdbc-2.6.x-3.x-4.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-lettuce-5.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-lettuce-5.x-plugin-9.2.0.jar new file mode 100644 index 00000000..91d662e5 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-lettuce-5.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-mariadb-2.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-mariadb-2.x-plugin-9.2.0.jar similarity index 51% rename from docker/skywalking/agent/plugins/apm-mariadb-2.x-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-mariadb-2.x-plugin-9.2.0.jar index 5bde54f8..ca7947ce 100644 Binary files a/docker/skywalking/agent/plugins/apm-mariadb-2.x-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-mariadb-2.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-mongodb-3.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-mongodb-3.x-plugin-8.14.0.jar deleted file mode 100644 index d2999fe8..00000000 Binary files a/docker/skywalking/agent/plugins/apm-mongodb-3.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-mongodb-3.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-mongodb-3.x-plugin-9.2.0.jar new file mode 100644 index 00000000..1db9b12c Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-mongodb-3.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-mongodb-4.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-mongodb-4.x-plugin-8.14.0.jar deleted file mode 100644 index 747e1f73..00000000 Binary files a/docker/skywalking/agent/plugins/apm-mongodb-4.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-mongodb-4.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-mongodb-4.x-plugin-9.2.0.jar new file mode 100644 index 00000000..13dfd3fd Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-mongodb-4.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-mssql-commons-8.14.0.jar b/docker/skywalking/agent/plugins/apm-mssql-commons-9.2.0.jar similarity index 57% rename from docker/skywalking/agent/plugins/apm-mssql-commons-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-mssql-commons-9.2.0.jar index 3712f091..5704d4d3 100644 Binary files a/docker/skywalking/agent/plugins/apm-mssql-commons-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-mssql-commons-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-mssql-jdbc-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-mssql-jdbc-plugin-9.2.0.jar similarity index 53% rename from docker/skywalking/agent/plugins/apm-mssql-jdbc-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-mssql-jdbc-plugin-9.2.0.jar index d20c1e11..1654c5b4 100644 Binary files a/docker/skywalking/agent/plugins/apm-mssql-jdbc-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-mssql-jdbc-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-mssql-jtds-1.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-mssql-jtds-1.x-plugin-8.14.0.jar deleted file mode 100644 index 36247d5a..00000000 Binary files a/docker/skywalking/agent/plugins/apm-mssql-jtds-1.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-mssql-jtds-1.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-mssql-jtds-1.x-plugin-9.2.0.jar new file mode 100644 index 00000000..546b6d89 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-mssql-jtds-1.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-mybatis-3.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-mybatis-3.x-plugin-9.2.0.jar similarity index 52% rename from docker/skywalking/agent/plugins/apm-mybatis-3.x-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-mybatis-3.x-plugin-9.2.0.jar index b6ec954e..ae584355 100644 Binary files a/docker/skywalking/agent/plugins/apm-mybatis-3.x-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-mybatis-3.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-mysql-5.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-mysql-5.x-plugin-8.14.0.jar deleted file mode 100644 index 4038e269..00000000 Binary files a/docker/skywalking/agent/plugins/apm-mysql-5.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-mysql-5.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-mysql-5.x-plugin-9.2.0.jar new file mode 100644 index 00000000..3a2d1d8d Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-mysql-5.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-mysql-6.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-mysql-6.x-plugin-9.2.0.jar new file mode 100644 index 00000000..f28c207f Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-mysql-6.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-mysql-8.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-mysql-8.x-plugin-8.14.0.jar deleted file mode 100644 index 8e703139..00000000 Binary files a/docker/skywalking/agent/plugins/apm-mysql-8.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-mysql-8.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-mysql-8.x-plugin-9.2.0.jar new file mode 100644 index 00000000..1ae2b758 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-mysql-8.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-mysql-commons-8.14.0.jar b/docker/skywalking/agent/plugins/apm-mysql-commons-9.2.0.jar similarity index 57% rename from docker/skywalking/agent/plugins/apm-mysql-commons-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-mysql-commons-9.2.0.jar index dbe70e97..ea0168cd 100644 Binary files a/docker/skywalking/agent/plugins/apm-mysql-commons-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-mysql-commons-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-nacos-client-2.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-nacos-client-2.x-plugin-9.2.0.jar new file mode 100644 index 00000000..a022b1bb Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-nacos-client-2.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-neo4j-4.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-neo4j-4.x-plugin-9.2.0.jar new file mode 100644 index 00000000..50fde5e9 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-neo4j-4.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-netty-http-4.1.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-netty-http-4.1.x-plugin-9.2.0.jar new file mode 100644 index 00000000..cff0ce03 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-netty-http-4.1.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-netty-socketio-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-netty-socketio-plugin-9.2.0.jar similarity index 54% rename from docker/skywalking/agent/plugins/apm-netty-socketio-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-netty-socketio-plugin-9.2.0.jar index 69ccb85c..0dd96205 100644 Binary files a/docker/skywalking/agent/plugins/apm-netty-socketio-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-netty-socketio-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-okhttp-3.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-okhttp-3.x-plugin-8.14.0.jar deleted file mode 100644 index 2707cb3c..00000000 Binary files a/docker/skywalking/agent/plugins/apm-okhttp-3.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-okhttp-3.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-okhttp-3.x-plugin-9.2.0.jar new file mode 100644 index 00000000..65d98e1a Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-okhttp-3.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-okhttp-4.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-okhttp-4.x-plugin-9.2.0.jar similarity index 54% rename from docker/skywalking/agent/plugins/apm-okhttp-4.x-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-okhttp-4.x-plugin-9.2.0.jar index ecc105b1..4d5bfeaf 100644 Binary files a/docker/skywalking/agent/plugins/apm-okhttp-4.x-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-okhttp-4.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-okhttp-common-8.14.0.jar b/docker/skywalking/agent/plugins/apm-okhttp-common-8.14.0.jar deleted file mode 100644 index c4fb3dda..00000000 Binary files a/docker/skywalking/agent/plugins/apm-okhttp-common-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-okhttp-common-9.2.0.jar b/docker/skywalking/agent/plugins/apm-okhttp-common-9.2.0.jar new file mode 100644 index 00000000..f349835c Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-okhttp-common-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-postgresql-8.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-postgresql-8.x-plugin-9.2.0.jar similarity index 52% rename from docker/skywalking/agent/plugins/apm-postgresql-8.x-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-postgresql-8.x-plugin-9.2.0.jar index 2e916bb3..e55ad1a7 100644 Binary files a/docker/skywalking/agent/plugins/apm-postgresql-8.x-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-postgresql-8.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-pulsar-2.2-2.7-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-pulsar-2.2-2.7-plugin-8.14.0.jar deleted file mode 100644 index a9e218af..00000000 Binary files a/docker/skywalking/agent/plugins/apm-pulsar-2.2-2.7-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-pulsar-2.2-2.7-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-pulsar-2.2-2.7-plugin-9.2.0.jar new file mode 100644 index 00000000..9dfc17e7 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-pulsar-2.2-2.7-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-pulsar-2.8.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-pulsar-2.8.x-plugin-8.14.0.jar deleted file mode 100644 index 1a03bf81..00000000 Binary files a/docker/skywalking/agent/plugins/apm-pulsar-2.8.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-pulsar-2.8.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-pulsar-2.8.x-plugin-9.2.0.jar new file mode 100644 index 00000000..f4840455 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-pulsar-2.8.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-pulsar-common-8.14.0.jar b/docker/skywalking/agent/plugins/apm-pulsar-common-9.2.0.jar similarity index 57% rename from docker/skywalking/agent/plugins/apm-pulsar-common-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-pulsar-common-9.2.0.jar index ecf9dcec..cf107e96 100644 Binary files a/docker/skywalking/agent/plugins/apm-pulsar-common-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-pulsar-common-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-quasar-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-quasar-plugin-9.2.0.jar similarity index 54% rename from docker/skywalking/agent/plugins/apm-quasar-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-quasar-plugin-9.2.0.jar index e0c24873..a73bfd78 100644 Binary files a/docker/skywalking/agent/plugins/apm-quasar-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-quasar-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-rabbitmq-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-rabbitmq-plugin-9.2.0.jar similarity index 58% rename from docker/skywalking/agent/plugins/apm-rabbitmq-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-rabbitmq-plugin-9.2.0.jar index 39419ea9..e653b251 100644 Binary files a/docker/skywalking/agent/plugins/apm-rabbitmq-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-rabbitmq-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-redisson-3.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-redisson-3.x-plugin-8.14.0.jar deleted file mode 100644 index 24d57f37..00000000 Binary files a/docker/skywalking/agent/plugins/apm-redisson-3.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-redisson-3.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-redisson-3.x-plugin-9.2.0.jar new file mode 100644 index 00000000..b83bc047 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-redisson-3.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-resttemplate-4.3.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-resttemplate-4.3.x-plugin-8.14.0.jar deleted file mode 100644 index c3ee6fc6..00000000 Binary files a/docker/skywalking/agent/plugins/apm-resttemplate-4.3.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-resttemplate-4.3.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-resttemplate-4.3.x-plugin-9.2.0.jar new file mode 100644 index 00000000..4d75f6b0 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-resttemplate-4.3.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-resttemplate-6.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-resttemplate-6.x-plugin-9.2.0.jar new file mode 100644 index 00000000..ae5d24b9 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-resttemplate-6.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-rocketMQ-5.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-rocketMQ-5.x-plugin-9.2.0.jar new file mode 100644 index 00000000..ddcb634c Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-rocketMQ-5.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-rocketmq-3.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-rocketmq-3.x-plugin-9.2.0.jar similarity index 50% rename from docker/skywalking/agent/plugins/apm-rocketmq-3.x-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-rocketmq-3.x-plugin-9.2.0.jar index de0a6924..686eae20 100644 Binary files a/docker/skywalking/agent/plugins/apm-rocketmq-3.x-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-rocketmq-3.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-rocketmq-4.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-rocketmq-4.x-plugin-8.14.0.jar deleted file mode 100644 index 680e2539..00000000 Binary files a/docker/skywalking/agent/plugins/apm-rocketmq-4.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-rocketmq-4.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-rocketmq-4.x-plugin-9.2.0.jar new file mode 100644 index 00000000..d44c31b2 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-rocketmq-4.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-rocketmq-client-java-5.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-rocketmq-client-java-5.x-plugin-9.2.0.jar new file mode 100644 index 00000000..812b2078 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-rocketmq-client-java-5.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-1.6.1.jar b/docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-1.6.1.jar deleted file mode 100644 index d5e6a4b4..00000000 Binary files a/docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-1.6.1.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-1.7.1.jar b/docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-1.7.1.jar deleted file mode 100644 index 2e944fa4..00000000 Binary files a/docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-1.7.1.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-2.1.0.jar b/docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-2.1.0.jar new file mode 100644 index 00000000..5f9d562e Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-2.1.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-sentinel-1.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-sentinel-1.x-plugin-9.2.0.jar similarity index 52% rename from docker/skywalking/agent/plugins/apm-sentinel-1.x-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-sentinel-1.x-plugin-9.2.0.jar index 6e882f18..d131c0f2 100644 Binary files a/docker/skywalking/agent/plugins/apm-sentinel-1.x-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-sentinel-1.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-servicecomb-java-chassis-2.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-servicecomb-java-chassis-2.x-plugin-9.2.0.jar new file mode 100644 index 00000000..5ed5f878 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-servicecomb-java-chassis-2.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-sharding-sphere-4.1.0-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-sharding-sphere-4.1.0-plugin-9.2.0.jar similarity index 53% rename from docker/skywalking/agent/plugins/apm-sharding-sphere-4.1.0-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-sharding-sphere-4.1.0-plugin-9.2.0.jar index d5c13c2b..c14c5895 100644 Binary files a/docker/skywalking/agent/plugins/apm-sharding-sphere-4.1.0-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-sharding-sphere-4.1.0-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-shardingsphere-4.0.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-shardingsphere-4.0.x-plugin-9.2.0.jar similarity index 54% rename from docker/skywalking/agent/plugins/apm-shardingsphere-4.0.x-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-shardingsphere-4.0.x-plugin-9.2.0.jar index 1666a5ba..1c6c4743 100644 Binary files a/docker/skywalking/agent/plugins/apm-shardingsphere-4.0.x-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-shardingsphere-4.0.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-shardingsphere-5.0.0-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-shardingsphere-5.0.0-plugin-9.2.0.jar similarity index 60% rename from docker/skywalking/agent/plugins/apm-shardingsphere-5.0.0-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-shardingsphere-5.0.0-plugin-9.2.0.jar index f359ed1d..2c58d015 100644 Binary files a/docker/skywalking/agent/plugins/apm-shardingsphere-5.0.0-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-shardingsphere-5.0.0-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-spring-annotation-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-spring-annotation-plugin-9.2.0.jar similarity index 58% rename from docker/skywalking/agent/plugins/apm-spring-annotation-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-spring-annotation-plugin-9.2.0.jar index 86dd039f..f619cc8b 100644 Binary files a/docker/skywalking/agent/plugins/apm-spring-annotation-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-spring-annotation-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-spring-async-annotation-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-spring-async-annotation-plugin-9.2.0.jar similarity index 50% rename from docker/skywalking/agent/plugins/apm-spring-async-annotation-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-spring-async-annotation-plugin-9.2.0.jar index 97d051d5..b355dbb9 100644 Binary files a/docker/skywalking/agent/plugins/apm-spring-async-annotation-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-spring-async-annotation-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-spring-cloud-feign-1.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-spring-cloud-feign-1.x-plugin-8.14.0.jar deleted file mode 100644 index ce849264..00000000 Binary files a/docker/skywalking/agent/plugins/apm-spring-cloud-feign-1.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-spring-cloud-feign-2.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-spring-cloud-feign-2.x-plugin-8.14.0.jar deleted file mode 100644 index 2b3600dc..00000000 Binary files a/docker/skywalking/agent/plugins/apm-spring-cloud-feign-2.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-spring-cloud-feign-2.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-spring-cloud-feign-2.x-plugin-9.2.0.jar new file mode 100644 index 00000000..5455f741 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-spring-cloud-feign-2.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-spring-cloud-gateway-2.0.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-spring-cloud-gateway-2.0.x-plugin-8.14.0.jar deleted file mode 100644 index 516d3c7a..00000000 Binary files a/docker/skywalking/agent/plugins/apm-spring-cloud-gateway-2.0.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-spring-cloud-gateway-2.1.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-spring-cloud-gateway-2.1.x-plugin-8.14.0.jar deleted file mode 100644 index d6a940f1..00000000 Binary files a/docker/skywalking/agent/plugins/apm-spring-cloud-gateway-2.1.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-spring-cloud-gateway-3.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-spring-cloud-gateway-3.x-plugin-8.14.0.jar deleted file mode 100644 index bb2f17ce..00000000 Binary files a/docker/skywalking/agent/plugins/apm-spring-cloud-gateway-3.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-spring-cloud-gateway-3.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-spring-cloud-gateway-3.x-plugin-9.2.0.jar new file mode 100644 index 00000000..f3d5c87b Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-spring-cloud-gateway-3.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-spring-cloud-gateway-4.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-spring-cloud-gateway-4.x-plugin-9.2.0.jar new file mode 100644 index 00000000..ddd167c8 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-spring-cloud-gateway-4.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-spring-concurrent-util-4.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-spring-concurrent-util-4.x-plugin-8.14.0.jar deleted file mode 100644 index 9319da32..00000000 Binary files a/docker/skywalking/agent/plugins/apm-spring-concurrent-util-4.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-spring-concurrent-util-4.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-spring-concurrent-util-4.x-plugin-9.2.0.jar new file mode 100644 index 00000000..fb47285d Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-spring-concurrent-util-4.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-spring-core-patch-8.14.0.jar b/docker/skywalking/agent/plugins/apm-spring-core-patch-8.14.0.jar deleted file mode 100644 index f5020460..00000000 Binary files a/docker/skywalking/agent/plugins/apm-spring-core-patch-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-spring-core-patch-9.2.0.jar b/docker/skywalking/agent/plugins/apm-spring-core-patch-9.2.0.jar new file mode 100644 index 00000000..9cf127ed Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-spring-core-patch-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-spring-kafka-1.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-spring-kafka-1.x-plugin-9.2.0.jar similarity index 53% rename from docker/skywalking/agent/plugins/apm-spring-kafka-1.x-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-spring-kafka-1.x-plugin-9.2.0.jar index f1be3175..be6b0d4e 100644 Binary files a/docker/skywalking/agent/plugins/apm-spring-kafka-1.x-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-spring-kafka-1.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-spring-kafka-2.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-spring-kafka-2.x-plugin-8.14.0.jar deleted file mode 100644 index 83895c1a..00000000 Binary files a/docker/skywalking/agent/plugins/apm-spring-kafka-2.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-spring-kafka-2.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-spring-kafka-2.x-plugin-9.2.0.jar new file mode 100644 index 00000000..ad1017a6 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-spring-kafka-2.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-spring-scheduled-annotation-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-spring-scheduled-annotation-plugin-9.2.0.jar similarity index 57% rename from docker/skywalking/agent/plugins/apm-spring-scheduled-annotation-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-spring-scheduled-annotation-plugin-9.2.0.jar index d80afa8c..dd739c40 100644 Binary files a/docker/skywalking/agent/plugins/apm-spring-scheduled-annotation-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-spring-scheduled-annotation-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-spring-tx-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-spring-tx-plugin-9.2.0.jar similarity index 51% rename from docker/skywalking/agent/plugins/apm-spring-tx-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-spring-tx-plugin-9.2.0.jar index 4fc1f30b..5f1b322e 100644 Binary files a/docker/skywalking/agent/plugins/apm-spring-tx-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-spring-tx-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-spring-webflux-5.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-spring-webflux-5.x-plugin-8.14.0.jar deleted file mode 100644 index f5581826..00000000 Binary files a/docker/skywalking/agent/plugins/apm-spring-webflux-5.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-spring-webflux-5.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-spring-webflux-5.x-plugin-9.2.0.jar new file mode 100644 index 00000000..733277bf Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-spring-webflux-5.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-spring-webflux-6.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-spring-webflux-6.x-plugin-9.2.0.jar new file mode 100644 index 00000000..114dfe3b Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-spring-webflux-6.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-springmvc-annotation-3.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-springmvc-annotation-3.x-plugin-8.14.0.jar deleted file mode 100644 index bb3dca8f..00000000 Binary files a/docker/skywalking/agent/plugins/apm-springmvc-annotation-3.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-springmvc-annotation-4.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-springmvc-annotation-4.x-plugin-8.14.0.jar deleted file mode 100644 index ccfc4f98..00000000 Binary files a/docker/skywalking/agent/plugins/apm-springmvc-annotation-4.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-springmvc-annotation-5.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-springmvc-annotation-5.x-plugin-8.14.0.jar deleted file mode 100644 index f43ab918..00000000 Binary files a/docker/skywalking/agent/plugins/apm-springmvc-annotation-5.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-springmvc-annotation-5.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-springmvc-annotation-5.x-plugin-9.2.0.jar new file mode 100644 index 00000000..d51b954e Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-springmvc-annotation-5.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-springmvc-annotation-6.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-springmvc-annotation-6.x-plugin-9.2.0.jar new file mode 100644 index 00000000..ee096aa8 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-springmvc-annotation-6.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-springmvc-annotation-commons-8.14.0.jar b/docker/skywalking/agent/plugins/apm-springmvc-annotation-commons-8.14.0.jar deleted file mode 100644 index cedfc731..00000000 Binary files a/docker/skywalking/agent/plugins/apm-springmvc-annotation-commons-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-springmvc-annotation-commons-9.2.0.jar b/docker/skywalking/agent/plugins/apm-springmvc-annotation-commons-9.2.0.jar new file mode 100644 index 00000000..bbe0d93b Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-springmvc-annotation-commons-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-tomcat-thread-pool-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-tomcat-thread-pool-plugin-9.2.0.jar similarity index 60% rename from docker/skywalking/agent/plugins/apm-tomcat-thread-pool-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-tomcat-thread-pool-plugin-9.2.0.jar index 4fe23ffa..f52135f4 100644 Binary files a/docker/skywalking/agent/plugins/apm-tomcat-thread-pool-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-tomcat-thread-pool-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-trace-ignore-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-trace-ignore-plugin-8.14.0.jar deleted file mode 100644 index 01e8da1f..00000000 Binary files a/docker/skywalking/agent/plugins/apm-trace-ignore-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-trace-ignore-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-trace-ignore-plugin-9.2.0.jar new file mode 100644 index 00000000..b20b6905 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-trace-ignore-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-undertow-2.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-undertow-2.x-plugin-8.14.0.jar deleted file mode 100644 index 86ea8b30..00000000 Binary files a/docker/skywalking/agent/plugins/apm-undertow-2.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-undertow-2.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-undertow-2.x-plugin-9.2.0.jar new file mode 100644 index 00000000..fea012d6 Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-undertow-2.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-undertow-worker-thread-pool-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-undertow-worker-thread-pool-plugin-8.14.0.jar deleted file mode 100644 index 422ed5d7..00000000 Binary files a/docker/skywalking/agent/plugins/apm-undertow-worker-thread-pool-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/apm-undertow-worker-thread-pool-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/apm-undertow-worker-thread-pool-plugin-9.2.0.jar new file mode 100644 index 00000000..a89ab64f Binary files /dev/null and b/docker/skywalking/agent/plugins/apm-undertow-worker-thread-pool-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-xxl-job-2.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-xxl-job-2.x-plugin-9.2.0.jar similarity index 56% rename from docker/skywalking/agent/plugins/apm-xxl-job-2.x-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-xxl-job-2.x-plugin-9.2.0.jar index b2903593..7a6ecf62 100644 Binary files a/docker/skywalking/agent/plugins/apm-xxl-job-2.x-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-xxl-job-2.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/apm-zookeeper-3.4.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/apm-zookeeper-3.4.x-plugin-9.2.0.jar similarity index 58% rename from docker/skywalking/agent/plugins/apm-zookeeper-3.4.x-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/apm-zookeeper-3.4.x-plugin-9.2.0.jar index 0407b8e8..3e658189 100644 Binary files a/docker/skywalking/agent/plugins/apm-zookeeper-3.4.x-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/apm-zookeeper-3.4.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/druid-1.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/druid-1.x-plugin-8.14.0.jar deleted file mode 100644 index 7609cf29..00000000 Binary files a/docker/skywalking/agent/plugins/druid-1.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/druid-1.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/druid-1.x-plugin-9.2.0.jar new file mode 100644 index 00000000..4a103d1c Binary files /dev/null and b/docker/skywalking/agent/plugins/druid-1.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/dubbo-3.x-conflict-patch-8.14.0.jar b/docker/skywalking/agent/plugins/dubbo-3.x-conflict-patch-9.2.0.jar similarity index 57% rename from docker/skywalking/agent/plugins/dubbo-3.x-conflict-patch-8.14.0.jar rename to docker/skywalking/agent/plugins/dubbo-3.x-conflict-patch-9.2.0.jar index c35f8d50..51b85a92 100644 Binary files a/docker/skywalking/agent/plugins/dubbo-3.x-conflict-patch-8.14.0.jar and b/docker/skywalking/agent/plugins/dubbo-3.x-conflict-patch-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/dubbo-conflict-patch-8.14.0.jar b/docker/skywalking/agent/plugins/dubbo-conflict-patch-9.2.0.jar similarity index 71% rename from docker/skywalking/agent/plugins/dubbo-conflict-patch-8.14.0.jar rename to docker/skywalking/agent/plugins/dubbo-conflict-patch-9.2.0.jar index 576a2d30..22d56bd5 100644 Binary files a/docker/skywalking/agent/plugins/dubbo-conflict-patch-8.14.0.jar and b/docker/skywalking/agent/plugins/dubbo-conflict-patch-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/elasticsearch-common-9.2.0.jar b/docker/skywalking/agent/plugins/elasticsearch-common-9.2.0.jar new file mode 100644 index 00000000..13abbcb3 Binary files /dev/null and b/docker/skywalking/agent/plugins/elasticsearch-common-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/graphql-12.x-15.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/graphql-12.x-15.x-plugin-9.2.0.jar similarity index 62% rename from docker/skywalking/agent/plugins/graphql-12.x-15.x-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/graphql-12.x-15.x-plugin-9.2.0.jar index 4c72e402..e1154a1a 100644 Binary files a/docker/skywalking/agent/plugins/graphql-12.x-15.x-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/graphql-12.x-15.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/graphql-16plus-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/graphql-16plus-plugin-9.2.0.jar similarity index 60% rename from docker/skywalking/agent/plugins/graphql-16plus-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/graphql-16plus-plugin-9.2.0.jar index 1b1d8fda..c064f8b0 100644 Binary files a/docker/skywalking/agent/plugins/graphql-16plus-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/graphql-16plus-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/graphql-8.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/graphql-8.x-plugin-9.2.0.jar similarity index 55% rename from docker/skywalking/agent/plugins/graphql-8.x-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/graphql-8.x-plugin-9.2.0.jar index 897fda07..63bc092a 100644 Binary files a/docker/skywalking/agent/plugins/graphql-8.x-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/graphql-8.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/graphql-9.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/graphql-9.x-plugin-9.2.0.jar similarity index 60% rename from docker/skywalking/agent/plugins/graphql-9.x-plugin-8.14.0.jar rename to docker/skywalking/agent/plugins/graphql-9.x-plugin-9.2.0.jar index 3e874436..b2f8e54e 100644 Binary files a/docker/skywalking/agent/plugins/graphql-9.x-plugin-8.14.0.jar and b/docker/skywalking/agent/plugins/graphql-9.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/jedis-2.x-3.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/jedis-2.x-3.x-plugin-9.2.0.jar new file mode 100644 index 00000000..98f52f33 Binary files /dev/null and b/docker/skywalking/agent/plugins/jedis-2.x-3.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/jedis-4.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/jedis-4.x-plugin-9.2.0.jar new file mode 100644 index 00000000..e971fd1c Binary files /dev/null and b/docker/skywalking/agent/plugins/jedis-4.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/spring-commons-8.14.0.jar b/docker/skywalking/agent/plugins/spring-commons-8.14.0.jar deleted file mode 100644 index 2dd60912..00000000 Binary files a/docker/skywalking/agent/plugins/spring-commons-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/spring-commons-9.2.0.jar b/docker/skywalking/agent/plugins/spring-commons-9.2.0.jar new file mode 100644 index 00000000..812eac70 Binary files /dev/null and b/docker/skywalking/agent/plugins/spring-commons-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/spring-webflux-5.x-webclient-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/spring-webflux-5.x-webclient-plugin-8.14.0.jar deleted file mode 100644 index 9eeec81a..00000000 Binary files a/docker/skywalking/agent/plugins/spring-webflux-5.x-webclient-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/spring-webflux-5.x-webclient-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/spring-webflux-5.x-webclient-plugin-9.2.0.jar new file mode 100644 index 00000000..d6e578af Binary files /dev/null and b/docker/skywalking/agent/plugins/spring-webflux-5.x-webclient-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/spring-webflux-6.x-webclient-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/spring-webflux-6.x-webclient-plugin-9.2.0.jar new file mode 100644 index 00000000..44a5374d Binary files /dev/null and b/docker/skywalking/agent/plugins/spring-webflux-6.x-webclient-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/thrift-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/thrift-plugin-8.14.0.jar deleted file mode 100644 index ba9282cb..00000000 Binary files a/docker/skywalking/agent/plugins/thrift-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/thrift-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/thrift-plugin-9.2.0.jar new file mode 100644 index 00000000..e0610987 Binary files /dev/null and b/docker/skywalking/agent/plugins/thrift-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/tomcat-10x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/tomcat-10x-plugin-8.14.0.jar deleted file mode 100644 index 5f3ef7bc..00000000 Binary files a/docker/skywalking/agent/plugins/tomcat-10x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/tomcat-10x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/tomcat-10x-plugin-9.2.0.jar new file mode 100644 index 00000000..f0bf1d90 Binary files /dev/null and b/docker/skywalking/agent/plugins/tomcat-10x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/tomcat-7.x-8.x-plugin-8.14.0.jar b/docker/skywalking/agent/plugins/tomcat-7.x-8.x-plugin-8.14.0.jar deleted file mode 100644 index 8f17f1d9..00000000 Binary files a/docker/skywalking/agent/plugins/tomcat-7.x-8.x-plugin-8.14.0.jar and /dev/null differ diff --git a/docker/skywalking/agent/plugins/tomcat-7.x-8.x-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/tomcat-7.x-8.x-plugin-9.2.0.jar new file mode 100644 index 00000000..1b1f480e Binary files /dev/null and b/docker/skywalking/agent/plugins/tomcat-7.x-8.x-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/plugins/trace-sampler-cpu-policy-plugin-9.2.0.jar b/docker/skywalking/agent/plugins/trace-sampler-cpu-policy-plugin-9.2.0.jar new file mode 100644 index 00000000..5763e141 Binary files /dev/null and b/docker/skywalking/agent/plugins/trace-sampler-cpu-policy-plugin-9.2.0.jar differ diff --git a/docker/skywalking/agent/skywalking-agent.jar b/docker/skywalking/agent/skywalking-agent.jar index e9fef535..41f54840 100644 Binary files a/docker/skywalking/agent/skywalking-agent.jar and b/docker/skywalking/agent/skywalking-agent.jar differ diff --git a/pom.xml b/pom.xml index 2c6c29c6..abeb7a18 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ RuoYi-Cloud-Plus微服务系统 - 2.2.0-BETA + 2.2.0-BETA2 UTF-8 UTF-8 17 @@ -21,9 +21,9 @@ 2023.0.2 3.2.3 3.5.16 - 3.5.6 + 3.5.7 3.9.1 - 4.3.0 + 4.3.1 2.3 2.2.21 2.5.0 @@ -31,15 +31,15 @@ 5.2.3 3.3.4 5.8.27 - 3.29.0 + 3.31.0 2.2.7 - 1.0.0-beta3 + 1.0.1 1.38.0 1.18.32 7.4 2.0.0 7.14.0 - 8.16.0 + 9.2.0 1.76 2.14.4 1.3.6 @@ -374,6 +374,13 @@ ${fastjson.version} + + + redis.clients + jedis + 5.1.0 + + com.alibaba transmittable-thread-local diff --git a/ruoyi-api/ruoyi-api-bom/pom.xml b/ruoyi-api/ruoyi-api-bom/pom.xml index d8a6ad02..748bcb68 100644 --- a/ruoyi-api/ruoyi-api-bom/pom.xml +++ b/ruoyi-api/ruoyi-api-bom/pom.xml @@ -15,7 +15,7 @@ - 2.2.0-BETA + 2.2.0-BETA2 diff --git a/ruoyi-api/ruoyi-api-workflow/pom.xml b/ruoyi-api/ruoyi-api-workflow/pom.xml index 5e9df772..45c32d06 100644 --- a/ruoyi-api/ruoyi-api-workflow/pom.xml +++ b/ruoyi-api/ruoyi-api-workflow/pom.xml @@ -22,6 +22,10 @@ org.dromara ruoyi-common-core + + org.dromara + ruoyi-common-bus + diff --git a/ruoyi-api/ruoyi-api-workflow/src/main/java/org/dromara/workflow/api/domain/event/ProcessEvent.java b/ruoyi-api/ruoyi-api-workflow/src/main/java/org/dromara/workflow/api/domain/event/ProcessEvent.java index 5b7b121f..67d41bbb 100644 --- a/ruoyi-api/ruoyi-api-workflow/src/main/java/org/dromara/workflow/api/domain/event/ProcessEvent.java +++ b/ruoyi-api/ruoyi-api-workflow/src/main/java/org/dromara/workflow/api/domain/event/ProcessEvent.java @@ -1,18 +1,20 @@ package org.dromara.workflow.api.domain.event; import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.utils.SpringUtils; +import org.springframework.cloud.bus.event.RemoteApplicationEvent; import java.io.Serial; -import java.io.Serializable; /** * 总体流程监听 * * @author may */ - @Data -public class ProcessEvent implements Serializable { +@EqualsAndHashCode(callSuper = true) +public class ProcessEvent extends RemoteApplicationEvent { @Serial private static final long serialVersionUID = 1L; @@ -37,4 +39,8 @@ public class ProcessEvent implements Serializable { */ private boolean submit; + public ProcessEvent() { + super(new Object(), SpringUtils.getApplicationName(), DEFAULT_DESTINATION_FACTORY.getDestination(null)); + } + } diff --git a/ruoyi-api/ruoyi-api-workflow/src/main/java/org/dromara/workflow/api/domain/event/ProcessTaskEvent.java b/ruoyi-api/ruoyi-api-workflow/src/main/java/org/dromara/workflow/api/domain/event/ProcessTaskEvent.java index 8ba2caef..73e972bc 100644 --- a/ruoyi-api/ruoyi-api-workflow/src/main/java/org/dromara/workflow/api/domain/event/ProcessTaskEvent.java +++ b/ruoyi-api/ruoyi-api-workflow/src/main/java/org/dromara/workflow/api/domain/event/ProcessTaskEvent.java @@ -1,26 +1,33 @@ package org.dromara.workflow.api.domain.event; import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.utils.SpringUtils; +import org.springframework.cloud.bus.event.RemoteApplicationEvent; import java.io.Serial; -import java.io.Serializable; /** * 流程办理监听 * * @author may */ - @Data -public class ProcessTaskEvent implements Serializable { +@EqualsAndHashCode(callSuper = true) +public class ProcessTaskEvent extends RemoteApplicationEvent { @Serial private static final long serialVersionUID = 1L; /** - * 流程定义key与流程节点标识(拼接方式:流程定义key_流程节点) + * 流程定义key */ - private String keyNode; + private String key; + + /** + * 审批节点key + */ + private String taskDefinitionKey; /** * 任务id @@ -32,4 +39,7 @@ public class ProcessTaskEvent implements Serializable { */ private String businessKey; + public ProcessTaskEvent() { + super(new Object(), SpringUtils.getApplicationName(), DEFAULT_DESTINATION_FACTORY.getDestination(null)); + } } diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java index f4ae3941..8de19740 100644 --- a/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java +++ b/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java @@ -1,5 +1,7 @@ package org.dromara.auth.controller; +import cn.dev33.satoken.exception.NotLoginException; +import cn.hutool.core.codec.Base64; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import jakarta.servlet.http.HttpServletRequest; @@ -38,7 +40,10 @@ import org.dromara.system.api.domain.vo.RemoteTenantVo; import org.springframework.web.bind.annotation.*; import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -109,13 +114,18 @@ public class TokenController { * @return 结果 */ @GetMapping("/binding/{source}") - public R authBinding(@PathVariable("source") String source) { + public R authBinding(@PathVariable("source") String source, + @RequestParam String tenantId, @RequestParam String domain) { SocialLoginConfigProperties obj = socialProperties.getType().get(source); if (ObjectUtil.isNull(obj)) { return R.fail(source + "平台账号暂不支持"); } AuthRequest authRequest = SocialUtils.getAuthRequest(source, socialProperties); - String authorizeUrl = authRequest.authorize(AuthStateUtils.createState()); + Map map = new HashMap<>(); + map.put("tenantId", tenantId); + map.put("domain", domain); + map.put("state", AuthStateUtils.createState()); + String authorizeUrl = authRequest.authorize(Base64.encode(JsonUtils.toJsonString(map), StandardCharsets.UTF_8)); return R.ok("操作成功", authorizeUrl); } @@ -182,8 +192,26 @@ public class TokenController { */ @GetMapping("/tenant/list") public R tenantList(HttpServletRequest request) throws Exception { + // 返回对象 + LoginTenantVo result = new LoginTenantVo(); + boolean enable = TenantHelper.isEnable(); + result.setTenantEnabled(enable); + // 如果未开启租户这直接返回 + if (!enable) { + return R.ok(result); + } + List tenantList = remoteTenantService.queryList(); List voList = MapstructUtils.convert(tenantList, TenantListVo.class); + try { + // 如果只超管返回所有租户 + if (LoginHelper.isSuperAdmin()) { + result.setVoList(voList); + return R.ok(result); + } + } catch (NotLoginException ignored) { + } + // 获取域名 String host; String referer = request.getHeader("referer"); @@ -196,11 +224,8 @@ public class TokenController { // 根据域名进行筛选 List list = StreamUtils.filter(voList, vo -> StringUtils.equals(vo.getDomain(), host)); - // 返回对象 - LoginTenantVo vo = new LoginTenantVo(); - vo.setVoList(CollUtil.isNotEmpty(list) ? list : voList); - vo.setTenantEnabled(TenantHelper.isEnable()); - return R.ok(vo); + result.setVoList(CollUtil.isNotEmpty(list) ? list : voList); + return R.ok(result); } } diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 204db8dd..ff6f5581 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -43,6 +43,7 @@ ruoyi-common-websocket ruoyi-common-social ruoyi-common-nacos + ruoyi-common-bus ruoyi-common diff --git a/ruoyi-common/ruoyi-common-alibaba-bom/pom.xml b/ruoyi-common/ruoyi-common-alibaba-bom/pom.xml index 47dce94d..57504d4b 100644 --- a/ruoyi-common/ruoyi-common-alibaba-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-alibaba-bom/pom.xml @@ -14,12 +14,12 @@ - 2.2.0-BETA + 2.2.0-BETA2 2023.0.1.0 1.8.8 1.7.1 - 2.3.2 - 3.2.11 + 2.3.3 + 3.2.14 1.0.11 @@ -166,6 +166,12 @@ ${dubbo.version} + + org.apache.dubbo + dubbo-metadata-report-redis + ${dubbo.version} + + com.alibaba.spring spring-context-support diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml index 6ac85cd7..0b599698 100644 --- a/ruoyi-common/ruoyi-common-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -14,7 +14,7 @@ - 2.2.0-BETA + 2.2.0-BETA2 @@ -224,6 +224,12 @@ ${revision} + + org.dromara + ruoyi-common-bus + ${revision} + + diff --git a/ruoyi-common/ruoyi-common-bus/pom.xml b/ruoyi-common/ruoyi-common-bus/pom.xml new file mode 100644 index 00000000..d89de614 --- /dev/null +++ b/ruoyi-common/ruoyi-common-bus/pom.xml @@ -0,0 +1,30 @@ + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-bus + + + ruoyi-common-bus 模块 + + + + + + org.springframework.cloud + spring-cloud-starter-bus-amqp + + + + + + + + diff --git a/ruoyi-common/ruoyi-common-bus/src/main/java/org/dromara/common/bus/config/BusCustomConfiguration.java b/ruoyi-common/ruoyi-common-bus/src/main/java/org/dromara/common/bus/config/BusCustomConfiguration.java new file mode 100644 index 00000000..68423b4d --- /dev/null +++ b/ruoyi-common/ruoyi-common-bus/src/main/java/org/dromara/common/bus/config/BusCustomConfiguration.java @@ -0,0 +1,15 @@ +package org.dromara.common.bus.config; + +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.cloud.bus.jackson.RemoteApplicationEventScan; + +/** + * bus 配置 + * + * @author Lion Li + */ +@AutoConfiguration +@RemoteApplicationEventScan(basePackages = "${spring.cloud.bus.base-packages}") +public class BusCustomConfiguration { + +} diff --git a/ruoyi-common/ruoyi-common-bus/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-bus/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..3b5376e9 --- /dev/null +++ b/ruoyi-common/ruoyi-common-bus/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +org.dromara.common.bus.config.BusCustomConfiguration diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java index d1200870..d9f70e42 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/config/ApplicationConfig.java @@ -10,8 +10,7 @@ import org.springframework.scheduling.annotation.EnableAsync; * @author Lion Li */ @AutoConfiguration -// 表示通过aop框架暴露该代理对象,AopContext能够访问 -@EnableAspectJAutoProxy(exposeProxy = true) +@EnableAspectJAutoProxy @EnableAsync(proxyTargetClass = true) public class ApplicationConfig { diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java index e58c394a..5ff751d1 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SpringUtils.java @@ -1,7 +1,6 @@ package org.dromara.common.core.utils; import cn.hutool.extra.spring.SpringUtil; -import org.springframework.aop.framework.AopContext; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.boot.autoconfigure.thread.Threading; import org.springframework.context.ApplicationContext; @@ -50,10 +49,9 @@ public final class SpringUtils extends SpringUtil { */ @SuppressWarnings("unchecked") public static T getAopProxy(T invoker) { - return (T) AopContext.currentProxy(); + return (T) getBean(invoker.getClass()); } - /** * 获取spring上下文 */ diff --git a/ruoyi-common/ruoyi-common-dubbo/pom.xml b/ruoyi-common/ruoyi-common-dubbo/pom.xml index 4ff44a9d..b5cee969 100644 --- a/ruoyi-common/ruoyi-common-dubbo/pom.xml +++ b/ruoyi-common/ruoyi-common-dubbo/pom.xml @@ -36,6 +36,21 @@ dubbo-spring-boot-actuator + + org.apache.dubbo + dubbo-metadata-report-redis + + + redis.clients + jedis + + + + + redis.clients + jedis + 5.1.0 + org.projectlombok lombok diff --git a/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java b/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java new file mode 100644 index 00000000..c1341761 --- /dev/null +++ b/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java @@ -0,0 +1,576 @@ +/* + * 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. + */ +package org.apache.dubbo.metadata.report.support; + +import org.apache.dubbo.common.URL; +import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; +import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.common.utils.CollectionUtils; +import org.apache.dubbo.common.utils.ConfigUtils; +import org.apache.dubbo.common.utils.JsonUtils; +import org.apache.dubbo.common.utils.NamedThreadFactory; +import org.apache.dubbo.metadata.definition.model.FullServiceDefinition; +import org.apache.dubbo.metadata.definition.model.ServiceDefinition; +import org.apache.dubbo.metadata.report.MetadataReport; +import org.apache.dubbo.metadata.report.identifier.KeyTypeEnum; +import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier; +import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier; +import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier; +import org.apache.dubbo.metrics.event.MetricsEventBus; +import org.apache.dubbo.metrics.metadata.event.MetadataEvent; +import org.apache.dubbo.rpc.model.ApplicationModel; + +import java.io.*; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + +import static org.apache.dubbo.common.constants.CommonConstants.*; +import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_UNEXPECTED_EXCEPTION; +import static org.apache.dubbo.common.constants.LoggerCodeConstants.PROXY_FAILED_EXPORT_SERVICE; +import static org.apache.dubbo.common.utils.StringUtils.replace; +import static org.apache.dubbo.metadata.report.support.Constants.*; + +public abstract class AbstractMetadataReport implements MetadataReport { + + protected static final String DEFAULT_ROOT = "dubbo"; + + protected static final int ONE_DAY_IN_MILLISECONDS = 60 * 24 * 60 * 1000; + private static final int FOUR_HOURS_IN_MILLISECONDS = 60 * 4 * 60 * 1000; + // Log output + protected final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(getClass()); + + // Local disk cache, where the special key value.registries records the list of metadata centers, and the others are + // the list of notified service providers + final Properties properties = new Properties(); + private final ExecutorService reportCacheExecutor = + Executors.newFixedThreadPool(1, new NamedThreadFactory("DubboSaveMetadataReport", true)); + final Map allMetadataReports = new ConcurrentHashMap<>(4); + + private final AtomicLong lastCacheChanged = new AtomicLong(); + final Map failedReports = new ConcurrentHashMap<>(4); + private URL reportURL; + boolean syncReport; + // Local disk cache file + File file; + private AtomicBoolean initialized = new AtomicBoolean(false); + public MetadataReportRetry metadataReportRetry; + private ScheduledExecutorService reportTimerScheduler; + + private final boolean reportMetadata; + private final boolean reportDefinition; + protected ApplicationModel applicationModel; + + public AbstractMetadataReport(URL reportServerURL) { + setUrl(reportServerURL); + applicationModel = reportServerURL.getOrDefaultApplicationModel(); + + boolean localCacheEnabled = reportServerURL.getParameter(REGISTRY_LOCAL_FILE_CACHE_ENABLED, true); + // Start file save timer + String defaultFilename = System.getProperty("user.home") + DUBBO_METADATA + + reportServerURL.getApplication() + + "-" + replace(reportServerURL.getAddress(), ":", "-") + + CACHE; + String filename = reportServerURL.getParameter(FILE_KEY, defaultFilename); + File file = null; + if (localCacheEnabled && ConfigUtils.isNotEmpty(filename)) { + file = new File(filename); + if (!file.exists() + && file.getParentFile() != null + && !file.getParentFile().exists()) { + if (!file.getParentFile().mkdirs()) { + throw new IllegalArgumentException("Invalid service store file " + file + + ", cause: Failed to create directory " + file.getParentFile() + "!"); + } + } + // if this file exists, firstly delete it. + if (!initialized.getAndSet(true) && file.exists()) { + file.delete(); + } + } + this.file = file; + loadProperties(); + syncReport = reportServerURL.getParameter(SYNC_REPORT_KEY, false); + metadataReportRetry = new MetadataReportRetry( + reportServerURL.getParameter(RETRY_TIMES_KEY, DEFAULT_METADATA_REPORT_RETRY_TIMES), + reportServerURL.getParameter(RETRY_PERIOD_KEY, DEFAULT_METADATA_REPORT_RETRY_PERIOD)); + // cycle report the data switch + if (reportServerURL.getParameter(CYCLE_REPORT_KEY, DEFAULT_METADATA_REPORT_CYCLE_REPORT)) { + reportTimerScheduler = Executors.newSingleThreadScheduledExecutor( + new NamedThreadFactory("DubboMetadataReportTimer", true)); + reportTimerScheduler.scheduleAtFixedRate( + this::publishAll, calculateStartTime(), ONE_DAY_IN_MILLISECONDS, TimeUnit.MILLISECONDS); + } + + this.reportMetadata = reportServerURL.getParameter(REPORT_METADATA_KEY, false); + this.reportDefinition = reportServerURL.getParameter(REPORT_DEFINITION_KEY, true); + } + + public URL getUrl() { + return reportURL; + } + + protected void setUrl(URL url) { + if (url == null) { + throw new IllegalArgumentException("metadataReport url == null"); + } + this.reportURL = url; + } + + private void doSaveProperties(long version) { + if (version < lastCacheChanged.get()) { + return; + } + if (file == null) { + return; + } + // Save + try { + File lockfile = new File(file.getAbsolutePath() + ".lock"); + if (!lockfile.exists()) { + lockfile.createNewFile(); + } + try (RandomAccessFile raf = new RandomAccessFile(lockfile, "rw"); + FileChannel channel = raf.getChannel()) { + FileLock lock = channel.tryLock(); + if (lock == null) { + throw new IOException( + "Can not lock the metadataReport cache file " + file.getAbsolutePath() + + ", ignore and retry later, maybe multi java process use the file, please config: dubbo.metadata.file=xxx.properties"); + } + // Save + try { + if (!file.exists()) { + file.createNewFile(); + } + + Properties tmpProperties; + if (!syncReport) { + // When syncReport = false, properties.setProperty and properties.store are called from the same + // thread(reportCacheExecutor), so deep copy is not required + tmpProperties = properties; + } else { + // Using store method and setProperty method of the this.properties will cause lock contention + // under multi-threading, so deep copy a new container + tmpProperties = new Properties(); + Set> entries = properties.entrySet(); + for (Map.Entry entry : entries) { + tmpProperties.setProperty((String) entry.getKey(), (String) entry.getValue()); + } + } + + try (FileOutputStream outputFile = new FileOutputStream(file)) { + tmpProperties.store(outputFile, "Dubbo metadataReport Cache"); + } + } finally { + lock.release(); + } + } + } catch (Throwable e) { + if (version < lastCacheChanged.get()) { + return; + } else { + reportCacheExecutor.execute(new SaveProperties(lastCacheChanged.incrementAndGet())); + } + logger.warn( + COMMON_UNEXPECTED_EXCEPTION, + "", + "", + "Failed to save service store file, cause: " + e.getMessage(), + e); + } + } + + void loadProperties() { + if (file != null && file.exists()) { + try (InputStream in = new FileInputStream(file)) { + properties.load(in); + if (logger.isInfoEnabled()) { + logger.info("Load service store file " + file + ", data: " + properties); + } + } catch (Throwable e) { + logger.warn(COMMON_UNEXPECTED_EXCEPTION, "", "", "Failed to load service store file" + file, e); + } + } + } + + private void saveProperties(MetadataIdentifier metadataIdentifier, String value, boolean add, boolean sync) { + if (file == null) { + return; + } + + try { + if (add) { + properties.setProperty(metadataIdentifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY), value); + } else { + properties.remove(metadataIdentifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY)); + } + long version = lastCacheChanged.incrementAndGet(); + if (sync) { + new SaveProperties(version).run(); + } else { + reportCacheExecutor.execute(new SaveProperties(version)); + } + + } catch (Throwable t) { + logger.warn(COMMON_UNEXPECTED_EXCEPTION, "", "", t.getMessage(), t); + } + } + + @Override + public String toString() { + return getUrl().toString(); + } + + private class SaveProperties implements Runnable { + private long version; + + private SaveProperties(long version) { + this.version = version; + } + + @Override + public void run() { + doSaveProperties(version); + } + } + + @Override + public void storeProviderMetadata( + MetadataIdentifier providerMetadataIdentifier, ServiceDefinition serviceDefinition) { + if (syncReport) { + storeProviderMetadataTask(providerMetadataIdentifier, serviceDefinition); + } else { + reportCacheExecutor.execute(() -> storeProviderMetadataTask(providerMetadataIdentifier, serviceDefinition)); + } + } + + private void storeProviderMetadataTask( + MetadataIdentifier providerMetadataIdentifier, ServiceDefinition serviceDefinition) { + + MetadataEvent metadataEvent = MetadataEvent.toServiceSubscribeEvent( + applicationModel, providerMetadataIdentifier.getUniqueServiceName()); + MetricsEventBus.post( + metadataEvent, + () -> { + boolean result = true; + try { + if (logger.isInfoEnabled()) { + logger.info("store provider metadata. Identifier : " + providerMetadataIdentifier + + "; definition: " + serviceDefinition); + } + allMetadataReports.put(providerMetadataIdentifier, serviceDefinition); + failedReports.remove(providerMetadataIdentifier); + String data = JsonUtils.toJson(serviceDefinition); + doStoreProviderMetadata(providerMetadataIdentifier, data); + saveProperties(providerMetadataIdentifier, data, true, !syncReport); + } catch (Exception e) { + // retry again. If failed again, throw exception. + failedReports.put(providerMetadataIdentifier, serviceDefinition); + metadataReportRetry.startRetryTask(); + logger.error( + PROXY_FAILED_EXPORT_SERVICE, + "", + "", + "Failed to put provider metadata " + providerMetadataIdentifier + " in " + + serviceDefinition + ", cause: " + e.getMessage(), + e); + result = false; + } + return result; + }, + aBoolean -> aBoolean); + } + + @Override + public void storeConsumerMetadata( + MetadataIdentifier consumerMetadataIdentifier, Map serviceParameterMap) { + if (syncReport) { + storeConsumerMetadataTask(consumerMetadataIdentifier, serviceParameterMap); + } else { + reportCacheExecutor.execute( + () -> storeConsumerMetadataTask(consumerMetadataIdentifier, serviceParameterMap)); + } + } + + protected void storeConsumerMetadataTask( + MetadataIdentifier consumerMetadataIdentifier, Map serviceParameterMap) { + try { + if (logger.isInfoEnabled()) { + logger.info("store consumer metadata. Identifier : " + consumerMetadataIdentifier + "; definition: " + + serviceParameterMap); + } + allMetadataReports.put(consumerMetadataIdentifier, serviceParameterMap); + failedReports.remove(consumerMetadataIdentifier); + + String data = JsonUtils.toJson(serviceParameterMap); + doStoreConsumerMetadata(consumerMetadataIdentifier, data); + saveProperties(consumerMetadataIdentifier, data, true, !syncReport); + } catch (Exception e) { + // retry again. If failed again, throw exception. + failedReports.put(consumerMetadataIdentifier, serviceParameterMap); + metadataReportRetry.startRetryTask(); + logger.error( + PROXY_FAILED_EXPORT_SERVICE, + "", + "", + "Failed to put consumer metadata " + consumerMetadataIdentifier + "; " + serviceParameterMap + + ", cause: " + e.getMessage(), + e); + } + } + + @Override + public void destroy() { + if (reportCacheExecutor != null) { + reportCacheExecutor.shutdown(); + } + if (reportTimerScheduler != null) { + reportTimerScheduler.shutdown(); + } + if (metadataReportRetry != null) { + metadataReportRetry.destroy(); + metadataReportRetry = null; + } + } + + @Override + public void saveServiceMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url) { + if (syncReport) { + doSaveMetadata(metadataIdentifier, url); + } else { + reportCacheExecutor.execute(() -> doSaveMetadata(metadataIdentifier, url)); + } + } + + @Override + public void removeServiceMetadata(ServiceMetadataIdentifier metadataIdentifier) { + if (syncReport) { + doRemoveMetadata(metadataIdentifier); + } else { + reportCacheExecutor.execute(() -> doRemoveMetadata(metadataIdentifier)); + } + } + + @Override + public List getExportedURLs(ServiceMetadataIdentifier metadataIdentifier) { + // TODO, fallback to local cache + return doGetExportedURLs(metadataIdentifier); + } + + @Override + public void saveSubscribedData(SubscriberMetadataIdentifier subscriberMetadataIdentifier, Set urls) { + if (syncReport) { + doSaveSubscriberData(subscriberMetadataIdentifier, JsonUtils.toJson(urls)); + } else { + reportCacheExecutor.execute( + () -> doSaveSubscriberData(subscriberMetadataIdentifier, JsonUtils.toJson(urls))); + } + } + + @Override + public List getSubscribedURLs(SubscriberMetadataIdentifier subscriberMetadataIdentifier) { + String content = doGetSubscribedURLs(subscriberMetadataIdentifier); + return JsonUtils.toJavaList(content, String.class); + } + + String getProtocol(URL url) { + String protocol = url.getSide(); + protocol = protocol == null ? url.getProtocol() : protocol; + return protocol; + } + + /** + * @return if need to continue + */ + public boolean retry() { + return doHandleMetadataCollection(failedReports); + } + + @Override + public boolean shouldReportDefinition() { + return reportDefinition; + } + + @Override + public boolean shouldReportMetadata() { + return reportMetadata; + } + + private boolean doHandleMetadataCollection(Map metadataMap) { + if (metadataMap.isEmpty()) { + return true; + } + Iterator> iterable = + metadataMap.entrySet().iterator(); + while (iterable.hasNext()) { + Map.Entry item = iterable.next(); + if (PROVIDER_SIDE.equals(item.getKey().getSide())) { + this.storeProviderMetadata(item.getKey(), (FullServiceDefinition) item.getValue()); + } else if (CONSUMER_SIDE.equals(item.getKey().getSide())) { + this.storeConsumerMetadata(item.getKey(), (Map) item.getValue()); + } + } + return false; + } + + /** + * not private. just for unittest. + */ + void publishAll() { + logger.info("start to publish all metadata."); + this.doHandleMetadataCollection(allMetadataReports); + } + + /** + * between 2:00 am to 6:00 am, the time is random. + * + * @return + */ + long calculateStartTime() { + Calendar calendar = Calendar.getInstance(); + long nowMill = calendar.getTimeInMillis(); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + long subtract = calendar.getTimeInMillis() + ONE_DAY_IN_MILLISECONDS - nowMill; + return subtract + + (FOUR_HOURS_IN_MILLISECONDS / 2) + + ThreadLocalRandom.current().nextInt(FOUR_HOURS_IN_MILLISECONDS); + } + + class MetadataReportRetry { + protected final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(getClass()); + + final ScheduledExecutorService retryExecutor = + Executors.newScheduledThreadPool(0, new NamedThreadFactory("DubboMetadataReportRetryTimer", true)); + volatile ScheduledFuture retryScheduledFuture; + final AtomicInteger retryCounter = new AtomicInteger(0); + // retry task schedule period + long retryPeriod; + // if no failed report, wait how many times to run retry task. + int retryTimesIfNonFail = 600; + + int retryLimit; + + public MetadataReportRetry(int retryTimes, int retryPeriod) { + this.retryPeriod = retryPeriod; + this.retryLimit = retryTimes; + } + + void startRetryTask() { + if (retryScheduledFuture == null) { + synchronized (retryCounter) { + if (retryScheduledFuture == null) { + retryScheduledFuture = retryExecutor.scheduleWithFixedDelay( + () -> { + // Check and connect to the metadata + try { + int times = retryCounter.incrementAndGet(); + logger.info("start to retry task for metadata report. retry times:" + times); + if (retry() && times > retryTimesIfNonFail) { + cancelRetryTask(); + } + if (times > retryLimit) { + cancelRetryTask(); + } + } catch (Throwable t) { // Defensive fault tolerance + logger.error( + COMMON_UNEXPECTED_EXCEPTION, + "", + "", + "Unexpected error occur at failed retry, cause: " + t.getMessage(), + t); + } + }, + 500, + retryPeriod, + TimeUnit.MILLISECONDS); + } + } + } + } + + void cancelRetryTask() { + if (retryScheduledFuture != null) { + retryScheduledFuture.cancel(false); + } + retryExecutor.shutdown(); + } + + void destroy() { + cancelRetryTask(); + } + + /** + * @deprecated only for test + */ + @Deprecated + ScheduledExecutorService getRetryExecutor() { + return retryExecutor; + } + } + + private void doSaveSubscriberData(SubscriberMetadataIdentifier subscriberMetadataIdentifier, List urls) { + if (CollectionUtils.isEmpty(urls)) { + return; + } + List encodedUrlList = new ArrayList<>(urls.size()); + for (String url : urls) { + encodedUrlList.add(URL.encode(url)); + } + doSaveSubscriberData(subscriberMetadataIdentifier, encodedUrlList); + } + + protected abstract void doStoreProviderMetadata( + MetadataIdentifier providerMetadataIdentifier, String serviceDefinitions); + + protected abstract void doStoreConsumerMetadata( + MetadataIdentifier consumerMetadataIdentifier, String serviceParameterString); + + protected abstract void doSaveMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url); + + protected abstract void doRemoveMetadata(ServiceMetadataIdentifier metadataIdentifier); + + protected abstract List doGetExportedURLs(ServiceMetadataIdentifier metadataIdentifier); + + protected abstract void doSaveSubscriberData( + SubscriberMetadataIdentifier subscriberMetadataIdentifier, String urlListStr); + + protected abstract String doGetSubscribedURLs(SubscriberMetadataIdentifier subscriberMetadataIdentifier); + + /** + * @deprecated only for unit test + */ + @Deprecated + protected ExecutorService getReportCacheExecutor() { + return reportCacheExecutor; + } + + /** + * @deprecated only for unit test + */ + @Deprecated + protected MetadataReportRetry getMetadataReportRetry() { + return metadataReportRetry; + } +} diff --git a/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java b/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java new file mode 100644 index 00000000..b2bb4186 --- /dev/null +++ b/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java @@ -0,0 +1,553 @@ +/* + * 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. + */ +package org.apache.dubbo.metadata.store.redis; + +import org.apache.dubbo.common.URL; +import org.apache.dubbo.common.config.configcenter.ConfigItem; +import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; +import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.common.utils.ConcurrentHashMapUtils; +import org.apache.dubbo.common.utils.ConcurrentHashSet; +import org.apache.dubbo.common.utils.JsonUtils; +import org.apache.dubbo.common.utils.StringUtils; +import org.apache.dubbo.metadata.MappingChangedEvent; +import org.apache.dubbo.metadata.MappingListener; +import org.apache.dubbo.metadata.MetadataInfo; +import org.apache.dubbo.metadata.ServiceNameMapping; +import org.apache.dubbo.metadata.report.identifier.BaseMetadataIdentifier; +import org.apache.dubbo.metadata.report.identifier.KeyTypeEnum; +import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier; +import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier; +import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier; +import org.apache.dubbo.metadata.report.support.AbstractMetadataReport; +import org.apache.dubbo.rpc.RpcException; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.commons.pool2.impl.GenericObjectPoolConfig; +import redis.clients.jedis.HostAndPort; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisCluster; +import redis.clients.jedis.JedisPool; +import redis.clients.jedis.JedisPoolConfig; +import redis.clients.jedis.JedisPubSub; +import redis.clients.jedis.Transaction; +import redis.clients.jedis.params.SetParams; +import redis.clients.jedis.util.JedisClusterCRC16; + +import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.CYCLE_REPORT_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_TIMEOUT; +import static org.apache.dubbo.common.constants.CommonConstants.GROUP_CHAR_SEPARATOR; +import static org.apache.dubbo.common.constants.CommonConstants.QUEUES_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY; +import static org.apache.dubbo.common.constants.LoggerCodeConstants.TRANSPORT_FAILED_RESPONSE; +import static org.apache.dubbo.metadata.MetadataConstants.META_DATA_STORE_TAG; +import static org.apache.dubbo.metadata.ServiceNameMapping.DEFAULT_MAPPING_GROUP; +import static org.apache.dubbo.metadata.ServiceNameMapping.getAppNames; +import static org.apache.dubbo.metadata.report.support.Constants.DEFAULT_METADATA_REPORT_CYCLE_REPORT; + +/** + * RedisMetadataReport + */ +public class RedisMetadataReport extends AbstractMetadataReport { + + private static final String REDIS_DATABASE_KEY = "database"; + private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(RedisMetadataReport.class); + + // protected , for test + protected JedisPool pool; + private Set jedisClusterNodes; + private int timeout; + private String password; + private final String root; + private final ConcurrentHashMap mappingDataListenerMap = new ConcurrentHashMap<>(); + private SetParams jedisParams = SetParams.setParams(); + + public RedisMetadataReport(URL url) { + super(url); + timeout = url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT); + password = url.getPassword(); + this.root = url.getGroup(DEFAULT_ROOT); + if (url.getParameter(CYCLE_REPORT_KEY, DEFAULT_METADATA_REPORT_CYCLE_REPORT)) { + // ttl default is twice the cycle-report time + jedisParams.ex(ONE_DAY_IN_MILLISECONDS * 2); + } + if (url.getParameter(CLUSTER_KEY, false)) { + jedisClusterNodes = new HashSet<>(); + List urls = url.getBackupUrls(); + for (URL tmpUrl : urls) { + jedisClusterNodes.add(new HostAndPort(tmpUrl.getHost(), tmpUrl.getPort())); + } + } else { + int database = url.getParameter(REDIS_DATABASE_KEY, 0); + pool = new JedisPool(new JedisPoolConfig(), url.getHost(), url.getPort(), timeout, password, database); + } + } + + @Override + protected void doStoreProviderMetadata(MetadataIdentifier providerMetadataIdentifier, String serviceDefinitions) { + this.storeMetadata(providerMetadataIdentifier, serviceDefinitions); + } + + @Override + protected void doStoreConsumerMetadata(MetadataIdentifier consumerMetadataIdentifier, String value) { + this.storeMetadata(consumerMetadataIdentifier, value); + } + + @Override + protected void doSaveMetadata(ServiceMetadataIdentifier serviceMetadataIdentifier, URL url) { + this.storeMetadata(serviceMetadataIdentifier, URL.encode(url.toFullString())); + } + + @Override + protected void doRemoveMetadata(ServiceMetadataIdentifier serviceMetadataIdentifier) { + this.deleteMetadata(serviceMetadataIdentifier); + } + + @Override + protected List doGetExportedURLs(ServiceMetadataIdentifier metadataIdentifier) { + String content = getMetadata(metadataIdentifier); + if (StringUtils.isEmpty(content)) { + return Collections.emptyList(); + } + return new ArrayList<>(Arrays.asList(URL.decode(content))); + } + + @Override + protected void doSaveSubscriberData(SubscriberMetadataIdentifier subscriberMetadataIdentifier, String urlListStr) { + this.storeMetadata(subscriberMetadataIdentifier, urlListStr); + } + + @Override + protected String doGetSubscribedURLs(SubscriberMetadataIdentifier subscriberMetadataIdentifier) { + return this.getMetadata(subscriberMetadataIdentifier); + } + + @Override + public String getServiceDefinition(MetadataIdentifier metadataIdentifier) { + return this.getMetadata(metadataIdentifier); + } + + private void storeMetadata(BaseMetadataIdentifier metadataIdentifier, String v) { + if (pool != null) { + storeMetadataStandalone(metadataIdentifier, v); + } else { + storeMetadataInCluster(metadataIdentifier, v); + } + } + + private void storeMetadataInCluster(BaseMetadataIdentifier metadataIdentifier, String v) { + try (JedisCluster jedisCluster = + new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) { + jedisCluster.set(metadataIdentifier.getIdentifierKey() + META_DATA_STORE_TAG, v, jedisParams); + } catch (Throwable e) { + String msg = + "Failed to put " + metadataIdentifier + " to redis cluster " + v + ", cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } + } + + private void storeMetadataStandalone(BaseMetadataIdentifier metadataIdentifier, String v) { + try (Jedis jedis = pool.getResource()) { + jedis.set(metadataIdentifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY), v, jedisParams); + } catch (Throwable e) { + String msg = "Failed to put " + metadataIdentifier + " to redis " + v + ", cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } + } + + private void deleteMetadata(BaseMetadataIdentifier metadataIdentifier) { + if (pool != null) { + deleteMetadataStandalone(metadataIdentifier); + } else { + deleteMetadataInCluster(metadataIdentifier); + } + } + + private void deleteMetadataInCluster(BaseMetadataIdentifier metadataIdentifier) { + try (JedisCluster jedisCluster = + new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) { + jedisCluster.del(metadataIdentifier.getIdentifierKey() + META_DATA_STORE_TAG); + } catch (Throwable e) { + String msg = "Failed to delete " + metadataIdentifier + " from redis cluster , cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } + } + + private void deleteMetadataStandalone(BaseMetadataIdentifier metadataIdentifier) { + try (Jedis jedis = pool.getResource()) { + jedis.del(metadataIdentifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY)); + } catch (Throwable e) { + String msg = "Failed to delete " + metadataIdentifier + " from redis , cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } + } + + private String getMetadata(BaseMetadataIdentifier metadataIdentifier) { + if (pool != null) { + return getMetadataStandalone(metadataIdentifier); + } else { + return getMetadataInCluster(metadataIdentifier); + } + } + + private String getMetadataInCluster(BaseMetadataIdentifier metadataIdentifier) { + try (JedisCluster jedisCluster = + new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) { + return jedisCluster.get(metadataIdentifier.getIdentifierKey() + META_DATA_STORE_TAG); + } catch (Throwable e) { + String msg = "Failed to get " + metadataIdentifier + " from redis cluster , cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } + } + + private String getMetadataStandalone(BaseMetadataIdentifier metadataIdentifier) { + try (Jedis jedis = pool.getResource()) { + return jedis.get(metadataIdentifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY)); + } catch (Throwable e) { + String msg = "Failed to get " + metadataIdentifier + " from redis , cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } + } + + /** + * Store class and application names using Redis hashes + * key: default 'dubbo:mapping' + * field: class (serviceInterface) + * value: application_names + * @param serviceInterface field(class) + * @param defaultMappingGroup {@link ServiceNameMapping#DEFAULT_MAPPING_GROUP} + * @param newConfigContent new application_names + * @param ticket previous application_names + * @return + */ + @Override + public boolean registerServiceAppMapping( + String serviceInterface, String defaultMappingGroup, String newConfigContent, Object ticket) { + try { + if (null != ticket && !(ticket instanceof String)) { + throw new IllegalArgumentException("redis publishConfigCas requires stat type ticket"); + } + String pathKey = buildMappingKey(defaultMappingGroup); + + return storeMapping(pathKey, serviceInterface, newConfigContent, (String) ticket); + } catch (Exception e) { + logger.warn(TRANSPORT_FAILED_RESPONSE, "", "", "redis publishConfigCas failed.", e); + return false; + } + } + + private boolean storeMapping(String key, String field, String value, String ticket) { + if (pool != null) { + return storeMappingStandalone(key, field, value, ticket); + } else { + return storeMappingInCluster(key, field, value, ticket); + } + } + + /** + * use 'watch' to implement cas. + * Find information about slot distribution by key. + */ + private boolean storeMappingInCluster(String key, String field, String value, String ticket) { + try (JedisCluster jedisCluster = + new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) { + Jedis jedis = new Jedis(jedisCluster.getConnectionFromSlot(JedisClusterCRC16.getSlot(key))); + jedis.watch(key); + String oldValue = jedis.hget(key, field); + if (null == oldValue || null == ticket || oldValue.equals(ticket)) { + Transaction transaction = jedis.multi(); + transaction.hset(key, field, value); + List result = transaction.exec(); + if (null != result) { + jedisCluster.publish(buildPubSubKey(), field); + return true; + } + } else { + jedis.unwatch(); + } + jedis.close(); + } catch (Throwable e) { + String msg = "Failed to put " + key + ":" + field + " to redis " + value + ", cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } + return false; + } + + /** + * use 'watch' to implement cas. + * Find information about slot distribution by key. + */ + private boolean storeMappingStandalone(String key, String field, String value, String ticket) { + try (Jedis jedis = pool.getResource()) { + jedis.watch(key); + String oldValue = jedis.hget(key, field); + if (null == oldValue || null == ticket || oldValue.equals(ticket)) { + Transaction transaction = jedis.multi(); + transaction.hset(key, field, value); + List result = transaction.exec(); + if (null != result) { + jedis.publish(buildPubSubKey(), field); + return true; + } + } + jedis.unwatch(); + } catch (Throwable e) { + String msg = "Failed to put " + key + ":" + field + " to redis " + value + ", cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } + return false; + } + + /** + * build mapping key + * @param defaultMappingGroup {@link ServiceNameMapping#DEFAULT_MAPPING_GROUP} + * @return + */ + private String buildMappingKey(String defaultMappingGroup) { + return this.root + GROUP_CHAR_SEPARATOR + defaultMappingGroup; + } + + /** + * build pub/sub key + */ + private String buildPubSubKey() { + return buildMappingKey(DEFAULT_MAPPING_GROUP) + GROUP_CHAR_SEPARATOR + QUEUES_KEY; + } + + /** + * get content and use content to complete cas + * @param serviceKey class + * @param group {@link ServiceNameMapping#DEFAULT_MAPPING_GROUP} + */ + @Override + public ConfigItem getConfigItem(String serviceKey, String group) { + String key = buildMappingKey(group); + String content = getMappingData(key, serviceKey); + + return new ConfigItem(content, content); + } + + /** + * get current application_names + */ + private String getMappingData(String key, String field) { + if (pool != null) { + return getMappingDataStandalone(key, field); + } else { + return getMappingDataInCluster(key, field); + } + } + + private String getMappingDataInCluster(String key, String field) { + try (JedisCluster jedisCluster = + new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) { + return jedisCluster.hget(key, field); + } catch (Throwable e) { + String msg = "Failed to get " + key + ":" + field + " from redis cluster , cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } + } + + private String getMappingDataStandalone(String key, String field) { + try (Jedis jedis = pool.getResource()) { + return jedis.hget(key, field); + } catch (Throwable e) { + String msg = "Failed to get " + key + ":" + field + " from redis , cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } + } + + /** + * remove listener. If have no listener,thread will dead + */ + @Override + public void removeServiceAppMappingListener(String serviceKey, MappingListener listener) { + MappingDataListener mappingDataListener = mappingDataListenerMap.get(buildPubSubKey()); + if (null != mappingDataListener) { + NotifySub notifySub = mappingDataListener.getNotifySub(); + notifySub.removeListener(serviceKey, listener); + if (notifySub.isEmpty()) { + mappingDataListener.shutdown(); + } + } + } + + /** + * Start a thread and subscribe to {@link this#buildPubSubKey()}. + * Notify {@link MappingListener} if there is a change in the 'application_names' message. + */ + @Override + public Set getServiceAppMapping(String serviceKey, MappingListener listener, URL url) { + MappingDataListener mappingDataListener = + ConcurrentHashMapUtils.computeIfAbsent(mappingDataListenerMap, buildPubSubKey(), k -> { + MappingDataListener dataListener = new MappingDataListener(buildPubSubKey()); + dataListener.start(); + return dataListener; + }); + mappingDataListener.getNotifySub().addListener(serviceKey, listener); + return this.getServiceAppMapping(serviceKey, url); + } + + @Override + public Set getServiceAppMapping(String serviceKey, URL url) { + String key = buildMappingKey(DEFAULT_MAPPING_GROUP); + return getAppNames(getMappingData(key, serviceKey)); + } + + @Override + public MetadataInfo getAppMetadata(SubscriberMetadataIdentifier identifier, Map instanceMetadata) { + String content = this.getMetadata(identifier); + return JsonUtils.toJavaObject(content, MetadataInfo.class); + } + + @Override + public void publishAppMetadata(SubscriberMetadataIdentifier identifier, MetadataInfo metadataInfo) { + this.storeMetadata(identifier, metadataInfo.getContent()); + } + + @Override + public void unPublishAppMetadata(SubscriberMetadataIdentifier identifier, MetadataInfo metadataInfo) { + this.deleteMetadata(identifier); + } + + // for test + public MappingDataListener getMappingDataListener() { + return mappingDataListenerMap.get(buildPubSubKey()); + } + + /** + * Listen for changes in the 'application_names' message and notify the listener. + */ + class NotifySub extends JedisPubSub { + + private final Map> listeners = new ConcurrentHashMap<>(); + + public void addListener(String key, MappingListener listener) { + Set listenerSet = listeners.computeIfAbsent(key, k -> new ConcurrentHashSet<>()); + listenerSet.add(listener); + } + + public void removeListener(String serviceKey, MappingListener listener) { + Set listenerSet = this.listeners.get(serviceKey); + if (listenerSet != null) { + listenerSet.remove(listener); + if (listenerSet.isEmpty()) { + this.listeners.remove(serviceKey); + } + } + } + + public Boolean isEmpty() { + return this.listeners.isEmpty(); + } + + @Override + public void onMessage(String key, String msg) { + logger.info("sub from redis:" + key + " message:" + msg); + String applicationNames = getMappingData(buildMappingKey(DEFAULT_MAPPING_GROUP), msg); + MappingChangedEvent mappingChangedEvent = new MappingChangedEvent(msg, getAppNames(applicationNames)); + if (!listeners.get(msg).isEmpty()) { + for (MappingListener mappingListener : listeners.get(msg)) { + mappingListener.onEvent(mappingChangedEvent); + } + } + } + + @Override + public void onPMessage(String pattern, String key, String msg) { + onMessage(key, msg); + } + + @Override + public void onPSubscribe(String pattern, int subscribedChannels) { + super.onPSubscribe(pattern, subscribedChannels); + } + } + + /** + * Subscribe application names change message. + */ + class MappingDataListener extends Thread { + + private String path; + + private final NotifySub notifySub = new NotifySub(); + // for test + protected volatile boolean running = true; + + public MappingDataListener(String path) { + this.path = path; + } + + public NotifySub getNotifySub() { + return notifySub; + } + + @Override + public void run() { + while (running) { + if (pool != null) { + try (Jedis jedis = pool.getResource()) { + jedis.subscribe(notifySub, path); + } catch (Throwable e) { + String msg = "Failed to subscribe " + path + ", cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } + } else { + try (JedisCluster jedisCluster = new JedisCluster( + jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) { + jedisCluster.subscribe(notifySub, path); + } catch (Throwable e) { + String msg = "Failed to subscribe " + path + ", cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + throw new RpcException(msg, e); + } + } + } + } + + public void shutdown() { + try { + running = false; + notifySub.unsubscribe(path); + } catch (Throwable e) { + String msg = "Failed to unsubscribe " + path + ", cause: " + e.getMessage(); + logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e); + } + } + } +} diff --git a/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/config/CustomBeanFactoryPostProcessor.java b/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/config/CustomBeanFactoryPostProcessor.java index 0384cd7e..ef28564d 100644 --- a/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/config/CustomBeanFactoryPostProcessor.java +++ b/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/config/CustomBeanFactoryPostProcessor.java @@ -16,27 +16,44 @@ import java.net.InetAddress; */ public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor, Ordered { - @Override - public int getOrder() { - return Ordered.HIGHEST_PRECEDENCE; - } + /** + * 获取该 BeanFactoryPostProcessor 的顺序,确保它在容器初始化过程中具有最高优先级 + * + * @return 优先级顺序值,越小优先级越高 + */ + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE; + } + /** + * 在 Spring 容器初始化过程中对 Bean 工厂进行后置处理 + * + * @param beanFactory 可配置的 Bean 工厂 + * @throws BeansException 如果在处理过程中发生错误 + */ @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + // 获取 InetUtils bean,用于获取 IP 地址 InetUtils inetUtils = beanFactory.getBean(InetUtils.class); String ip = "127.0.0.1"; + // 获取第一个非回环地址 InetAddress address = inetUtils.findFirstNonLoopbackAddress(); if (address != null) { if (address instanceof Inet6Address) { + // 处理 IPv6 地址 String ipv6AddressString = address.getHostAddress(); if (ipv6AddressString.contains("%")) { + // 去掉可能存在的范围 ID ipv6AddressString = ipv6AddressString.substring(0, ipv6AddressString.indexOf("%")); } ip = ipv6AddressString; } else { + // 处理 IPv4 地址 ip = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress(); } } + // 设置系统属性 DUBBO_IP_TO_REGISTRY 为获取到的 IP 地址 System.setProperty("DUBBO_IP_TO_REGISTRY", ip); } } diff --git a/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/config/DubboConfiguration.java b/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/config/DubboConfiguration.java index 9d50dd82..9e88785a 100644 --- a/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/config/DubboConfiguration.java +++ b/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/config/DubboConfiguration.java @@ -16,6 +16,9 @@ import org.springframework.context.annotation.PropertySource; @PropertySource(value = "classpath:common-dubbo.yml", factory = YmlPropertySourceFactory.class) public class DubboConfiguration { + /** + * dubbo自定义IP注入(避免IP不正确问题) + */ @Bean public BeanFactoryPostProcessor customBeanFactoryPostProcessor() { return new CustomBeanFactoryPostProcessor(); diff --git a/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/enumd/RequestLogEnum.java b/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/enumd/RequestLogEnum.java index f238eebd..950114e7 100644 --- a/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/enumd/RequestLogEnum.java +++ b/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/enumd/RequestLogEnum.java @@ -11,8 +11,18 @@ import lombok.AllArgsConstructor; public enum RequestLogEnum { /** - * info 基础信息 param 参数信息 full 全部 + * info 基础信息 */ - INFO, PARAM, FULL; + INFO, + + /** + * param 参数信息 + */ + PARAM, + + /** + * full 全部 + */ + FULL; } diff --git a/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/filter/DubboRequestFilter.java b/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/filter/DubboRequestFilter.java index 382dc94e..273155e2 100644 --- a/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/filter/DubboRequestFilter.java +++ b/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/filter/DubboRequestFilter.java @@ -1,17 +1,28 @@ package org.dromara.common.dubbo.filter; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.dubbo.enumd.RequestLogEnum; -import org.dromara.common.dubbo.properties.DubboCustomProperties; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.rpc.*; import org.apache.dubbo.rpc.service.GenericService; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.dubbo.enumd.RequestLogEnum; +import org.dromara.common.dubbo.properties.DubboCustomProperties; import org.dromara.common.json.utils.JsonUtils; /** - * dubbo日志过滤器 + * Dubbo 日志过滤器 + *

+ * 该过滤器通过实现 Dubbo 的 Filter 接口,在服务调用前后记录日志信息 + * 可根据配置开关和日志级别输出不同详细程度的日志信息 + *

+ * 激活条件: + * - 在 Provider 和 Consumer 端都生效 + * - 执行顺序设置为最大值,确保在所有其他过滤器之后执行 + *

+ * 使用 SpringUtils 获取配置信息,根据配置决定是否记录日志及日志详细程度 + *

+ * 使用 Lombok 的 @Slf4j 注解简化日志记录 * * @author Lion Li */ @@ -19,33 +30,48 @@ import org.dromara.common.json.utils.JsonUtils; @Activate(group = {CommonConstants.PROVIDER, CommonConstants.CONSUMER}, order = Integer.MAX_VALUE) public class DubboRequestFilter implements Filter { + /** + * Dubbo Filter 接口实现方法,处理服务调用逻辑并记录日志 + * + * @param invoker Dubbo 服务调用者实例 + * @param invocation 调用的具体方法信息 + * @return 调用结果 + * @throws RpcException 如果调用过程中发生异常 + */ @Override public Result invoke(Invoker invoker, Invocation invocation) throws RpcException { DubboCustomProperties properties = SpringUtils.getBean(DubboCustomProperties.class); + // 如果未开启请求日志记录,则直接执行服务调用并返回结果 if (!properties.getRequestLog()) { - // 未开启则跳过日志逻辑 return invoker.invoke(invocation); } + + // 判断是 Provider 还是 Consumer String client = CommonConstants.PROVIDER; if (RpcContext.getServiceContext().isConsumerSide()) { client = CommonConstants.CONSUMER; } + + // 构建基础日志信息 String baselog = "Client[" + client + "],InterfaceName=[" + invocation.getInvoker().getInterface().getSimpleName() + "],MethodName=[" + invocation.getMethodName() + "]"; + // 根据日志级别输出不同详细程度的日志信息 if (properties.getLogLevel() == RequestLogEnum.INFO) { log.info("DUBBO - 服务调用: {}", baselog); } else { log.info("DUBBO - 服务调用: {},Parameter={}", baselog, invocation.getArguments()); } + // 记录调用开始时间 long startTime = System.currentTimeMillis(); // 执行接口调用逻辑 Result result = invoker.invoke(invocation); - // 调用耗时 + // 计算调用耗时 long elapsed = System.currentTimeMillis() - startTime; - // 如果发生异常 则打印异常日志 + // 如果发生异常且调用的是泛化服务,则记录异常日志 if (result.hasException() && invoker.getInterface().equals(GenericService.class)) { log.error("DUBBO - 服务异常: {},Exception={}", baselog, result.getException()); } else { + // 根据日志级别输出服务响应信息 if (properties.getLogLevel() == RequestLogEnum.INFO) { log.info("DUBBO - 服务响应: {},SpendTime=[{}ms]", baselog, elapsed); } else if (properties.getLogLevel() == RequestLogEnum.FULL) { diff --git a/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/properties/DubboCustomProperties.java b/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/properties/DubboCustomProperties.java index 89180886..e0df2cd7 100644 --- a/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/properties/DubboCustomProperties.java +++ b/ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/properties/DubboCustomProperties.java @@ -15,8 +15,14 @@ import org.springframework.cloud.context.config.annotation.RefreshScope; @ConfigurationProperties(prefix = "dubbo.custom") public class DubboCustomProperties { + /** + * 是否开启请求日志记录 + */ private Boolean requestLog; + /** + * 日志级别 + */ private RequestLogEnum logLevel; } diff --git a/ruoyi-common/ruoyi-common-dubbo/src/main/resources/common-dubbo.yml b/ruoyi-common/ruoyi-common-dubbo/src/main/resources/common-dubbo.yml index 45324774..e7035f1a 100644 --- a/ruoyi-common/ruoyi-common-dubbo/src/main/resources/common-dubbo.yml +++ b/ruoyi-common/ruoyi-common-dubbo/src/main/resources/common-dubbo.yml @@ -19,6 +19,14 @@ dubbo: password: ${spring.cloud.nacos.password} parameters: namespace: ${spring.profiles.active} + metadata-report: + address: redis://${spring.data.redis.host}:${spring.data.redis.port} + group: DUBBO_GROUP + username: dubbo + password: ${spring.data.redis.password} + parameters: + namespace: ${spring.profiles.active} + database: ${spring.data.redis.database} # 消费者相关配置 consumer: # 结果缓存(LRU算法) diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java index 7fe20bc4..ce3fc04e 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/aspect/LogAspect.java @@ -56,7 +56,7 @@ public class LogAspect { * 处理请求前执行 */ @Before(value = "@annotation(controllerLog)") - public void boBefore(JoinPoint joinPoint, Log controllerLog) { + public void doBefore(JoinPoint joinPoint, Log controllerLog) { StopWatch stopWatch = new StopWatch(); KEY_CACHE.set(stopWatch); stopWatch.start(); diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java index aca470fd..f8c5cd00 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataColumn.java @@ -3,9 +3,10 @@ package org.dromara.common.mybatis.annotation; import java.lang.annotation.*; /** - * 数据权限 - * + * 数据权限注解,用于标记数据权限的占位符关键字和替换值 + *

* 一个注解只能对应一个模板 + *

* * @author Lion Li * @version 3.5.0 @@ -16,12 +17,16 @@ import java.lang.annotation.*; public @interface DataColumn { /** - * 占位符关键字 + * 数据权限模板的占位符关键字,默认为 "deptName" + * + * @return 占位符关键字数组 */ String[] key() default "deptName"; /** - * 占位符替换值 + * 数据权限模板的占位符替换值,默认为 "dept_id" + * + * @return 占位符替换值数组 */ String[] value() default "dept_id"; diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java index f4351e38..6fd3c3e0 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/annotation/DataPermission.java @@ -3,7 +3,7 @@ package org.dromara.common.mybatis.annotation; import java.lang.annotation.*; /** - * 数据权限组 + * 数据权限组注解,用于标记数据权限配置数组 * * @author Lion Li * @version 3.5.0 @@ -13,6 +13,11 @@ import java.lang.annotation.*; @Documented public @interface DataPermission { + /** + * 数据权限配置数组,用于指定数据权限的占位符关键字和替换值 + * + * @return 数据权限配置数组 + */ DataColumn[] value(); } diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java index 820b49af..13a79416 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/domain/BaseEntity.java @@ -17,7 +17,6 @@ import java.util.Map; * * @author Lion Li */ - @Data public class BaseEntity implements Serializable { diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java index 00411984..12290903 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java @@ -34,73 +34,129 @@ public interface BaseMapperPlus extends BaseMapper { Log log = LogFactory.getLog(BaseMapperPlus.class); + /** + * 获取当前类的泛型类型 V 的 Class 对象 + *

+ * 该方法使用反射机制从当前类(继承自 BaseMapperPlus 类)的泛型参数中获取第一个泛型类型 V 的 Class 对象 + * + * @return 当前类的泛型类型 V 的 Class 对象 + */ default Class currentVoClass() { return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 1); } + /** + * 获取当前类的泛型类型 T 的 Class 对象 + *

+ * 该方法使用反射机制从当前类(继承自 BaseMapperPlus 类)的泛型参数中获取第一个泛型类型 T 的 Class 对象 + * + * @return 当前类的泛型类型 T 的 Class 对象 + */ default Class currentModelClass() { return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 0); } + /** + * 使用默认的查询条件查询并返回结果列表 + * + * @return 返回查询结果的列表 + */ default List selectList() { return this.selectList(new QueryWrapper<>()); } /** - * 批量插入 + * 批量插入实体对象集合 + * + * @param entityList 实体对象集合 + * @return 插入操作是否成功的布尔值 */ default boolean insertBatch(Collection entityList) { - return Db.saveBatch(entityList); + Db.saveBatch(entityList); + // 临时解决 新版本 mp 插入状态判断错误问题 + return true; } /** - * 批量更新 + * 批量根据ID更新实体对象集合 + * + * @param entityList 实体对象集合 + * @return 更新操作是否成功的布尔值 */ default boolean updateBatchById(Collection entityList) { - return Db.updateBatchById(entityList); + Db.updateBatchById(entityList); + // 临时解决 新版本 mp 插入状态判断错误问题 + return true; } /** - * 批量插入或更新 + * 批量插入或更新实体对象集合 + * + * @param entityList 实体对象集合 + * @return 插入或更新操作是否成功的布尔值 */ default boolean insertOrUpdateBatch(Collection entityList) { - return Db.saveOrUpdateBatch(entityList); + Db.saveOrUpdateBatch(entityList); + // 临时解决 新版本 mp 插入状态判断错误问题 + return true; } /** - * 批量插入(包含限制条数) + * 批量插入实体对象集合并指定批处理大小 + * + * @param entityList 实体对象集合 + * @param batchSize 批处理大小 + * @return 插入操作是否成功的布尔值 */ default boolean insertBatch(Collection entityList, int batchSize) { - return Db.saveBatch(entityList, batchSize); + Db.saveBatch(entityList, batchSize); + // 临时解决 新版本 mp 插入状态判断错误问题 + return true; } /** - * 批量更新(包含限制条数) + * 批量根据ID更新实体对象集合并指定批处理大小 + * + * @param entityList 实体对象集合 + * @param batchSize 批处理大小 + * @return 更新操作是否成功的布尔值 */ default boolean updateBatchById(Collection entityList, int batchSize) { - return Db.updateBatchById(entityList, batchSize); + Db.updateBatchById(entityList, batchSize); + // 临时解决 新版本 mp 插入状态判断错误问题 + return true; } /** - * 批量插入或更新(包含限制条数) + * 批量插入或更新实体对象集合并指定批处理大小 + * + * @param entityList 实体对象集合 + * @param batchSize 批处理大小 + * @return 插入或更新操作是否成功的布尔值 */ default boolean insertOrUpdateBatch(Collection entityList, int batchSize) { - return Db.saveOrUpdateBatch(entityList, batchSize); + Db.saveOrUpdateBatch(entityList, batchSize); + // 临时解决 新版本 mp 插入状态判断错误问题 + return true; } /** - * 插入或更新(包含限制条数) + * 根据ID查询单个VO对象 + * + * @param id 主键ID + * @return 查询到的单个VO对象 */ - default boolean insertOrUpdate(T entity) { - return Db.saveOrUpdate(entity); - } - default V selectVoById(Serializable id) { return selectVoById(id, this.currentVoClass()); } /** - * 根据 ID 查询 + * 根据ID查询单个VO对象并将其转换为指定的VO类 + * + * @param id 主键ID + * @param voClass 要转换的VO类的Class对象 + * @param VO类的类型 + * @return 查询到的单个VO对象,经过转换为指定的VO类后返回 */ default C selectVoById(Serializable id, Class voClass) { T obj = this.selectById(id); @@ -110,12 +166,23 @@ public interface BaseMapperPlus extends BaseMapper { return MapstructUtils.convert(obj, voClass); } + /** + * 根据ID集合批量查询VO对象列表 + * + * @param idList 主键ID集合 + * @return 查询到的VO对象列表 + */ default List selectVoBatchIds(Collection idList) { return selectVoBatchIds(idList, this.currentVoClass()); } /** - * 查询(根据ID 批量查询) + * 根据ID集合批量查询实体对象列表,并将其转换为指定的VO对象列表 + * + * @param idList 主键ID集合 + * @param voClass 要转换的VO类的Class对象 + * @param VO类的类型 + * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 */ default List selectVoBatchIds(Collection idList, Class voClass) { List list = this.selectBatchIds(idList); @@ -125,12 +192,23 @@ public interface BaseMapperPlus extends BaseMapper { return MapstructUtils.convert(list, voClass); } + /** + * 根据查询条件Map查询VO对象列表 + * + * @param map 查询条件Map + * @return 查询到的VO对象列表 + */ default List selectVoByMap(Map map) { return selectVoByMap(map, this.currentVoClass()); } /** - * 查询(根据 columnMap 条件) + * 根据查询条件Map查询实体对象列表,并将其转换为指定的VO对象列表 + * + * @param map 查询条件Map + * @param voClass 要转换的VO类的Class对象 + * @param VO类的类型 + * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 */ default List selectVoByMap(Map map, Class voClass) { List list = this.selectByMap(map); @@ -140,16 +218,34 @@ public interface BaseMapperPlus extends BaseMapper { return MapstructUtils.convert(list, voClass); } + /** + * 根据条件查询单个VO对象 + * + * @param wrapper 查询条件Wrapper + * @return 查询到的单个VO对象 + */ default V selectVoOne(Wrapper wrapper) { return selectVoOne(wrapper, this.currentVoClass()); } + /** + * 根据条件查询单个VO对象,并根据需要决定是否抛出异常 + * + * @param wrapper 查询条件Wrapper + * @param throwEx 是否抛出异常的标志 + * @return 查询到的单个VO对象 + */ default V selectVoOne(Wrapper wrapper, boolean throwEx) { return selectVoOne(wrapper, this.currentVoClass(), throwEx); } /** - * 根据 entity 条件,查询一条记录 + * 根据条件查询单个VO对象,并指定返回的VO对象的类型 + * + * @param wrapper 查询条件Wrapper + * @param voClass 返回的VO对象的Class对象 + * @param 返回的VO对象的类型 + * @return 查询到的单个VO对象,经过类型转换为指定的VO类后返回 */ default C selectVoOne(Wrapper wrapper, Class voClass) { T obj = this.selectOne(wrapper); @@ -160,7 +256,13 @@ public interface BaseMapperPlus extends BaseMapper { } /** - * 根据 entity 条件,查询一条记录 + * 根据条件查询单个实体对象,并将其转换为指定的VO对象 + * + * @param wrapper 查询条件Wrapper + * @param voClass 要转换的VO类的Class对象 + * @param throwEx 是否抛出异常的标志 + * @param VO类的类型 + * @return 查询到的单个VO对象,经过转换为指定的VO类后返回 */ default C selectVoOne(Wrapper wrapper, Class voClass, boolean throwEx) { T obj = this.selectOne(wrapper, throwEx); @@ -170,16 +272,32 @@ public interface BaseMapperPlus extends BaseMapper { return MapstructUtils.convert(obj, voClass); } + /** + * 查询所有VO对象列表 + * + * @return 查询到的VO对象列表 + */ default List selectVoList() { return selectVoList(new QueryWrapper<>(), this.currentVoClass()); } + /** + * 根据条件查询VO对象列表 + * + * @param wrapper 查询条件Wrapper + * @return 查询到的VO对象列表 + */ default List selectVoList(Wrapper wrapper) { return selectVoList(wrapper, this.currentVoClass()); } /** - * 根据 entity 条件,查询全部记录 + * 根据条件查询实体对象列表,并将其转换为指定的VO对象列表 + * + * @param wrapper 查询条件Wrapper + * @param voClass 要转换的VO类的Class对象 + * @param VO类的类型 + * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 */ default List selectVoList(Wrapper wrapper, Class voClass) { List list = this.selectList(wrapper); @@ -189,15 +307,31 @@ public interface BaseMapperPlus extends BaseMapper { return MapstructUtils.convert(list, voClass); } + /** + * 根据条件分页查询VO对象列表 + * + * @param page 分页信息 + * @param wrapper 查询条件Wrapper + * @return 查询到的VO对象分页列表 + */ default

> P selectVoPage(IPage page, Wrapper wrapper) { return selectVoPage(page, wrapper, this.currentVoClass()); } /** - * 分页查询VO + * 根据条件分页查询实体对象列表,并将其转换为指定的VO对象分页列表 + * + * @param page 分页信息 + * @param wrapper 查询条件Wrapper + * @param voClass 要转换的VO类的Class对象 + * @param VO类的类型 + * @param

VO对象分页列表的类型 + * @return 查询到的VO对象分页列表,经过转换为指定的VO类后返回 */ default > P selectVoPage(IPage page, Wrapper wrapper, Class voClass) { + // 根据条件分页查询实体对象列表 List list = this.selectList(page, wrapper); + // 创建一个新的VO对象分页列表,并设置分页信息 IPage voPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal()); if (CollUtil.isEmpty(list)) { return (P) voPage; @@ -206,6 +340,14 @@ public interface BaseMapperPlus extends BaseMapper { return (P) voPage; } + /** + * 根据条件查询符合条件的对象,并将其转换为指定类型的对象列表 + * + * @param wrapper 查询条件Wrapper + * @param mapper 转换函数,用于将查询到的对象转换为指定类型的对象 + * @param 要转换的对象的类型 + * @return 查询到的符合条件的对象列表,经过转换为指定类型的对象后返回 + */ default List selectObjs(Wrapper wrapper, Function mapper) { return this.selectObjs(wrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList()); } diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java index f66fd165..31be8dd4 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java @@ -20,7 +20,6 @@ import java.util.List; * * @author Lion Li */ - @Data @NoArgsConstructor public class PageQuery implements Serializable { @@ -58,6 +57,9 @@ public class PageQuery implements Serializable { */ public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE; + /** + * 构建分页对象 + */ public Page build() { Integer pageNum = ObjectUtil.defaultIfNull(getPageNum(), DEFAULT_PAGE_NUM); Integer pageSize = ObjectUtil.defaultIfNull(getPageSize(), DEFAULT_PAGE_SIZE); diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java index a4b67997..8ecfb54a 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java @@ -14,7 +14,6 @@ import java.util.List; * * @author Lion Li */ - @Data @NoArgsConstructor public class TableDataInfo implements Serializable { @@ -53,6 +52,9 @@ public class TableDataInfo implements Serializable { this.total = total; } + /** + * 根据分页对象构建表格分页数据对象 + */ public static TableDataInfo build(IPage page) { TableDataInfo rspData = new TableDataInfo<>(); rspData.setCode(HttpStatus.HTTP_OK); @@ -62,6 +64,9 @@ public class TableDataInfo implements Serializable { return rspData; } + /** + * 根据数据列表构建表格分页数据对象 + */ public static TableDataInfo build(List list) { TableDataInfo rspData = new TableDataInfo<>(); rspData.setCode(HttpStatus.HTTP_OK); @@ -71,6 +76,9 @@ public class TableDataInfo implements Serializable { return rspData; } + /** + * 构建表格分页数据对象 + */ public static TableDataInfo build() { TableDataInfo rspData = new TableDataInfo<>(); rspData.setCode(HttpStatus.HTTP_OK); diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java index 93487e94..5084424e 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataBaseType.java @@ -1,8 +1,8 @@ package org.dromara.common.mybatis.enums; -import org.dromara.common.core.utils.StringUtils; import lombok.AllArgsConstructor; import lombok.Getter; +import org.dromara.common.core.utils.StringUtils; /** * 数据库类型 @@ -33,8 +33,17 @@ public enum DataBaseType { */ SQL_SERVER("Microsoft SQL Server"); + /** + * 数据库类型 + */ private final String type; + /** + * 根据数据库产品名称查找对应的数据库类型 + * + * @param databaseProductName 数据库产品名称 + * @return 对应的数据库类型枚举值,如果未找到则返回 null + */ public static DataBaseType find(String databaseProductName) { if (StringUtils.isBlank(databaseProductName)) { return null; diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java index 9ea66b0a..a67395fa 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/enums/DataScopeType.java @@ -1,19 +1,23 @@ package org.dromara.common.mybatis.enums; -import org.dromara.common.core.utils.StringUtils; import lombok.AllArgsConstructor; import lombok.Getter; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.helper.DataPermissionHelper; +import org.dromara.common.mybatis.service.SysDataScopeService; +import org.dromara.system.api.model.LoginUser; /** - * 数据权限类型 + * 数据权限类型枚举 *

- * 语法支持 spel 模板表达式 - *

- * 内置数据 user 当前用户 内容参考 LoginUser - * 如需扩展数据 可使用 {@link DataPermissionHelper} 操作 - * 内置服务 sdss 系统数据权限服务 内容参考 SysDataScopeService - * 如需扩展更多自定义服务 可以参考 sdss 自行编写 + * 支持使用 SpEL 模板表达式定义 SQL 查询条件 + * 内置数据: + * - {@code user}: 当前登录用户信息,参考 {@link LoginUser} + * 内置服务: + * - {@code sdss}: 系统数据权限服务,参考 {@link SysDataScopeService} + * 如需扩展数据,可以通过 {@link DataPermissionHelper} 进行操作 + * 如需扩展服务,可以通过 {@link SysDataScopeService} 自行编写 + *

* * @author Lion Li * @version 3.5.0 @@ -29,36 +33,50 @@ public enum DataScopeType { /** * 自定数据权限 + * 使用 SpEL 表达式:`#{#deptName} IN ( #{@sdss.getRoleCustom( #user.roleId )} )` + * 如果不满足条件,则使用默认 SQL 表达式:`1 = 0` */ CUSTOM("2", " #{#deptName} IN ( #{@sdss.getRoleCustom( #user.roleId )} ) ", " 1 = 0 "), /** * 部门数据权限 + * 使用 SpEL 表达式:`#{#deptName} = #{#user.deptId}` + * 如果不满足条件,则使用默认 SQL 表达式:`1 = 0` */ DEPT("3", " #{#deptName} = #{#user.deptId} ", " 1 = 0 "), /** * 部门及以下数据权限 + * 使用 SpEL 表达式:`#{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )}` + * 如果不满足条件,则使用默认 SQL 表达式:`1 = 0` */ DEPT_AND_CHILD("4", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} )", " 1 = 0 "), /** * 仅本人数据权限 + * 使用 SpEL 表达式:`#{#userName} = #{#user.userId}` + * 如果不满足条件,则使用默认 SQL 表达式:`1 = 0` */ SELF("5", " #{#userName} = #{#user.userId} ", " 1 = 0 "); private final String code; /** - * 语法 采用 spel 模板表达式 + * SpEL 模板表达式,用于构建 SQL 条件 */ private final String sqlTemplate; /** - * 不满足 sqlTemplate 则填充 + * 如果不满足 {@code sqlTemplate} 的条件,则使用此默认 SQL 表达式 */ private final String elseSql; + /** + * 根据枚举代码查找对应的枚举值 + * + * @param code 枚举代码 + * @return 对应的枚举值,如果未找到则返回 null + */ public static DataScopeType findCode(String code) { if (StringUtils.isBlank(code)) { return null; diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java index ce754733..f6b2b121 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java @@ -20,22 +20,28 @@ import java.util.Date; @Slf4j public class InjectionMetaObjectHandler implements MetaObjectHandler { + /** + * 插入填充方法,用于在插入数据时自动填充实体对象中的创建时间、更新时间、创建人、更新人等信息 + * + * @param metaObject 元对象,用于获取原始对象并进行填充 + */ @Override public void insertFill(MetaObject metaObject) { try { - if (ObjectUtil.isNotNull(metaObject) - && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) { + if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) { + // 获取当前时间作为创建时间和更新时间,如果创建时间不为空,则使用创建时间,否则使用当前时间 Date current = ObjectUtil.isNotNull(baseEntity.getCreateTime()) ? baseEntity.getCreateTime() : new Date(); baseEntity.setCreateTime(current); baseEntity.setUpdateTime(current); + + // 如果创建人为空,则填充当前登录用户的信息 if (ObjectUtil.isNull(baseEntity.getCreateBy())) { LoginUser loginUser = getLoginUser(); if (ObjectUtil.isNotNull(loginUser)) { Long userId = loginUser.getUserId(); - // 当前已登录 且 创建人为空 则填充 + // 填充创建人、更新人和创建部门信息 baseEntity.setCreateBy(userId); - // 当前已登录 且 更新人为空 则填充 baseEntity.setUpdateBy(userId); baseEntity.setCreateDept(ObjectUtil.isNotNull(baseEntity.getCreateDept()) ? baseEntity.getCreateDept() : loginUser.getDeptId()); @@ -47,15 +53,20 @@ public class InjectionMetaObjectHandler implements MetaObjectHandler { } } + /** + * 更新填充方法,用于在更新数据时自动填充实体对象中的更新时间和更新人信息 + * + * @param metaObject 元对象,用于获取原始对象并进行填充 + */ @Override public void updateFill(MetaObject metaObject) { try { - if (ObjectUtil.isNotNull(metaObject) - && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) { + if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) { + // 获取当前时间作为更新时间,无论原始对象中的更新时间是否为空都填充 Date current = new Date(); - // 更新时间填充(不管为不为空) baseEntity.setUpdateTime(current); - // 当前已登录 更新人填充(不管为不为空) + + // 获取当前登录用户的ID,并填充更新人信息 Long userId = LoginHelper.getUserId(); if (ObjectUtil.isNotNull(userId)) { baseEntity.setUpdateBy(userId); @@ -67,7 +78,9 @@ public class InjectionMetaObjectHandler implements MetaObjectHandler { } /** - * 获取登录用户 + * 获取当前登录用户信息 + * + * @return 当前登录用户的信息,如果用户未登录则返回 null */ private LoginUser getLoginUser() { LoginUser loginUser; diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java index ec3ee0df..518d52d2 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/MybatisExceptionHandler.java @@ -1,15 +1,14 @@ package org.dromara.common.mybatis.handler; -import org.dromara.common.core.domain.R; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; import org.dromara.common.core.utils.StringUtils; import org.mybatis.spring.MyBatisSystemException; import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; -import jakarta.servlet.http.HttpServletRequest; - /** * Mybatis异常处理器 * diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java index fd7dd34d..200006ff 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/PlusDataPermissionHandler.java @@ -68,13 +68,27 @@ public class PlusDataPermissionHandler { */ private final BeanResolver beanResolver = new BeanFactoryResolver(SpringUtils.getBeanFactory()); + /** + * 构造方法,扫描指定包下的 Mapper 类并初始化缓存 + * + * @param mapperPackage Mapper 类所在的包路径 + */ public PlusDataPermissionHandler(String mapperPackage) { scanMapperClasses(mapperPackage); } - + /** + * 获取数据过滤条件的 SQL 片段 + * + * @param where 原始的查询条件表达式 + * @param mappedStatementId Mapper 方法的 ID + * @param isSelect 是否为查询语句 + * @return 数据过滤条件的 SQL 片段 + */ public Expression getSqlSegment(Expression where, String mappedStatementId, boolean isSelect) { + // 获取数据权限配置 DataPermission dataPermission = getDataPermission(mappedStatementId); + // 获取当前登录用户信息 LoginUser currentUser = DataPermissionHelper.getVariable("user"); if (ObjectUtil.isNull(currentUser)) { currentUser = LoginHelper.getLoginUser(); @@ -84,6 +98,7 @@ public class PlusDataPermissionHandler { if (LoginHelper.isSuperAdmin() || LoginHelper.isTenantAdmin()) { return where; } + // 构造数据过滤条件的 SQL 片段 String dataFilterSql = buildDataFilter(dataPermission.value(), isSelect); if (StringUtils.isBlank(dataFilterSql)) { return where; @@ -103,7 +118,12 @@ public class PlusDataPermissionHandler { } /** - * 构造数据过滤sql + * 构建数据过滤条件的 SQL 语句 + * + * @param dataColumns 数据权限注解中的列信息 + * @param isSelect 标志当前操作是否为查询操作,查询操作和更新或删除操作在处理过滤条件时会有不同的处理方式 + * @return 构建的数据过滤条件的 SQL 语句 + * @throws ServiceException 如果角色的数据范围异常或者 key 与 value 的长度不匹配,则抛出 ServiceException 异常 */ private String buildDataFilter(DataColumn[] dataColumns, boolean isSelect) { // 更新或删除需满足所有条件 @@ -159,20 +179,29 @@ public class PlusDataPermissionHandler { } /** - * 通过 mapperPackage 设置的扫描包 扫描缓存有注解的方法与类 + * 扫描指定包下的 Mapper 类,并查找其中带有特定注解的方法或类 + * + * @param mapperPackage Mapper 类所在的包路径 */ private void scanMapperClasses(String mapperPackage) { + // 创建资源解析器和元数据读取工厂 PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); CachingMetadataReaderFactory factory = new CachingMetadataReaderFactory(); + // 将 Mapper 包路径按分隔符拆分为数组 String[] packagePatternArray = StringUtils.splitPreserveAllTokens(mapperPackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS); String classpath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX; try { for (String packagePattern : packagePatternArray) { + // 将包路径转换为资源路径 String path = ClassUtils.convertClassNameToResourcePath(packagePattern); + // 获取指定路径下的所有 .class 文件资源 Resource[] resources = resolver.getResources(classpath + path + "/*.class"); for (Resource resource : resources) { + // 获取资源的类元数据 ClassMetadata classMetadata = factory.getMetadataReader(resource).getClassMetadata(); + // 获取资源对应的类对象 Class clazz = Resources.classForName(classMetadata.getClassName()); + // 查找类中的特定注解 findAnnotation(clazz); } } @@ -181,9 +210,13 @@ public class PlusDataPermissionHandler { } } + /** + * 在指定的类中查找特定的注解 DataPermission,并将带有这个注解的方法或类存储到 dataPermissionCacheMap 中 + * + * @param clazz 要查找的类 + */ private void findAnnotation(Class clazz) { DataPermission dataPermission; - // 获取方法注解 for (Method method : clazz.getMethods()) { if (method.isDefault() || method.isVarArgs()) { continue; @@ -194,17 +227,24 @@ public class PlusDataPermissionHandler { dataPermissionCacheMap.put(mappedStatementId, dataPermission); } } - // 获取类注解 if (AnnotationUtil.hasAnnotation(clazz, DataPermission.class)) { dataPermission = AnnotationUtil.getAnnotation(clazz, DataPermission.class); dataPermissionCacheMap.put(clazz.getName(), dataPermission); } } + /** + * 根据映射语句 ID 或类名获取对应的 DataPermission 注解对象 + * + * @param mapperId 映射语句 ID + * @return DataPermission 注解对象,如果不存在则返回 null + */ public DataPermission getDataPermission(String mapperId) { + // 检查缓存中是否包含映射语句 ID 对应的 DataPermission 注解对象 if (dataPermissionCacheMap.containsKey(mapperId)) { return dataPermissionCacheMap.get(mapperId); } + // 如果缓存中不包含映射语句 ID 对应的 DataPermission 注解对象,则尝试使用类名作为键查找 String clazzName = mapperId.substring(0, mapperId.lastIndexOf(".")); if (dataPermissionCacheMap.containsKey(clazzName)) { return dataPermissionCacheMap.get(clazzName); @@ -213,7 +253,10 @@ public class PlusDataPermissionHandler { } /** - * 是否无效 + * 检查给定的映射语句 ID 是否有效,即是否能够找到对应的 DataPermission 注解对象 + * + * @param mapperId 映射语句 ID + * @return 如果找到对应的 DataPermission 注解对象,则返回 false;否则返回 true */ public boolean invalid(String mapperId) { return getDataPermission(mapperId) == null; diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java index 4a293835..a98b3b7e 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataBaseHelper.java @@ -2,11 +2,11 @@ package org.dromara.common.mybatis.helper; import cn.hutool.core.convert.Convert; import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.mybatis.enums.DataBaseType; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; import javax.sql.DataSource; import java.sql.Connection; @@ -14,7 +14,6 @@ import java.sql.DatabaseMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import java.util.Set; /** * 数据库助手 diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java index 0beae4da..4650a5a1 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java @@ -24,17 +24,35 @@ public class DataPermissionHelper { public static final String DATA_PERMISSION_KEY = "data:permission"; + /** + * 从上下文中获取指定键的变量值,并将其转换为指定的类型 + * + * @param key 变量的键 + * @param 变量值的类型 + * @return 指定键的变量值,如果不存在则返回 null + */ public static T getVariable(String key) { Map context = getContext(); return (T) context.get(key); } - + /** + * 向上下文中设置指定键的变量值 + * + * @param key 要设置的变量的键 + * @param value 要设置的变量值 + */ public static void setVariable(String key, Object value) { Map context = getContext(); context.put(key, value); } + /** + * 获取数据权限上下文 + * + * @return 存储在SaStorage中的Map对象,用于存储数据权限相关的上下文信息 + * @throws NullPointerException 如果数据权限上下文类型异常,则抛出NullPointerException + */ public static Map getContext() { SaStorage saStorage = SaHolder.getStorage(); Object attribute = saStorage.get(DATA_PERMISSION_KEY); @@ -64,6 +82,7 @@ public class DataPermissionHelper { /** * 在忽略数据权限中执行 + *

禁止在忽略数据权限中执行忽略数据权限

* * @param handle 处理执行方法 */ @@ -78,6 +97,7 @@ public class DataPermissionHelper { /** * 在忽略数据权限中执行 + *

禁止在忽略数据权限中执行忽略数据权限

* * @param handle 处理执行方法 */ diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java index 6eed8f77..85a4d0ab 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlusDataPermissionInterceptor.java @@ -37,17 +37,33 @@ public class PlusDataPermissionInterceptor extends BaseMultiTableInnerIntercepto private final PlusDataPermissionHandler dataPermissionHandler; + /** + * 构造函数,初始化 PlusDataPermissionHandler 实例 + * + * @param mapperPackage 扫描的映射器包 + */ public PlusDataPermissionInterceptor(String mapperPackage) { this.dataPermissionHandler = new PlusDataPermissionHandler(mapperPackage); } + /** + * 在执行查询之前,检查并处理数据权限相关逻辑 + * + * @param executor MyBatis 执行器对象 + * @param ms 映射语句对象 + * @param parameter 方法参数 + * @param rowBounds 分页对象 + * @param resultHandler 结果处理器 + * @param boundSql 绑定的 SQL 对象 + * @throws SQLException 如果发生 SQL 异常 + */ @Override public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { - // 检查忽略注解 + // 检查是否需要忽略数据权限处理 if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) { return; } - // 检查是否无效 无数据权限注解 + // 检查是否缺少有效的数据权限注解 if (dataPermissionHandler.invalid(ms.getId())) { return; } @@ -56,16 +72,26 @@ public class PlusDataPermissionInterceptor extends BaseMultiTableInnerIntercepto mpBs.sql(parserSingle(mpBs.sql(), ms.getId())); } + /** + * 在准备 SQL 语句之前,检查并处理更新和删除操作的数据权限相关逻辑 + * + * @param sh MyBatis StatementHandler 对象 + * @param connection 数据库连接对象 + * @param transactionTimeout 事务超时时间 + */ @Override public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) { PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh); MappedStatement ms = mpSh.mappedStatement(); + // 获取 SQL 命令类型(增、删、改、查) SqlCommandType sct = ms.getSqlCommandType(); + + // 只处理更新和删除操作的 SQL 语句 if (sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE) { if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) { return; } - // 检查是否无效 无数据权限注解 + // 检查是否缺少有效的数据权限注解 if (dataPermissionHandler.invalid(ms.getId())) { return; } @@ -74,6 +100,14 @@ public class PlusDataPermissionInterceptor extends BaseMultiTableInnerIntercepto } } + /** + * 处理 SELECT 查询语句中的 WHERE 条件 + * + * @param select SELECT 查询对象 + * @param index 查询语句的索引 + * @param sql 查询语句 + * @param obj WHERE 条件参数 + */ @Override protected void processSelect(Select select, int index, String sql, Object obj) { if (select instanceof PlainSelect) { @@ -84,6 +118,14 @@ public class PlusDataPermissionInterceptor extends BaseMultiTableInnerIntercepto } } + /** + * 处理 UPDATE 语句中的 WHERE 条件 + * + * @param update UPDATE 查询对象 + * @param index 查询语句的索引 + * @param sql 查询语句 + * @param obj WHERE 条件参数 + */ @Override protected void processUpdate(Update update, int index, String sql, Object obj) { Expression sqlSegment = dataPermissionHandler.getSqlSegment(update.getWhere(), (String) obj, false); @@ -92,6 +134,14 @@ public class PlusDataPermissionInterceptor extends BaseMultiTableInnerIntercepto } } + /** + * 处理 DELETE 语句中的 WHERE 条件 + * + * @param delete DELETE 查询对象 + * @param index 查询语句的索引 + * @param sql 查询语句 + * @param obj WHERE 条件参数 + */ @Override protected void processDelete(Delete delete, int index, String sql, Object obj) { Expression sqlSegment = dataPermissionHandler.getSqlSegment(delete.getWhere(), (String) obj, false); @@ -101,10 +151,10 @@ public class PlusDataPermissionInterceptor extends BaseMultiTableInnerIntercepto } /** - * 设置 where 条件 + * 设置 SELECT 语句的 WHERE 条件 * - * @param plainSelect 查询对象 - * @param mappedStatementId 执行方法id + * @param plainSelect SELECT 查询对象 + * @param mappedStatementId 映射语句的 ID */ protected void setWhere(PlainSelect plainSelect, String mappedStatementId) { Expression sqlSegment = dataPermissionHandler.getSqlSegment(plainSelect.getWhere(), mappedStatementId, true); @@ -113,6 +163,14 @@ public class PlusDataPermissionInterceptor extends BaseMultiTableInnerIntercepto } } + /** + * 构建表达式,用于处理表的数据权限 + * + * @param table 表对象 + * @param where WHERE 条件表达式 + * @param whereSegment WHERE 条件片段 + * @return 构建的表达式 + */ @Override public Expression buildTableExpression(Table table, Expression where, String whereSegment) { // 只有新版数据权限处理器才会执行到这里 diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/service/SysDataScopeService.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/service/SysDataScopeService.java index 0c187f66..4543579c 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/service/SysDataScopeService.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/service/SysDataScopeService.java @@ -1,7 +1,7 @@ package org.dromara.common.mybatis.service; -import org.dromara.system.api.RemoteDataScopeService; import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.system.api.RemoteDataScopeService; import org.springframework.stereotype.Service; /** @@ -18,11 +18,24 @@ public class SysDataScopeService { @DubboReference private RemoteDataScopeService remoteDataScopeService; + /** + * 获取角色自定义权限语句 + * + * @param roleId 角色ID + * @return 返回角色的自定义权限语句,如果没有找到则返回 null + */ public String getRoleCustom(Long roleId) { return remoteDataScopeService.getRoleCustom(roleId); } + /** + * 获取部门和下级权限语句 + * + * @param deptId 部门ID + * @return 返回部门及其下级的权限语句,如果没有找到则返回 null + */ public String getDeptAndChild(Long deptId) { return remoteDataScopeService.getDeptAndChild(deptId); } + } diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/resources/spy.properties b/ruoyi-common/ruoyi-common-mybatis/src/main/resources/spy.properties index e9d10f3f..f3ed7d8e 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/resources/spy.properties +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/resources/spy.properties @@ -17,4 +17,4 @@ databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss # 是否过滤 Log filter=true # 过滤 Log 时所排除的 sql 关键字,以逗号分隔 -exclude=SELECT 1 +exclude= diff --git a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java index 86668aa2..5e300da2 100644 --- a/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java +++ b/ruoyi-common/ruoyi-common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java @@ -178,6 +178,7 @@ public class OssClient { .key(key) .contentMD5(StringUtils.isNotEmpty(md5Digest) ? md5Digest : null) .contentType(contentType) + .acl(getAccessPolicy().getObjectCannedACL()) .build()) .addTransferListener(LoggingTransferListener.create()) .source(filePath).build()); @@ -223,6 +224,7 @@ public class OssClient { y -> y.bucket(properties.getBucketName()) .key(key) .contentType(contentType) + .acl(getAccessPolicy().getObjectCannedACL()) .build()) .build()); diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java index 41d14b03..ae067e89 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/utils/LoginHelper.java @@ -3,6 +3,7 @@ package org.dromara.common.satoken.utils; import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import lombok.AccessLevel; @@ -87,6 +88,13 @@ public class LoginHelper { return Convert.toLong(getExtra(USER_KEY)); } + /** + * 获取用户账户 + */ + public static String getUsername() { + return Convert.toStr(getExtra(USER_NAME_KEY)); + } + /** * 获取租户ID */ @@ -130,13 +138,6 @@ public class LoginHelper { } - /** - * 获取用户账户 - */ - public static String getUsername() { - return getLoginUser().getUsername(); - } - /** * 获取用户类型 */ @@ -171,6 +172,9 @@ public class LoginHelper { * @return 结果 */ public static boolean isTenantAdmin(Set rolePermission) { + if (CollUtil.isEmpty(rolePermission)) { + return false; + } return rolePermission.contains(TenantConstants.TENANT_ADMIN_ROLE_KEY); } diff --git a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/OssUrlTranslationImpl.java b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/OssUrlTranslationImpl.java index b9fe8392..959b922c 100644 --- a/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/OssUrlTranslationImpl.java +++ b/ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/OssUrlTranslationImpl.java @@ -17,10 +17,10 @@ import org.apache.dubbo.config.annotation.DubboReference; public class OssUrlTranslationImpl implements TranslationInterface { @DubboReference(mock = "true") - private RemoteFileService ossService; + private RemoteFileService remoteFileService; @Override public String translation(Object key, String other) { - return ossService.selectUrlByIds(key.toString()); + return remoteFileService.selectUrlByIds(key.toString()); } } diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java index fcee92b8..557ed8eb 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/handler/PlusWebSocketHandler.java @@ -1,5 +1,6 @@ package org.dromara.common.websocket.handler; +import cn.hutool.core.util.ObjectUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.common.websocket.dto.WebSocketMessageDto; import org.dromara.common.websocket.holder.WebSocketSessionHolder; @@ -8,6 +9,7 @@ import org.dromara.system.api.model.LoginUser; import org.springframework.web.socket.*; import org.springframework.web.socket.handler.AbstractWebSocketHandler; +import java.io.IOException; import java.util.List; import static org.dromara.common.websocket.constant.WebSocketConstants.LOGIN_USER_KEY; @@ -24,8 +26,13 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler { * 连接成功后 */ @Override - public void afterConnectionEstablished(WebSocketSession session) { + public void afterConnectionEstablished(WebSocketSession session) throws IOException { LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY); + if (ObjectUtil.isNull(loginUser)) { + session.close(CloseStatus.BAD_DATA); + log.info("[connect] invalid token received. sessionId: {}", session.getId()); + return; + } WebSocketSessionHolder.addSession(loginUser.getUserId(), session); log.info("[connect] sessionId: {},userId:{},userType:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType()); } @@ -94,6 +101,10 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler { @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY); + if (ObjectUtil.isNull(loginUser)) { + log.info("[disconnect] invalid token received. sessionId: {}", session.getId()); + return; + } WebSocketSessionHolder.removeSession(loginUser.getUserId()); log.info("[disconnect] sessionId: {},userId:{},userType:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType()); } diff --git a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java index b245117a..696ac3c5 100644 --- a/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java +++ b/ruoyi-common/ruoyi-common-websocket/src/main/java/org/dromara/common/websocket/utils/WebSocketUtils.java @@ -69,7 +69,7 @@ public class WebSocketUtils { broadcastMessage.setMessage(webSocketMessage.getMessage()); broadcastMessage.setSessionKeys(unsentSessionKeys); RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> { - log.info(" WebSocket发送主题订阅消息topic:{} session keys:{} message:{}", + log.info("WebSocket发送主题订阅消息topic:{} session keys:{} message:{}", WEB_SOCKET_TOPIC, unsentSessionKeys, webSocketMessage.getMessage()); }); } diff --git a/ruoyi-example/ruoyi-demo/pom.xml b/ruoyi-example/ruoyi-demo/pom.xml index 1b359c06..f9ca57a6 100644 --- a/ruoyi-example/ruoyi-demo/pom.xml +++ b/ruoyi-example/ruoyi-demo/pom.xml @@ -103,6 +103,12 @@ ruoyi-common-sensitive + + + + + + org.springframework.boot spring-boot-starter-test diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBusController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBusController.java new file mode 100644 index 00000000..3d2fe3cc --- /dev/null +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestBusController.java @@ -0,0 +1,31 @@ +package org.dromara.demo.controller; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +/** + * 测试消息总线 + *

+ * 需要在pom引入 ruoyi-api-workflow 模块 并解除下方代码注释 + * 然后提交请假申请即可看到监听器输出日志 + * + * @author Lion Li + */ +@Slf4j +@RestController +@RequestMapping("/bus") +public class TestBusController { + +// @EventListener(condition = "#processEvent.key.startsWith('leave')") +// public void processHandler(ProcessEvent processEvent) { +// log.info(processEvent.toString()); +// } +// +// @EventListener(condition = "#processTaskEvent.key=='leave1' && #processTaskEvent.taskDefinitionKey=='Activity_14633hx'") +// public void processTaskHandler(ProcessTaskEvent processTaskEvent) { +// log.info(processTaskEvent.toString()); +// } + +} diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java index 08d2e0d7..54a80146 100644 --- a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java @@ -55,5 +55,5 @@ public interface TestDemoMapper extends BaseMapperPlus { @DataColumn(key = "deptName", value = "dept_id"), @DataColumn(key = "userName", value = "user_id") }) - int deleteBatchIds(@Param(Constants.COLL) Collection idList); + int deleteByIds(@Param(Constants.COLL) Collection idList); } diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java index afc99c71..761b337c 100644 --- a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestDemoServiceImpl.java @@ -101,7 +101,7 @@ public class TestDemoServiceImpl implements ITestDemoService { if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } - return baseMapper.deleteBatchIds(ids) > 0; + return baseMapper.deleteByIds(ids) > 0; } @Override diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java index 138e19be..3b5fa055 100644 --- a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestTreeServiceImpl.java @@ -83,6 +83,6 @@ public class TestTreeServiceImpl implements ITestTreeService { if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } - return baseMapper.deleteBatchIds(ids) > 0; + return baseMapper.deleteByIds(ids) > 0; } } diff --git a/ruoyi-example/ruoyi-test-mq/README.md b/ruoyi-example/ruoyi-test-mq/README.md index fd446fb6..1f7c5fb3 100644 --- a/ruoyi-example/ruoyi-test-mq/README.md +++ b/ruoyi-example/ruoyi-test-mq/README.md @@ -11,7 +11,7 @@ rocketmq: -**注意:需要进入到rockerMQ文件路径中执行** +**注意:由于rocketmq并没有自动创建topic的功能, 所以需要进入到rockerMQ文件路径中执行** 创建普通消息的topic @@ -32,13 +32,3 @@ sh mqadmin updateTopic -n -t -c ```shell bin/mqadmin updatetopic -n localhost:9876 -t transaction-topic -c DefaultCluster -a +message.type=TRANSACTION ``` - -kafka: - -```shell -kafka-topics.sh --create --topic --bootstrap-server --partitions --replication-factor -``` - -```shell -kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1 -``` diff --git a/ruoyi-example/ruoyi-test-mq/src/main/resources/application.yml b/ruoyi-example/ruoyi-test-mq/src/main/resources/application.yml index df7e9f2b..f6d578fc 100644 --- a/ruoyi-example/ruoyi-test-mq/src/main/resources/application.yml +++ b/ruoyi-example/ruoyi-test-mq/src/main/resources/application.yml @@ -33,6 +33,8 @@ spring: streams: properties: application.id: kafka-streams-id # 应用ID + properties: + auto.create.topics.enable: true # 开启自动创建话题功能,默认是false,根据需要设置 --- # rocketmq 配置 rocketmq: @@ -47,6 +49,8 @@ spring: nacos: # nacos 服务地址 server-addr: @nacos.server@ + username: @nacos.username@ + password: @nacos.password@ discovery: # 注册组 group: @nacos.discovery.group@ diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java index 9031760e..078a2484 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java @@ -161,7 +161,7 @@ public class GenTableServiceImpl implements IGenTableService { @Override public void deleteGenTableByIds(Long[] tableIds) { List ids = Arrays.asList(tableIds); - baseMapper.deleteBatchIds(ids); + baseMapper.deleteByIds(ids); genTableColumnMapper.delete(new LambdaQueryWrapper().in(GenTableColumn::getTableId, ids)); } @@ -328,7 +328,7 @@ public class GenTableServiceImpl implements IGenTableService { if (CollUtil.isNotEmpty(delColumns)) { List ids = StreamUtils.toList(delColumns, GenTableColumn::getColumnId); if (CollUtil.isNotEmpty(ids)) { - genTableColumnMapper.deleteBatchIds(ids); + genTableColumnMapper.deleteByIds(ids); } } } diff --git a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm index d603de12..e0642f1a 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm +++ b/ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm @@ -129,6 +129,6 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service { if(isValid){ //TODO 做一些业务上的校验,判断是否需要校验 } - return baseMapper.deleteBatchIds(ids) > 0; + return baseMapper.deleteByIds(ids) > 0; } } diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssConfigServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssConfigServiceImpl.java index 2e7154b5..151afe08 100644 --- a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssConfigServiceImpl.java @@ -134,7 +134,7 @@ public class SysOssConfigServiceImpl implements ISysOssConfigService { SysOssConfig config = baseMapper.selectById(configId); list.add(config); } - boolean flag = baseMapper.deleteBatchIds(ids) > 0; + boolean flag = baseMapper.deleteByIds(ids) > 0; if (flag) { list.forEach(sysOssConfig -> CacheUtils.evict(CacheNames.SYS_OSS_CONFIG, sysOssConfig.getConfigKey())); diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java index e650dfb0..0c950189 100644 --- a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java @@ -240,7 +240,7 @@ public class SysOssServiceImpl implements ISysOssService { OssClient storage = OssFactory.instance(sysOss.getService()); storage.delete(sysOss.getUrl()); } - return baseMapper.deleteBatchIds(ids) > 0; + return baseMapper.deleteByIds(ids) > 0; } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDataScopeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDataScopeServiceImpl.java index ea59a992..b09f682c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDataScopeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDataScopeServiceImpl.java @@ -32,6 +32,12 @@ public class RemoteDataScopeServiceImpl implements RemoteDataScopeService { private final SysRoleDeptMapper roleDeptMapper; private final SysDeptMapper deptMapper; + /** + * 获取角色自定义权限语句 + * + * @param roleId 角色ID + * @return 返回角色的自定义权限语句,如果没有找到则返回 null + */ @Override public String getRoleCustom(Long roleId) { List list = roleDeptMapper.selectList( @@ -44,6 +50,12 @@ public class RemoteDataScopeServiceImpl implements RemoteDataScopeService { return null; } + /** + * 获取部门和下级权限语句 + * + * @param deptId 部门ID + * @return 返回部门及其下级的权限语句,如果没有找到则返回 null + */ @Override public String getDeptAndChild(Long deptId) { List deptList = deptMapper.selectList(new LambdaQueryWrapper() diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java index b2be0e98..ac646c09 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java @@ -18,13 +18,6 @@ import java.util.List; */ public interface SysMenuMapper extends BaseMapperPlus { - /** - * 根据用户所有权限 - * - * @return 权限列表 - */ - List selectMenuPerms(); - /** * 根据用户查询系统菜单列表 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java index 7b4e11ca..6aec9199 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java @@ -145,6 +145,6 @@ public class SysClientServiceImpl implements ISysClientService { if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } - return baseMapper.deleteBatchIds(ids) > 0; + return baseMapper.deleteByIds(ids) > 0; } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java index cd8673e8..c3917e0c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java @@ -176,7 +176,7 @@ public class SysConfigServiceImpl implements ISysConfigService { } CacheUtils.evict(CacheNames.SYS_CONFIG, config.getConfigKey()); } - baseMapper.deleteBatchIds(Arrays.asList(configIds)); + baseMapper.deleteByIds(Arrays.asList(configIds)); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java index 8f958e88..df30a162 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java @@ -137,7 +137,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService { } CacheUtils.evict(CacheNames.SYS_DICT, dictType.getDictType()); } - baseMapper.deleteBatchIds(Arrays.asList(dictIds)); + baseMapper.deleteByIds(Arrays.asList(dictIds)); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java index 4ed39ee1..fd5efb4e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java @@ -87,7 +87,7 @@ public class SysLogininforServiceImpl implements ISysLogininforService { */ @Override public int deleteLogininforByIds(Long[] infoIds) { - return baseMapper.deleteBatchIds(Arrays.asList(infoIds)); + return baseMapper.deleteByIds(Arrays.asList(infoIds)); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java index 3685e2af..1b6a9aa8 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java @@ -75,7 +75,7 @@ public class SysMenuServiceImpl implements ISysMenuService { .orderByAsc(SysMenu::getOrderNum)); } else { QueryWrapper wrapper = Wrappers.query(); - wrapper.eq("sur.user_id", userId) + wrapper.inSql("r.role_id", "select role_id from sys_user_role where user_id = " + userId) .like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName()) .eq(StringUtils.isNotBlank(menu.getVisible()), "m.visible", menu.getVisible()) .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus()) @@ -178,6 +178,7 @@ public class SysMenuServiceImpl implements ISysMenuService { /** * 构建前端路由所需要的菜单 + * 路由name命名规则 path首字母转大写 + id * * @param menus 菜单列表 * @return 路由列表 @@ -186,9 +187,10 @@ public class SysMenuServiceImpl implements ISysMenuService { public List buildMenus(List menus) { List routers = new LinkedList<>(); for (SysMenu menu : menus) { + String name = menu.getRouteName() + menu.getMenuId(); RouterVo router = new RouterVo(); router.setHidden("1".equals(menu.getVisible())); - router.setName(menu.getRouteName()); + router.setName(name); router.setPath(menu.getRouterPath()); router.setComponent(menu.getComponentInfo()); router.setQuery(menu.getQueryParam()); @@ -199,12 +201,13 @@ public class SysMenuServiceImpl implements ISysMenuService { router.setRedirect("noRedirect"); router.setChildren(buildMenus(cMenus)); } else if (menu.isMenuFrame()) { + String frameName = StringUtils.capitalize(menu.getPath()) + menu.getMenuId(); router.setMeta(null); List childrenList = new ArrayList<>(); RouterVo children = new RouterVo(); children.setPath(menu.getPath()); children.setComponent(menu.getComponent()); - children.setName(StringUtils.capitalize(menu.getPath())); + children.setName(frameName); children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); children.setQuery(menu.getQueryParam()); childrenList.add(children); @@ -215,9 +218,10 @@ public class SysMenuServiceImpl implements ISysMenuService { List childrenList = new ArrayList<>(); RouterVo children = new RouterVo(); String routerPath = SysMenu.innerLinkReplaceEach(menu.getPath()); + String innerLinkName = StringUtils.capitalize(routerPath) + menu.getMenuId(); children.setPath(routerPath); children.setComponent(UserConstants.INNER_LINK); - children.setName(StringUtils.capitalize(routerPath)); + children.setName(innerLinkName); children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath())); childrenList.add(children); router.setChildren(childrenList); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java index 18b7a08d..db63e61d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java @@ -119,6 +119,6 @@ public class SysNoticeServiceImpl implements ISysNoticeService { */ @Override public int deleteNoticeByIds(Long[] noticeIds) { - return baseMapper.deleteBatchIds(Arrays.asList(noticeIds)); + return baseMapper.deleteByIds(Arrays.asList(noticeIds)); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java index ce9ab23f..f80f1523 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java @@ -105,7 +105,7 @@ public class SysOperLogServiceImpl implements ISysOperLogService { */ @Override public int deleteOperLogByIds(Long[] operIds) { - return baseMapper.deleteBatchIds(Arrays.asList(operIds)); + return baseMapper.deleteByIds(Arrays.asList(operIds)); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java index 17cd5caa..b8a7e607 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -202,7 +202,7 @@ public class SysPostServiceImpl implements ISysPostService { throw new ServiceException(String.format("%1$s已分配,不能删除!", post.getPostName())); } } - return baseMapper.deleteBatchIds(Arrays.asList(postIds)); + return baseMapper.deleteByIds(Arrays.asList(postIds)); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java index 9c352b20..3f72ae36 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java @@ -37,6 +37,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.stream.Collectors; /** * 角色 业务层处理 @@ -102,14 +103,13 @@ public class SysRoleServiceImpl implements ISysRoleService { */ @Override public List selectRolesAuthByUserId(Long userId) { - List userRoles = baseMapper.selectRolePermissionByUserId(userId); + List userRoles = baseMapper.selectRolesByUserId(userId); List roles = selectRoleAll(); + // 使用HashSet提高查找效率 + Set userRoleIds = userRoles.stream().map(SysRoleVo::getRoleId).collect(Collectors.toSet()); for (SysRoleVo role : roles) { - for (SysRoleVo userRole : userRoles) { - if (role.getRoleId().longValue() == userRole.getRoleId().longValue()) { - role.setFlag(true); - break; - } + if (userRoleIds.contains(role.getRoleId())) { + role.setFlag(true); } } return roles; @@ -123,7 +123,7 @@ public class SysRoleServiceImpl implements ISysRoleService { */ @Override public Set selectRolePermissionByUserId(Long userId) { - List perms = baseMapper.selectRolePermissionByUserId(userId); + List perms = baseMapper.selectRolesByUserId(userId); Set permsSet = new HashSet<>(); for (SysRoleVo perm : perms) { if (ObjectUtil.isNotNull(perm)) { @@ -417,7 +417,7 @@ public class SysRoleServiceImpl implements ISysRoleService { roleMenuMapper.delete(new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, ids)); // 删除角色与部门关联 roleDeptMapper.delete(new LambdaQueryWrapper().in(SysRoleDept::getRoleId, ids)); - return baseMapper.deleteBatchIds(ids); + return baseMapper.deleteByIds(ids); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java index f7f8d46e..5fd04af8 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java @@ -140,6 +140,6 @@ public class SysTenantPackageServiceImpl implements ISysTenantPackageService { throw new ServiceException("租户套餐已被使用"); } } - return baseMapper.deleteBatchIds(ids) > 0; + return baseMapper.deleteByIds(ids) > 0; } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java index 516149f1..d30750db 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java @@ -294,7 +294,7 @@ public class SysTenantServiceImpl implements ISysTenantService { throw new ServiceException("超管租户不能删除"); } } - return baseMapper.deleteBatchIds(ids) > 0; + return baseMapper.deleteByIds(ids) > 0; } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 37958669..8fc8142a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -535,7 +535,7 @@ public class SysUserServiceImpl implements ISysUserService { // 删除用户与岗位表 userPostMapper.delete(new LambdaQueryWrapper().in(SysUserPost::getUserId, ids)); // 防止更新失败导致的数据删除 - int flag = baseMapper.deleteBatchIds(ids); + int flag = baseMapper.deleteByIds(ids); if (flag < 1) { throw new ServiceException("删除用户失败!"); } diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml index fad18127..cf3468ed 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -12,8 +12,7 @@ m.perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time from sys_menu m left join sys_role_menu rm on m.menu_id = rm.menu_id - left join sys_user_role sur on rm.role_id = sur.role_id - left join sys_role ro on sur.role_id = ro.role_id + left join sys_role r on sur.role_id = r.role_id ${ew.getCustomSqlSegment} @@ -34,14 +33,10 @@ m.order_num, m.create_time from sys_menu m - left join sys_role_menu rm on m.menu_id = rm.menu_id - left join sys_user_role sur on rm.role_id = sur.role_id - left join sys_role ro on sur.role_id = ro.role_id - left join sys_user u on sur.user_id = u.user_id - where u.user_id = #{userId} - and m.menu_type in ('M', 'C') - and m.status = '0' - and ro.status = '0' + left join sys_role_menu rm on m.menu_id = rm.menu_id and m.status = '0' + left join sys_role r on rm.role_id = r.role_id and r.status = '0' + where m.menu_type in ('M', 'C') + and r.role_id in (select role_id from sys_user_role where user_id = #{userId}) order by m.parent_id, m.order_num @@ -57,22 +52,12 @@ order by m.parent_id, m.order_num - -