mirror of
https://gitee.com/jeequan/jeepay.git
synced 2026-09-17 16:39:53 +08:00
优化:完善 Docker Compose 部署与 RocketMQ 版本整合
主要变更: - RocketMQ Server 从 5.1.4 升级到 5.3.1,修复 Broker NPE 启动失败问题 - Dockerfile 基础镜像从 openjdk:17 切换为 eclipse-temurin:17-jre - 修复 RocketMQ volume 权限问题(user: "0:0") - 补充 NameServer 健康检查,Broker 等待 NameServer 就绪后启动 - 统一各模块 conf/ 数据库密码与 docker-compose 一致 - 更新 README Docker 部署文档:镜像加速源、组件版本、常见问题排查 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,2 +1,2 @@
|
||||
# ui项目的根路径
|
||||
UI_BASE_DIR=/Users/dingzhiwei/work/idea_wk/gitee_wk
|
||||
UI_BASE_DIR=/Users/dingzhiwei/work/dev/jeepay-open
|
||||
|
||||
@@ -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 会自动尝试下一个。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
+49
-15
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -53,10 +53,16 @@
|
||||
</dependency>
|
||||
|
||||
<!-- RocketMQ -->
|
||||
<!-- Docker/独立部署场景需要将 RocketMQ Spring 依赖实际打包进最终产物,
|
||||
否则运行时会缺少 org.apache.rocketmq.spring.core.RocketMQListener 等类。 -->
|
||||
<dependency>
|
||||
<groupId>org.apache.rocketmq</groupId>
|
||||
<artifactId>rocketmq-spring-boot-starter</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>javax.annotation</groupId>
|
||||
<artifactId>javax.annotation-api</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- AliyunRocketMQ -->
|
||||
@@ -66,6 +72,12 @@
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- ↑↑↑↑↑↑ MQ依赖包 ↑↑↑↑↑↑ -->
|
||||
|
||||
</dependencies>
|
||||
|
||||
+44
@@ -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);
|
||||
};
|
||||
}
|
||||
}
|
||||
+60
@@ -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<String, Object> 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;
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -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<String> {
|
||||
|
||||
@Autowired
|
||||
|
||||
+2
-1
@@ -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<String> {
|
||||
|
||||
@Autowired
|
||||
|
||||
+2
-1
@@ -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<String> {
|
||||
|
||||
@Autowired
|
||||
|
||||
+2
-1
@@ -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<String> {
|
||||
|
||||
@Autowired
|
||||
|
||||
+3
-1
@@ -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<String> {
|
||||
|
||||
@Autowired
|
||||
|
||||
+3
-1
@@ -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<String> {
|
||||
|
||||
@Autowired
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
org.springframework.boot.env.EnvironmentPostProcessor=\
|
||||
com.jeequan.jeepay.components.mq.vender.rocketmq.config.JeepayRocketMqEnvironmentPostProcessor
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@ server:
|
||||
port: 9217 #设置端口
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: jeepay-manager
|
||||
data:
|
||||
redis:
|
||||
database: 1 #1库:运营平台 #2库:商户系统 #3库:支付网关
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@ server:
|
||||
port: 9218 #设置端口
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: jeepay-merchant
|
||||
data:
|
||||
redis:
|
||||
database: 2 #1库:运营平台 #2库:商户系统 #3库:支付网关
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@ server:
|
||||
port: 9216 #设置端口
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: jeepay-payment
|
||||
data:
|
||||
redis:
|
||||
database: 3 #1库:运营平台 #2库:商户系统 #3库:支付网关
|
||||
|
||||
Reference in New Issue
Block a user