diff --git a/.env b/.env
index cabce62..1699138 100644
--- a/.env
+++ b/.env
@@ -1,2 +1,2 @@
# ui项目的根路径
-UI_BASE_DIR=/Users/dingzhiwei/work/idea_wk/gitee_wk
\ No newline at end of file
+UI_BASE_DIR=/Users/dingzhiwei/work/dev/jeepay-open
diff --git a/README.md b/README.md
index 0f83067..adf668f 100644
--- a/README.md
+++ b/README.md
@@ -296,7 +296,36 @@ jeepay-open/
### 构建前准备
-#### 1. 编译后端 JAR
+#### 1. 配置 Docker 国内镜像加速(强烈建议)
+
+国内网络拉取 Docker Hub 镜像较慢或被墙,建议配置多个镜像加速源(单个源随时可能失效,Docker 会自动 fallback)。
+
+Docker daemon 配置示例:
+
+```json
+{
+ "registry-mirrors": [
+ "https://docker.1ms.run",
+ "https://docker.m.daocloud.io",
+ "https://docker.xuanyuan.me",
+ "https://hub.rat.dev",
+ "https://docker.1panel.live"
+ ]
+}
+```
+
+配置位置:
+
+- **Linux**:`/etc/docker/daemon.json`,修改后执行 `sudo systemctl restart docker`
+- **Docker Desktop(macOS / Windows)**:Settings -> Docker Engine,写入上述 JSON 后点击 Apply & Restart
+
+验证是否生效:
+
+```bash
+docker info | grep -A 5 "Registry Mirrors"
+```
+
+#### 2. 编译后端 JAR
在 `jeepay` 根目录执行:
@@ -310,14 +339,24 @@ mvn clean package -DskipTests
- `jeepay-manager/target/jeepay-manager.jar`
- `jeepay-merchant/target/jeepay-merchant.jar`
-#### 2. 准备前端代码
+#### 3. 准备前端代码
确保 `jeepay-ui` 仓库已拉取到本地,且目录结构满足上面的要求。
### 启动方式
```bash
+# 首次启动(编译镜像 + 启动)
docker compose up -d --build
+
+# 后续启动(跳过编译)
+docker compose up -d
+
+# 仅重新编译后端服务
+docker compose build payment manager merchant
+
+# 重启某个服务
+docker compose restart payment
```
### 启动前校验
@@ -328,27 +367,87 @@ docker compose config
### 默认暴露端口
-| 组件 | 端口 |
-|---|---|
-| MySQL | `3306` |
-| Redis | `6380` |
-| RocketMQ NameServer | `9876` |
-| RocketMQ Broker | `10909` / `10911` / `10912` |
-| payment | `9216` |
-| manager | `9217` |
-| merchant | `9218` |
-| manager UI | `9227` |
-| merchant UI | `9228` |
-| cashier UI | `9226` |
+| 组件 | 端口 | 说明 |
+|---|---|---|
+| MySQL | `13306` | 映射宿主机 13306,避免与本地 MySQL 冲突 |
+| Redis | `6380` | |
+| RocketMQ NameServer | `9876` | |
+| RocketMQ Broker | `10909` / `10911` / `10912` | |
+| payment | `9216` | 支付网关 |
+| manager | `9217` | 运营平台后端 |
+| merchant | `9218` | 商户系统后端 |
+| manager UI | `9227` | 运营平台前端 |
+| merchant UI | `9228` | 商户系统前端 |
+| cashier UI | `9226` | 收银台前端 |
-### 说明
+### 默认账号
-- Compose 默认使用 RocketMQ,已补齐 `rocketmq-namesrv` 与 `rocketmq-broker`,并统一设置 `restart: always`,用于提升 Docker 部署的自动恢复能力。
-- `conf/payment`、`conf/manager`、`conf/merchant` 已默认切换为 `rocketMQ`,同时将 Docker 场景下的 MySQL / Redis 主机名修正为 `mysql`、`redis`。
-- Java 服务挂载的配置文件路径已与模块 Dockerfile 对齐。
-- Compose 当前默认使用模块内 Dockerfile 构建 `payment / manager / merchant`,不再错误指向根目录不存在的 Dockerfile。
-- 如需回退到 ActiveMQ 或切换 RabbitMQ,需要同时调整 `docker-compose.yml` 与 `conf/*.yml` 中对应 MQ 配置。
-- 若前端镜像构建失败,优先检查 `jeepay-ui` 是否存在,以及 Node 依赖是否可正常安装。
+| 平台 | 地址 | 用户名 | 密码 |
+|---|---|---|---|
+| 运营平台 | http://localhost:9227 | jeepay | jeepay123 |
+| 商户系统 | http://localhost:9228 | jeepay | jeepay123 |
+
+### 核心组件版本
+
+| 组件 | 版本 | 说明 |
+|---|---|---|
+| RocketMQ Server | `5.3.1` | NameServer + Broker |
+| rocketmq-spring-boot-starter | `2.3.5` | Spring Boot 集成,内置 client 5.3.2 |
+| MySQL | `8` | |
+| Redis | `latest` | |
+| Java 基础镜像 | `eclipse-temurin:17-jre` | openjdk 官方镜像已停止维护 |
+
+### 配置说明
+
+- Compose 默认使用 **RocketMQ** 作为消息队列,已配置 `rocketmq-namesrv` 与 `rocketmq-broker`。
+- `conf/payment`、`conf/manager`、`conf/merchant` 已默认切换为 `rocketMQ`,MySQL / Redis 主机名配置为容器内网名 `mysql`、`redis`。
+- MySQL 映射为 `13306:3306`,避免与宿主机本地 MySQL 冲突;容器内部服务仍通过 `mysql:3306` 通信。
+- Java 服务的配置文件通过 volume 挂载,修改 `conf/` 目录下的 yml 后重启对应服务即可生效。
+- 如需回退到 ActiveMQ 或切换 RabbitMQ,需同时调整 `docker-compose.yml` 与 `conf/*.yml`。
+
+### 启动后验证
+
+```bash
+# 查看所有容器状态
+docker compose ps
+
+# 查看核心服务日志
+docker compose logs --tail=100 payment manager merchant rocketmq-namesrv rocketmq-broker
+
+# 确认 RocketMQ Broker 启动成功(应看到 "boot success")
+docker logs jeepay-rocketmq-broker 2>&1 | grep "boot success"
+```
+
+### 常见问题
+
+#### RocketMQ Broker 启动失败(NullPointerException)
+
+如果 Broker 日志中出现 `ScheduleMessageService.configFilePath` 相关 NPE,通常是 Docker named volume 的权限问题。RocketMQ 5.x 镜像以 `rocketmq`(uid=3000)用户运行,而 Docker 创建的 volume 默认 `root` 权限。
+
+Compose 中已通过 `user: "0:0"` 解决此问题。如果手动部署遇到此问题,可执行:
+
+```bash
+docker run --rm -u root -v jeepay_rocketmq_broker_store:/data alpine chown -R 3000:3000 /data
+docker run --rm -u root -v jeepay_rocketmq_broker_logs:/data alpine chown -R 3000:3000 /data
+```
+
+#### Apple Silicon(M1/M2/M3)注意事项
+
+RocketMQ 官方镜像仅提供 `linux/amd64` 版本,在 Apple Silicon 上通过 Rosetta 2 模拟运行,启动较慢属于正常现象。确保 Docker Desktop 已开启 "Use Rosetta for x86_64/amd64 emulation on Apple Silicon"。
+
+#### 前端镜像构建失败
+
+优先检查:
+- `jeepay-ui` 目录是否存在且在正确位置
+- Node.js 依赖是否可正常安装(npm 源是否可达)
+
+#### 登录提示"认证服务出现异常"
+
+检查 `conf/*/application.yml` 中的数据库连接配置是否与 `docker-compose.yml` 中的 MySQL 密码一致。Compose 默认 root 密码为 `rootroot`。
+
+#### 镜像拉取失败(403 Forbidden)
+
+镜像加速源可能失效,建议配置多个加速源(参见上方"配置 Docker 国内镜像加速"),Docker 会自动尝试下一个。
---
diff --git a/conf/devCommons/config/application.yml b/conf/devCommons/config/application.yml
index 6760d8b..5159fc7 100644
--- a/conf/devCommons/config/application.yml
+++ b/conf/devCommons/config/application.yml
@@ -5,6 +5,8 @@ server:
servlet:
context-path: / #设置应用的目录. 前缀需要带/, 无需设置后缀, 示例 【 /xxx 】 or 【 / 】
spring:
+ application:
+ name: jeepay
main:
allow-circular-references: true
servlet:
@@ -123,5 +125,12 @@ isys:
access-key-secret: SECRET_SECRET_SECRET #AccessKeySecret
mq:
- vender: activeMQ # 切换MQ厂商, 支持:【 activeMQ rabbitMQ rocketMQ aliYunRocketMQ 】, 需正确配置 【对应的yml参数】 和 【jeepay-components-mq项目下pom.xml中的依赖包】。
+ vender: rocketMQ # 切换MQ厂商, 支持:【 activeMQ rabbitMQ rocketMQ aliYunRocketMQ 】, 需正确配置 【对应的yml参数】 和 【jeepay-components-mq项目下pom.xml中的依赖包】。
+rocketmq:
+ name-server: 127.0.0.1:9876
+ producer:
+ group: PID_JEEPAY_DEV
+ send-message-timeout: 10000
+ retry-times-when-send-failed: 2
+ retry-times-when-send-async-failed: 2
diff --git a/conf/manager/application.yml b/conf/manager/application.yml
index 64ff7e5..6abe0d1 100644
--- a/conf/manager/application.yml
+++ b/conf/manager/application.yml
@@ -14,6 +14,8 @@ server:
servlet:
context-path: / #设置应用的目录. 前缀需要带/, 无需设置后缀, 示例 【 /xxx 】 or 【 / 】
spring:
+ application:
+ name: jeepay-manager
servlet:
multipart:
enabled: true #是否启用http上传处理
@@ -32,7 +34,7 @@ spring:
# yml填写url连接串, 无需将&符号进行转义
url: jdbc:mysql://mysql:3306/jeepaydb?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
username: root
- password: jeepaydb123456
+ password: rootroot
druid:
# 连接池配置项
initial-size: 5 #初始化时建立物理连接的个数
@@ -153,5 +155,7 @@ isys:
rocketmq:
name-server: rocketmq-namesrv:9876
producer:
- group: JEEPAY-GROUP
-
+ group: PID_JEEPAY_MANAGER
+ send-message-timeout: 10000
+ retry-times-when-send-failed: 2
+ retry-times-when-send-async-failed: 2
diff --git a/conf/merchant/application.yml b/conf/merchant/application.yml
index 0084704..f378417 100644
--- a/conf/merchant/application.yml
+++ b/conf/merchant/application.yml
@@ -14,6 +14,8 @@ server:
servlet:
context-path: / #设置应用的目录. 前缀需要带/, 无需设置后缀, 示例 【 /xxx 】 or 【 / 】
spring:
+ application:
+ name: jeepay-merchant
servlet:
multipart:
enabled: true #是否启用http上传处理
@@ -32,7 +34,7 @@ spring:
# yml填写url连接串, 无需将&符号进行转义
url: jdbc:mysql://mysql:3306/jeepaydb?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
username: root
- password: jeepaydb123456
+ password: rootroot
druid:
# 连接池配置项
initial-size: 5 #初始化时建立物理连接的个数
@@ -153,5 +155,7 @@ isys:
rocketmq:
name-server: rocketmq-namesrv:9876
producer:
- group: JEEPAY-GROUP
-
+ group: PID_JEEPAY_MERCHANT
+ send-message-timeout: 10000
+ retry-times-when-send-failed: 2
+ retry-times-when-send-async-failed: 2
diff --git a/conf/payment/application.yml b/conf/payment/application.yml
index 221b1e0..9aeec1f 100644
--- a/conf/payment/application.yml
+++ b/conf/payment/application.yml
@@ -14,6 +14,8 @@ server:
servlet:
context-path: / #设置应用的目录. 前缀需要带/, 无需设置后缀, 示例 【 /xxx 】 or 【 / 】
spring:
+ application:
+ name: jeepay-payment
servlet:
multipart:
enabled: true #是否启用http上传处理
@@ -32,7 +34,7 @@ spring:
# yml填写url连接串, 无需将&符号进行转义
url: jdbc:mysql://mysql:3306/jeepaydb?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
username: root
- password: jeepaydb123456
+ password: rootroot
druid:
# 连接池配置项
initial-size: 5 #初始化时建立物理连接的个数
@@ -156,5 +158,7 @@ isys:
rocketmq:
name-server: rocketmq-namesrv:9876
producer:
- group: JEEPAY-GROUP
-
+ group: PID_JEEPAY_PAYMENT
+ send-message-timeout: 10000
+ retry-times-when-send-failed: 2
+ retry-times-when-send-async-failed: 2
diff --git a/docker-compose.yml b/docker-compose.yml
index ccd9f9e..43ee719 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -20,7 +20,13 @@ services:
MYSQL_USER: "jeepay"
MYSQL_PASSWORD: "jeepay"
ports:
- - "3306:3306"
+ - "13306:3306"
+ healthcheck:
+ test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p$$MYSQL_ROOT_PASSWORD --silent"]
+ interval: 10s
+ timeout: 5s
+ retries: 12
+ start_period: 20s
volumes:
- mysql:/var/lib/mysql
- ./docs/sql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
@@ -30,13 +36,24 @@ services:
# 使用 RocketMQ 作为默认 MQ 方案
rocketmq-namesrv:
- image: apache/rocketmq:4.9.8
+ image: apache/rocketmq:5.3.1
hostname: rocketmq-namesrv
container_name: jeepay-rocketmq-namesrv
restart: always
+ user: "0:0"
ports:
- "9876:9876"
+ environment:
+ # 开发环境降低 NameServer 内存占用
+ HEAP_OPTS: "-Xms256m -Xmx256m -Xmn128m"
command: sh mqnamesrv
+ healthcheck:
+ # arm64 模拟 amd64 时 bash 启动较慢,需增大超时
+ test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/9876'"]
+ interval: 15s
+ timeout: 15s
+ retries: 10
+ start_period: 40s
volumes:
- rocketmq_namesrv_logs:/home/rocketmq/logs
networks:
@@ -44,23 +61,25 @@ services:
ipv4_address: 172.20.0.11
rocketmq-broker:
- image: apache/rocketmq:4.9.8
+ image: apache/rocketmq:5.3.1
hostname: rocketmq-broker
container_name: jeepay-rocketmq-broker
restart: always
+ # Docker 创建的 named volume 默认 root 权限,而镜像以 rocketmq(uid=3000) 运行,需要提权
+ user: "0:0"
ports:
- "10909:10909"
- "10911:10911"
- "10912:10912"
environment:
NAMESRV_ADDR: rocketmq-namesrv:9876
- command: sh mqbroker -n rocketmq-namesrv:9876 -c /home/rocketmq/rocketmq-4.9.8/conf/broker.conf
+ command: sh mqbroker -n rocketmq-namesrv:9876
depends_on:
- - rocketmq-namesrv
+ rocketmq-namesrv:
+ condition: service_healthy
volumes:
- rocketmq_broker_logs:/home/rocketmq/logs
- rocketmq_broker_store:/home/rocketmq/store
- - ./docker/rocketmq/broker/conf/broker.conf:/home/rocketmq/rocketmq-4.9.8/conf/broker.conf:ro
networks:
jeepay:
ipv4_address: 172.20.0.13
@@ -115,6 +134,12 @@ services:
image: redis:latest
ports:
- "6380:6379"
+ healthcheck:
+ test: ["CMD", "redis-cli", "ping"]
+ interval: 10s
+ timeout: 5s
+ retries: 12
+ start_period: 10s
volumes:
- redis:/data
networks:
@@ -132,9 +157,12 @@ services:
ports:
- "9216:9216"
depends_on:
- - mysql
- - redis
- - rocketmq-broker
+ mysql:
+ condition: service_healthy
+ redis:
+ condition: service_healthy
+ rocketmq-broker:
+ condition: service_started
volumes:
- ./logs/payment:/jeepayhomes/service/logs
- ./conf/payment/application.yml:/jeepayhomes/service/app/application.yml
@@ -153,9 +181,12 @@ services:
ports:
- "9217:9217"
depends_on:
- - mysql
- - redis
- - rocketmq-broker
+ mysql:
+ condition: service_healthy
+ redis:
+ condition: service_healthy
+ rocketmq-broker:
+ condition: service_started
volumes:
- ./logs/manager:/jeepayhomes/service/logs
- ./conf/manager/application.yml:/jeepayhomes/service/app/application.yml
@@ -174,9 +205,12 @@ services:
ports:
- "9218:9218"
depends_on:
- - mysql
- - redis
- - rocketmq-broker
+ mysql:
+ condition: service_healthy
+ redis:
+ condition: service_healthy
+ rocketmq-broker:
+ condition: service_started
volumes:
- ./logs/merchant:/jeepayhomes/service/logs
- ./conf/merchant/application.yml:/jeepayhomes/service/app/application.yml
diff --git a/docker/rocketmq/broker/conf/broker.conf b/docker/rocketmq/broker/conf/broker.conf
index a8f04e2..99ef4df 100644
--- a/docker/rocketmq/broker/conf/broker.conf
+++ b/docker/rocketmq/broker/conf/broker.conf
@@ -1,7 +1,17 @@
-brokerClusterName = DefaultCluster
-brokerName = broker-a
-brokerId = 0
-deleteWhen = 04
-fileReservedTime = 48
-brokerRole = ASYNC_MASTER
-flushDiskType = ASYNC_FLUSH
+brokerClusterName=DefaultCluster
+brokerName=broker-a
+brokerId=0
+deleteWhen=04
+fileReservedTime=48
+brokerRole=ASYNC_MASTER
+flushDiskType=ASYNC_FLUSH
+brokerIP1=172.20.0.13
+namesrvAddr=rocketmq-namesrv:9876
+autoCreateTopicEnable=true
+autoCreateSubscriptionGroup=true
+storePathRootDir=/home/rocketmq/store
+storePathCommitLog=/home/rocketmq/store/commitlog
+storePathConsumeQueue=/home/rocketmq/store/consumequeue
+storePathIndex=/home/rocketmq/store/index
+storeCheckpoint=/home/rocketmq/store/checkpoint
+abortFile=/home/rocketmq/store/abort
diff --git a/jeepay-components/jeepay-components-mq/pom.xml b/jeepay-components/jeepay-components-mq/pom.xml
index 2310866..a8b7f67 100644
--- a/jeepay-components/jeepay-components-mq/pom.xml
+++ b/jeepay-components/jeepay-components-mq/pom.xml
@@ -53,10 +53,16 @@
+
org.apache.rocketmq
rocketmq-spring-boot-starter
- provided
+
+
+
+ javax.annotation
+ javax.annotation-api
@@ -66,6 +72,12 @@
provided
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
diff --git a/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/config/JeepayRocketMqAutoConfiguration.java b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/config/JeepayRocketMqAutoConfiguration.java
new file mode 100644
index 0000000..3709cbe
--- /dev/null
+++ b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/config/JeepayRocketMqAutoConfiguration.java
@@ -0,0 +1,44 @@
+package com.jeequan.jeepay.components.mq.vender.rocketmq.config;
+
+import com.jeequan.jeepay.components.mq.constant.MQVenderCS;
+import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.SmartInitializingSingleton;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+import org.springframework.util.Assert;
+import org.springframework.util.StringUtils;
+
+@Configuration
+@ConditionalOnClass(RocketMQTemplate.class)
+@ConditionalOnProperty(name = MQVenderCS.YML_VENDER_KEY, havingValue = MQVenderCS.ROCKET_MQ)
+public class JeepayRocketMqAutoConfiguration {
+
+ private static final Logger log = LoggerFactory.getLogger(JeepayRocketMqAutoConfiguration.class);
+
+ @Bean
+ public SmartInitializingSingleton jeepayRocketMqSanityCheck(Environment environment) {
+ return () -> {
+ String nameServer = environment.getProperty("rocketmq.name-server");
+ String applicationName = environment.getProperty("spring.application.name");
+ String producerGroup = environment.getProperty("rocketmq.producer.group");
+
+ Assert.hasText(nameServer,
+ "When isys.mq.vender=rocketMQ, property 'rocketmq.name-server' must be configured.");
+ Assert.hasText(producerGroup,
+ "When isys.mq.vender=rocketMQ, property 'rocketmq.producer.group' must be configured.");
+
+ if (!StringUtils.hasText(applicationName)) {
+ log.warn("spring.application.name is empty, RocketMQ consumer groups will use fallback naming.");
+ return;
+ }
+
+ log.info("RocketMQ integration enabled. applicationName={}, nameServer={}, producerGroup={}",
+ applicationName, nameServer, producerGroup);
+ };
+ }
+}
diff --git a/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/config/JeepayRocketMqEnvironmentPostProcessor.java b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/config/JeepayRocketMqEnvironmentPostProcessor.java
new file mode 100644
index 0000000..9d7c362
--- /dev/null
+++ b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/config/JeepayRocketMqEnvironmentPostProcessor.java
@@ -0,0 +1,60 @@
+package com.jeequan.jeepay.components.mq.vender.rocketmq.config;
+
+import com.jeequan.jeepay.components.mq.constant.MQVenderCS;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.env.EnvironmentPostProcessor;
+import org.springframework.core.Ordered;
+import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.core.env.MapPropertySource;
+import org.springframework.util.StringUtils;
+
+import java.util.LinkedHashMap;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * Populate production-safe RocketMQ defaults before RocketMQAutoConfiguration runs.
+ */
+public class JeepayRocketMqEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered {
+
+ private static final String PROPERTY_SOURCE_NAME = "jeepayRocketMqDefaults";
+ private static final String APPLICATION_NAME_KEY = "spring.application.name";
+ private static final String PRODUCER_GROUP_KEY = "rocketmq.producer.group";
+
+ @Override
+ public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
+ if (!MQVenderCS.ROCKET_MQ.equals(environment.getProperty(MQVenderCS.YML_VENDER_KEY))) {
+ return;
+ }
+
+ Map defaults = new LinkedHashMap<>();
+ String applicationName = environment.getProperty(APPLICATION_NAME_KEY);
+
+ if (!StringUtils.hasText(applicationName)) {
+ applicationName = "jeepay";
+ defaults.put(APPLICATION_NAME_KEY, applicationName);
+ }
+
+ if (!StringUtils.hasText(environment.getProperty(PRODUCER_GROUP_KEY))) {
+ defaults.put(PRODUCER_GROUP_KEY, buildProducerGroup(applicationName));
+ }
+
+ defaults.putIfAbsent("rocketmq.producer.send-message-timeout", "10000");
+ defaults.putIfAbsent("rocketmq.producer.retry-times-when-send-failed", "2");
+ defaults.putIfAbsent("rocketmq.producer.retry-times-when-send-async-failed", "2");
+
+ if (!defaults.isEmpty()) {
+ environment.getPropertySources().addLast(new MapPropertySource(PROPERTY_SOURCE_NAME, defaults));
+ }
+ }
+
+ static String buildProducerGroup(String applicationName) {
+ String normalized = applicationName.toUpperCase(Locale.ROOT).replaceAll("[^A-Z0-9]+", "_");
+ return "PID_JEEPAY_" + normalized;
+ }
+
+ @Override
+ public int getOrder() {
+ return Ordered.HIGHEST_PRECEDENCE;
+ }
+}
diff --git a/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/CleanMchLoginAuthCacheRocketMQReceiver.java b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/CleanMchLoginAuthCacheRocketMQReceiver.java
index 827449d..5f5b209 100644
--- a/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/CleanMchLoginAuthCacheRocketMQReceiver.java
+++ b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/CleanMchLoginAuthCacheRocketMQReceiver.java
@@ -36,7 +36,8 @@ import org.springframework.stereotype.Component;
@Component
@ConditionalOnProperty(name = MQVenderCS.YML_VENDER_KEY, havingValue = MQVenderCS.ROCKET_MQ)
@ConditionalOnBean(CleanMchLoginAuthCacheMQ.IMQReceiver.class)
-@RocketMQMessageListener(topic = CleanMchLoginAuthCacheMQ.MQ_NAME, consumerGroup = CleanMchLoginAuthCacheMQ.MQ_NAME)
+@RocketMQMessageListener(topic = CleanMchLoginAuthCacheMQ.MQ_NAME,
+ consumerGroup = "${spring.application.name:jeepay}_" + CleanMchLoginAuthCacheMQ.MQ_NAME)
public class CleanMchLoginAuthCacheRocketMQReceiver implements IMQMsgReceiver, RocketMQListener {
@Autowired
diff --git a/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/PayOrderDivisionRocketMQReceiver.java b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/PayOrderDivisionRocketMQReceiver.java
index 5cee1cd..566b35a 100644
--- a/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/PayOrderDivisionRocketMQReceiver.java
+++ b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/PayOrderDivisionRocketMQReceiver.java
@@ -37,7 +37,8 @@ import org.springframework.stereotype.Component;
@Component
@ConditionalOnProperty(name = MQVenderCS.YML_VENDER_KEY, havingValue = MQVenderCS.ROCKET_MQ)
@ConditionalOnBean(PayOrderDivisionMQ.IMQReceiver.class)
-@RocketMQMessageListener(topic = PayOrderDivisionMQ.MQ_NAME, consumerGroup = PayOrderDivisionMQ.MQ_NAME)
+@RocketMQMessageListener(topic = PayOrderDivisionMQ.MQ_NAME,
+ consumerGroup = "${spring.application.name:jeepay}_" + PayOrderDivisionMQ.MQ_NAME)
public class PayOrderDivisionRocketMQReceiver implements IMQMsgReceiver, RocketMQListener {
@Autowired
diff --git a/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/PayOrderMchNotifyRocketMQReceiver.java b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/PayOrderMchNotifyRocketMQReceiver.java
index 78999c9..13ea1a7 100644
--- a/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/PayOrderMchNotifyRocketMQReceiver.java
+++ b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/PayOrderMchNotifyRocketMQReceiver.java
@@ -38,7 +38,8 @@ import org.springframework.stereotype.Component;
@Component
@ConditionalOnProperty(name = MQVenderCS.YML_VENDER_KEY, havingValue = MQVenderCS.ROCKET_MQ)
@ConditionalOnBean(PayOrderMchNotifyMQ.IMQReceiver.class)
-@RocketMQMessageListener(topic = PayOrderMchNotifyMQ.MQ_NAME, consumerGroup = PayOrderMchNotifyMQ.MQ_NAME)
+@RocketMQMessageListener(topic = PayOrderMchNotifyMQ.MQ_NAME,
+ consumerGroup = "${spring.application.name:jeepay}_" + PayOrderMchNotifyMQ.MQ_NAME)
public class PayOrderMchNotifyRocketMQReceiver implements IMQMsgReceiver, RocketMQListener {
@Autowired
diff --git a/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/PayOrderReissueRocketMQReceiver.java b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/PayOrderReissueRocketMQReceiver.java
index 89f9921..63113a2 100644
--- a/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/PayOrderReissueRocketMQReceiver.java
+++ b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/PayOrderReissueRocketMQReceiver.java
@@ -38,7 +38,8 @@ import org.springframework.stereotype.Component;
@Component
@ConditionalOnProperty(name = MQVenderCS.YML_VENDER_KEY, havingValue = MQVenderCS.ROCKET_MQ)
@ConditionalOnBean(PayOrderReissueMQ.IMQReceiver.class)
-@RocketMQMessageListener(topic = PayOrderReissueMQ.MQ_NAME, consumerGroup = PayOrderReissueMQ.MQ_NAME)
+@RocketMQMessageListener(topic = PayOrderReissueMQ.MQ_NAME,
+ consumerGroup = "${spring.application.name:jeepay}_" + PayOrderReissueMQ.MQ_NAME)
public class PayOrderReissueRocketMQReceiver implements IMQMsgReceiver, RocketMQListener {
@Autowired
diff --git a/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/ResetAppConfigRocketMQReceiver.java b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/ResetAppConfigRocketMQReceiver.java
index d56ed9e..965facb 100644
--- a/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/ResetAppConfigRocketMQReceiver.java
+++ b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/ResetAppConfigRocketMQReceiver.java
@@ -37,7 +37,9 @@ import org.springframework.stereotype.Component;
@Component
@ConditionalOnProperty(name = MQVenderCS.YML_VENDER_KEY, havingValue = MQVenderCS.ROCKET_MQ)
@ConditionalOnBean(ResetAppConfigMQ.IMQReceiver.class)
-@RocketMQMessageListener(topic = ResetAppConfigMQ.MQ_NAME, consumerGroup = ResetAppConfigMQ.MQ_NAME, messageModel = MessageModel.BROADCASTING)
+@RocketMQMessageListener(topic = ResetAppConfigMQ.MQ_NAME,
+ consumerGroup = "${spring.application.name:jeepay}_" + ResetAppConfigMQ.MQ_NAME,
+ messageModel = MessageModel.BROADCASTING)
public class ResetAppConfigRocketMQReceiver implements IMQMsgReceiver, RocketMQListener {
@Autowired
diff --git a/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/ResetIsvMchAppInfoRocketMQReceiver.java b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/ResetIsvMchAppInfoRocketMQReceiver.java
index eaae660..ee657f3 100644
--- a/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/ResetIsvMchAppInfoRocketMQReceiver.java
+++ b/jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/vender/rocketmq/receive/ResetIsvMchAppInfoRocketMQReceiver.java
@@ -37,7 +37,9 @@ import org.springframework.stereotype.Component;
@Component
@ConditionalOnProperty(name = MQVenderCS.YML_VENDER_KEY, havingValue = MQVenderCS.ROCKET_MQ)
@ConditionalOnBean(ResetIsvMchAppInfoConfigMQ.IMQReceiver.class)
-@RocketMQMessageListener(topic = ResetIsvMchAppInfoConfigMQ.MQ_NAME, consumerGroup = ResetIsvMchAppInfoConfigMQ.MQ_NAME, messageModel = MessageModel.BROADCASTING)
+@RocketMQMessageListener(topic = ResetIsvMchAppInfoConfigMQ.MQ_NAME,
+ consumerGroup = "${spring.application.name:jeepay}_" + ResetIsvMchAppInfoConfigMQ.MQ_NAME,
+ messageModel = MessageModel.BROADCASTING)
public class ResetIsvMchAppInfoRocketMQReceiver implements IMQMsgReceiver, RocketMQListener {
@Autowired
diff --git a/jeepay-components/jeepay-components-mq/src/main/resources/META-INF/spring.factories b/jeepay-components/jeepay-components-mq/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000..e4e2b13
--- /dev/null
+++ b/jeepay-components/jeepay-components-mq/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.env.EnvironmentPostProcessor=\
+com.jeequan.jeepay.components.mq.vender.rocketmq.config.JeepayRocketMqEnvironmentPostProcessor
diff --git a/jeepay-manager/Dockerfile b/jeepay-manager/Dockerfile
index d7f2171..a271ae8 100644
--- a/jeepay-manager/Dockerfile
+++ b/jeepay-manager/Dockerfile
@@ -4,8 +4,8 @@
# ------ START ------
-# 基础镜像来自: https://hub.docker.com/ 官方OFFICIAL
-FROM openjdk:17
+# Eclipse Temurin JRE 17(openjdk 官方镜像已停止维护)
+FROM eclipse-temurin:17-jre
MAINTAINER Terrfly
diff --git a/jeepay-manager/src/main/resources/application.yml b/jeepay-manager/src/main/resources/application.yml
index c79ae5d..92668a5 100644
--- a/jeepay-manager/src/main/resources/application.yml
+++ b/jeepay-manager/src/main/resources/application.yml
@@ -2,6 +2,8 @@ server:
port: 9217 #设置端口
spring:
+ application:
+ name: jeepay-manager
data:
redis:
database: 1 #1库:运营平台 #2库:商户系统 #3库:支付网关
diff --git a/jeepay-merchant/Dockerfile b/jeepay-merchant/Dockerfile
index d43a0c1..da311e5 100644
--- a/jeepay-merchant/Dockerfile
+++ b/jeepay-merchant/Dockerfile
@@ -4,8 +4,8 @@
# ------ START ------
-# 基础镜像来自: https://hub.docker.com/ 官方OFFICIAL
-FROM openjdk:17
+# Eclipse Temurin JRE 17(openjdk 官方镜像已停止维护)
+FROM eclipse-temurin:17-jre
MAINTAINER Terrfly
diff --git a/jeepay-merchant/src/main/resources/application.yml b/jeepay-merchant/src/main/resources/application.yml
index a83d538..4f151f1 100644
--- a/jeepay-merchant/src/main/resources/application.yml
+++ b/jeepay-merchant/src/main/resources/application.yml
@@ -2,6 +2,8 @@ server:
port: 9218 #设置端口
spring:
+ application:
+ name: jeepay-merchant
data:
redis:
database: 2 #1库:运营平台 #2库:商户系统 #3库:支付网关
diff --git a/jeepay-payment/Dockerfile b/jeepay-payment/Dockerfile
index aa672a4..de8d266 100644
--- a/jeepay-payment/Dockerfile
+++ b/jeepay-payment/Dockerfile
@@ -4,8 +4,8 @@
# ------ START ------
-# 基础镜像来自: https://hub.docker.com/ 官方OFFICIAL
-FROM openjdk:17
+# Eclipse Temurin JRE 17(openjdk 官方镜像已停止维护)
+FROM eclipse-temurin:17-jre
MAINTAINER Terrfly
diff --git a/jeepay-payment/src/main/resources/application.yml b/jeepay-payment/src/main/resources/application.yml
index bb58440..1ee60d7 100644
--- a/jeepay-payment/src/main/resources/application.yml
+++ b/jeepay-payment/src/main/resources/application.yml
@@ -2,6 +2,8 @@ server:
port: 9216 #设置端口
spring:
+ application:
+ name: jeepay-payment
data:
redis:
database: 3 #1库:运营平台 #2库:商户系统 #3库:支付网关