package com.ard.gb28181.task.deviceStatus; import com.ard.gb28181.api.bean.SipTransactionInfo; import com.ard.gb28181.api.common.DeviceStatusCallback; import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; @Slf4j @Data public class DeviceStatusTask implements Delayed { private String deviceId; private SipTransactionInfo transactionInfo; /** * 超时时间(单位: 毫秒) */ private long delayTime; private DeviceStatusCallback callback; public static DeviceStatusTask getInstance(String deviceId, SipTransactionInfo transactionInfo, long delayTime, DeviceStatusCallback callback) { DeviceStatusTask deviceStatusTask = new DeviceStatusTask(); deviceStatusTask.setDeviceId(deviceId); deviceStatusTask.setTransactionInfo(transactionInfo); deviceStatusTask.setDelayTime(delayTime); deviceStatusTask.setCallback(callback); return deviceStatusTask; } public void expired() { if (callback == null) { log.info("[设备离线] 未找到过期处理回调, {}", deviceId); return; } callback.run(deviceId, transactionInfo); } @Override public long getDelay(@NotNull TimeUnit unit) { return unit.convert(delayTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS); } @Override public int compareTo(@NotNull Delayed o) { return (int) (this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS)); } public DeviceStatusTaskInfo getInfo() { DeviceStatusTaskInfo taskInfo = new DeviceStatusTaskInfo(); taskInfo.setTransactionInfo(transactionInfo); taskInfo.setDeviceId(deviceId); return taskInfo; } }