feat: 优化DjiService缓存清除逻辑
- 无人机和机场state消息触发时统一清除机场和所有关联无人机的ThingsBoard缓存 - 添加WebSocket广播机场ID功能 - 优化缓存失效策略,确保数据实时性
This commit is contained in:
parent
73e41bdb68
commit
86a1ca4a1d
|
|
@ -4,6 +4,7 @@ import com.ruoyi.device.domain.api.IAircraftDomain;
|
||||||
import com.ruoyi.device.domain.api.IDeviceDomain;
|
import com.ruoyi.device.domain.api.IDeviceDomain;
|
||||||
import com.ruoyi.device.domain.api.IDockAircraftDomain;
|
import com.ruoyi.device.domain.api.IDockAircraftDomain;
|
||||||
import com.ruoyi.device.domain.api.IDockDomain;
|
import com.ruoyi.device.domain.api.IDockDomain;
|
||||||
|
import com.ruoyi.device.domain.api.IThingsBoardDomain;
|
||||||
import com.ruoyi.device.domain.impl.DockDomainImpl;
|
import com.ruoyi.device.domain.impl.DockDomainImpl;
|
||||||
import com.ruoyi.device.domain.impl.djimqtt.callback.IDockDataCallback;
|
import com.ruoyi.device.domain.impl.djimqtt.callback.IDockDataCallback;
|
||||||
import com.ruoyi.device.domain.impl.djimqtt.callback.IDroneDataCallback;
|
import com.ruoyi.device.domain.impl.djimqtt.callback.IDroneDataCallback;
|
||||||
|
|
@ -17,6 +18,7 @@ import com.ruoyi.device.domain.model.Aircraft;
|
||||||
import com.ruoyi.device.domain.model.Device;
|
import com.ruoyi.device.domain.model.Device;
|
||||||
import com.ruoyi.device.domain.model.Dock;
|
import com.ruoyi.device.domain.model.Dock;
|
||||||
import com.ruoyi.device.domain.model.DockAircraft;
|
import com.ruoyi.device.domain.model.DockAircraft;
|
||||||
|
import com.ruoyi.device.websocket.StatisticsWebSocket;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
||||||
|
|
@ -50,6 +52,9 @@ public class DjiService {
|
||||||
@Autowired
|
@Autowired
|
||||||
private IDockAircraftDomain dockAircraftDomain;
|
private IDockAircraftDomain dockAircraftDomain;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IThingsBoardDomain thingsBoardDomain;
|
||||||
|
|
||||||
@EventListener(ApplicationReadyEvent.class)
|
@EventListener(ApplicationReadyEvent.class)
|
||||||
public void onApplicationReady() {
|
public void onApplicationReady() {
|
||||||
|
|
||||||
|
|
@ -82,6 +87,10 @@ public class DjiService {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
log.info("droneData:{}", droneData);
|
log.info("droneData:{}", droneData);
|
||||||
|
|
||||||
|
// 判断是否是 state 触发
|
||||||
|
boolean isStateMessage = "state".equalsIgnoreCase(droneData.getMessageType());
|
||||||
|
|
||||||
// 更新 Dock 表的 lastActiveTime
|
// 更新 Dock 表的 lastActiveTime
|
||||||
Device device = deviceDomain.selectDeviceByDeviceSn(droneData.getDeviceSn());
|
Device device = deviceDomain.selectDeviceByDeviceSn(droneData.getDeviceSn());
|
||||||
if(Objects.nonNull(device)) {
|
if(Objects.nonNull(device)) {
|
||||||
|
|
@ -94,6 +103,24 @@ public class DjiService {
|
||||||
if(Objects.nonNull(dock)) {
|
if(Objects.nonNull(dock)) {
|
||||||
dock.setLastActiveTime(new Date());
|
dock.setLastActiveTime(new Date());
|
||||||
dockDomain.updateDock(dock);
|
dockDomain.updateDock(dock);
|
||||||
|
|
||||||
|
// 如果是 state 消息,清除无人机和机场的 ThingsBoard 缓存并广播
|
||||||
|
if(isStateMessage) {
|
||||||
|
// 清除机场缓存
|
||||||
|
Device dockDevice = deviceDomain.selectDeviceByDeviceId(dock.getDeviceId());
|
||||||
|
if(Objects.nonNull(dockDevice) && Objects.nonNull(dockDevice.getIotDeviceId())) {
|
||||||
|
thingsBoardDomain.evictDeviceAttributesCache(dockDevice.getIotDeviceId());
|
||||||
|
thingsBoardDomain.evictDeviceTelemetryCache(dockDevice.getIotDeviceId());
|
||||||
|
}
|
||||||
|
|
||||||
|
thingsBoardDomain.evictDeviceAttributesCache(device.getIotDeviceId());
|
||||||
|
thingsBoardDomain.evictDeviceTelemetryCache(device.getIotDeviceId());
|
||||||
|
|
||||||
|
|
||||||
|
// 广播机场 ID
|
||||||
|
StatisticsWebSocket.broadcast(String.valueOf(dock.getDockId()));
|
||||||
|
log.debug("已广播机场ID: dockId={}", dock.getDockId());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -107,7 +134,48 @@ public class DjiService {
|
||||||
handler.registerDockDataCallback(new IDockDataCallback() {
|
handler.registerDockDataCallback(new IDockDataCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onDockData(DockData dockData) {
|
public void onDockData(DockData dockData) {
|
||||||
// log.info("droneData:{}", dockData);
|
// log.info("dockData:{}", dockData);
|
||||||
|
|
||||||
|
// 判断是否是 state 触发
|
||||||
|
boolean isStateMessage = "state".equalsIgnoreCase(dockData.getMessageType());
|
||||||
|
|
||||||
|
// 如果是 state 消息,处理缓存清除和广播
|
||||||
|
if(isStateMessage) {
|
||||||
|
Device dockDevice = deviceDomain.selectDeviceByDeviceSn(dockData.getDeviceSn());
|
||||||
|
if(Objects.nonNull(dockDevice)) {
|
||||||
|
// 查找机场
|
||||||
|
Dock dock = dockDomain.selectDockByDeviceId(dockDevice.getDeviceId());
|
||||||
|
if(Objects.nonNull(dock)) {
|
||||||
|
|
||||||
|
// 清除机场设备的 ThingsBoard 缓存
|
||||||
|
if(Objects.nonNull(dockDevice.getIotDeviceId())) {
|
||||||
|
thingsBoardDomain.evictDeviceAttributesCache(dockDevice.getIotDeviceId());
|
||||||
|
thingsBoardDomain.evictDeviceTelemetryCache(dockDevice.getIotDeviceId());
|
||||||
|
// log.debug("已清除机场缓存: deviceSn={}, iotDeviceId={}", dockData.getDeviceSn(), dockDevice.getIotDeviceId());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清除机场关联的所有无人机缓存
|
||||||
|
List<DockAircraft> dockAircrafts = dockAircraftDomain.selectDockAircraftByDockId(dock.getDockId());
|
||||||
|
if(!dockAircrafts.isEmpty()) {
|
||||||
|
for(DockAircraft dockAircraft : dockAircrafts) {
|
||||||
|
Aircraft aircraft = aircraftDomain.selectAircraftByAircraftId(dockAircraft.getAircraftId());
|
||||||
|
if(Objects.nonNull(aircraft)) {
|
||||||
|
Device droneDevice = deviceDomain.selectDeviceByDeviceId(aircraft.getDeviceId());
|
||||||
|
if(Objects.nonNull(droneDevice) && Objects.nonNull(droneDevice.getIotDeviceId())) {
|
||||||
|
thingsBoardDomain.evictDeviceAttributesCache(droneDevice.getIotDeviceId());
|
||||||
|
thingsBoardDomain.evictDeviceTelemetryCache(droneDevice.getIotDeviceId());
|
||||||
|
// log.debug("已清除无人机缓存: aircraftId={}, iotDeviceId={}", aircraft.getAircraftId(), droneDevice.getIotDeviceId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 广播机场 ID
|
||||||
|
StatisticsWebSocket.broadcast(String.valueOf(dock.getDockId()));
|
||||||
|
log.debug("已广播机场ID: dockId={}", dock.getDockId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue