Compare commits

...

4 Commits

Author SHA1 Message Date
zc
e9a698c728 Merge branch 'refs/heads/dev_zc' into td_h5
# Conflicts:
#	example/mqtt-car/src/main/java/org/dromara/mica/mqtt/server/entity/CarPassGather.java
#	example/mqtt-car/src/main/java/org/dromara/mica/mqtt/server/listener/CarMessageListener.java
#	example/mqtt-car/src/main/java/org/dromara/mica/mqtt/server/task/HeartbeatOnLineTask.java
#	example/mqtt-car/src/main/resources/application-dev.yml
#	example/mqtt-car/src/main/resources/application-prod.yml
2026-05-12 14:05:15 +08:00
zc
118729ccb2 优化redis,mysql超时异常处理,定时任务线程池扩容 2026-05-12 11:46:26 +08:00
zc
4c41f6f77e 主键自增 2026-04-30 15:40:37 +08:00
zc
90003d79c5 主键自增 2026-04-30 14:54:25 +08:00
7 changed files with 190 additions and 91 deletions

View File

@@ -0,0 +1,35 @@
package org.dromara.mica.mqtt.server.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
/**
* 定时任务线程池配置
* 解决默认定时任务线程池(大小为1)被阻塞导致所有定时任务无法执行的问题
*/
@Slf4j
@Configuration
@EnableScheduling
public class SchedulerConfig {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
// 增加线程池大小,避免单线程阻塞影响所有定时任务
scheduler.setPoolSize(5);
scheduler.setThreadNamePrefix("mqtt-scheduler-");
// 等待所有任务完成后再关闭
scheduler.setWaitForTasksToCompleteOnShutdown(true);
// 等待时间
scheduler.setAwaitTerminationSeconds(60);
// 设置异常处理器,确保异常被记录但不中断定时任务
scheduler.setErrorHandler(throwable -> {
log.error("定时任务执行异常", throwable);
});
return scheduler;
}
}

View File

@@ -80,7 +80,11 @@ public class RedisService {
*/ */
public <T> void setCacheObject(final String key, final T value, final Long timeout, final TimeUnit timeUnit) public <T> void setCacheObject(final String key, final T value, final Long timeout, final TimeUnit timeUnit)
{ {
try {
redisTemplate.opsForValue().set(key, value, timeout, timeUnit); redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
} catch (Exception e) {
log.error("Redis setCacheObject error: key={}", key, e);
}
} }
/** /**
@@ -127,7 +131,12 @@ public class RedisService {
*/ */
public Boolean hasKey(String key) public Boolean hasKey(String key)
{ {
try {
return redisTemplate.hasKey(key); return redisTemplate.hasKey(key);
} catch (Exception e) {
log.error("Redis hasKey error: key={}", key, e);
return false;
}
} }
/** /**
@@ -138,8 +147,13 @@ public class RedisService {
*/ */
public <T> T getCacheObject(final String key) public <T> T getCacheObject(final String key)
{ {
try {
ValueOperations<String, T> operation = redisTemplate.opsForValue(); ValueOperations<String, T> operation = redisTemplate.opsForValue();
return operation.get(key); return operation.get(key);
} catch (Exception e) {
log.error("Redis getCacheObject error: key={}", key, e);
return null;
}
} }
/** /**

View File

@@ -50,6 +50,8 @@ public class PlatePublishTask {
*/ */
// @Scheduled(fixedDelay = 8 * 1000) // @Scheduled(fixedDelay = 8 * 1000)
public void run() { public void run() {
// 添加异常捕获,防止单个任务异常导致定时任务线程阻塞
try {
String whiteUrl = "device/%s/message/down/white_list_operator"; String whiteUrl = "device/%s/message/down/white_list_operator";
//新增&编辑车牌 //新增&编辑车牌
@@ -136,7 +138,10 @@ public class PlatePublishTask {
} }
} }
} catch (Exception e) {
// 捕获所有异常并记录日志,确保定时任务能继续执行
log.error("PlatePublishTask 定时任务执行异常", e);
}
} }

View File

@@ -1,12 +1,33 @@
spring: spring:
datasource: datasource:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/td_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:mysql://127.0.0.1:3306/td_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&connectTimeout=5000&socketTimeout=30000
username: root username: root
password: root password: root
# Druid 连接池配置
druid:
max-active: 20
max-wait: 60000
min-idle: 5
initial-size: 5
validation-query: SELECT 1
test-while-idle: true
test-on-borrow: false
test-on-return: false
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
data: data:
redis: redis:
# host: 127.0.0.1
host: 192.168.2.30 host: 192.168.2.30
password: redis2025 password: redis2025
database: 5 database: 5
port: 6379 port: 6379
# Redis 超时配置,防止连接阻塞
timeout: 5000ms
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 2
max-wait: 5000ms

View File

@@ -2,13 +2,32 @@ spring:
datasource: datasource:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
#td #td
url: jdbc:mysql://192.168.251.16:3306/td_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:mysql://192.168.251.16:3306/td_cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&connectTimeout=5000&socketTimeout=30000
username: root username: root
password: td@JJ2024 password: td@JJ2024
# Druid 连接池配置
druid:
max-active: 20
max-wait: 60000
min-idle: 5
initial-size: 5
validation-query: SELECT 1
test-while-idle: true
test-on-borrow: false
test-on-return: false
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
data: data:
redis: redis:
host: 192.168.251.16 host: 192.168.251.16
port: 6379 port: 6379
password: password:
database: 2 database: 2
# Redis 超时配置,防止连接阻塞
timeout: 5000ms
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 2
max-wait: 5000ms

View File

@@ -6,8 +6,8 @@ spring:
name: mica-mqtt-server name: mica-mqtt-server
# 环境 dev|test|prod # 环境 dev|test|prod
profiles: profiles:
# active: dev active: dev
active: prod # active: prod
messages: messages:
encoding: UTF-8 encoding: UTF-8
basename: i18n/messages basename: i18n/messages
@@ -127,3 +127,8 @@ logging:
server: info # t-io 服务端默认日志 server: info # t-io 服务端默认日志
org.tio: info # t-io 服务端默认日志 org.tio: info # t-io 服务端默认日志
org.dromara.mica.mqtt: info # mica-mqtt 日志 org.dromara.mica.mqtt: info # mica-mqtt 日志
org.dromara.mica.mqtt.server.task: debug # 定时任务日志级别
# 定时任务线程池配置
scheduler:
pool-size: 5