feat(mqtt): 启用生产环境MQTT服务并优化GPS日志保存逻辑

- 在application-prod.yml中将MQTT服务enabled设置为true
- 引入StringRedisTemplate用于Redis分布式锁控制-重构GPS轨迹日志保存方法,增加Redis原子锁控制频率
-仅在GPS速度不为0时保存轨迹日志,避免无效数据- 使用Redis setIfAbsent实现2分钟内同一设备只保存一次日志
- 完善日志记录,增加设备、速度、经纬度等关键信息
-优化异常处理,记录具体设备号便于问题追踪
This commit is contained in:
2025-11-10 12:37:01 +08:00
parent bf1a54e520
commit 7faf588314
2 changed files with 35 additions and 13 deletions

View File

@@ -13,6 +13,7 @@ import com.gxwebsoft.hjm.entity.HjmGpsLog;
import com.gxwebsoft.hjm.service.impl.HjmCarServiceImpl; import com.gxwebsoft.hjm.service.impl.HjmCarServiceImpl;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
@@ -44,6 +45,9 @@ public class GpsMessageProcessor {
@Resource @Resource
private RedisUtil redisUtil; private RedisUtil redisUtil;
@Resource
private StringRedisTemplate stringRedisTemplate;
@Resource @Resource
private HjmCarServiceImpl hjmCarServiceImpl; private HjmCarServiceImpl hjmCarServiceImpl;
@@ -128,11 +132,8 @@ public class GpsMessageProcessor {
if (hjmCarService.updateByGpsNo(car)) { if (hjmCarService.updateByGpsNo(car)) {
logger.debug("更新车辆GPS定位信息成功: {}", car.getCode()); logger.debug("更新车辆GPS定位信息成功: {}", car.getCode());
// 检查是否需要保存GPS日志避免重复保存 // 保存GPS轨迹日志(通过Redis控制频率
String keyByGpsNo = redisUtil.get(gps.getImei()); saveGpsLogRecord(car, gps);
if (StrUtil.isBlank(keyByGpsNo)) {
saveGpsLogRecord(car, gps);
}
} else { } else {
logger.warn("更新车辆GPS定位信息失败: {}", car.getCode()); logger.warn("更新车辆GPS定位信息失败: {}", car.getCode());
} }
@@ -144,9 +145,31 @@ public class GpsMessageProcessor {
/** /**
* 保存GPS轨迹日志记录 * 保存GPS轨迹日志记录
* 使用Redis控制保存频率同一GPS设备2分钟内只保存一次
*/ */
private void saveGpsLogRecord(HjmCar car, Gps gps) { private void saveGpsLogRecord(HjmCar car, Gps gps) {
try { try {
// 只有速度不为0时才保存GPS轨迹
if (gps.getSpeed().equals("0.000")) {
logger.debug("GPS设备{}速度为0跳过保存轨迹日志", gps.getImei());
return;
}
// 构造Redis key使用GPS设备编号作为key
String redisKey = "gps_log:" + gps.getImei();
// 使用Redis的setIfAbsent原子操作实现分布式锁
// 只有key不存在时才设置成功返回truekey已存在时返回false
Boolean lockAcquired = stringRedisTemplate.opsForValue()
.setIfAbsent(redisKey, "locked", 2, TimeUnit.MINUTES);
if (Boolean.FALSE.equals(lockAcquired)) {
// 获取锁失败说明2分钟内已经保存过
logger.debug("GPS设备{}在2分钟内已保存过轨迹日志跳过本次保存", gps.getImei());
return;
}
// 获取锁成功,执行保存操作
HjmGpsLog log = new HjmGpsLog(); HjmGpsLog log = new HjmGpsLog();
log.setTenantId(10519); log.setTenantId(10519);
log.setCarId(car.getId()); log.setCarId(car.getId());
@@ -157,15 +180,14 @@ public class GpsMessageProcessor {
log.setHhmmss(gps.getHhmmss()); log.setHhmmss(gps.getHhmmss());
log.setSpeed(gps.getSpeed()); log.setSpeed(gps.getSpeed());
if (!log.getSpeed().equals("0.000")) { // 保存数据库
// 使用Rediskey为GPS设备编号 2分钟内保存一次 hjmGpsLogService.save(log);
redisUtil.set(gps.getImei(), "1", 2L, TimeUnit.MINUTES);
hjmGpsLogService.save(log); logger.info("保存GPS轨迹日志成功: 设备={}, 速度={}, 经度={}, 纬度={}",
logger.debug("保存GPS轨迹日志成功: {}", gps.getImei()); gps.getImei(), gps.getSpeed(), gps.getLng(), gps.getLat());
}
} catch (Exception e) { } catch (Exception e) {
logger.error("保存GPS轨迹日志失败", e); logger.error("保存GPS轨迹日志失败: 设备={}", gps.getImei(), e);
} }
} }

View File

@@ -32,7 +32,7 @@ socketio:
# MQTT配置 # MQTT配置
mqtt: mqtt:
enabled: false # 启用MQTT服务 enabled: true # 启用MQTT服务
host: tcp://1.14.159.185:1883 host: tcp://1.14.159.185:1883
username: swdev username: swdev
password: Sw20250523 password: Sw20250523