liulingling.177216
2024-08-26 349f1cfc5fa77fbc636d542df0d8050fddec48c2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package com.dingzhuo.compute.engine.actor.device;
 
import akka.actor.ActorSelection;
import akka.actor.ActorSystem;
import akka.actor.UntypedAbstractActor;
import com.dingzhuo.compute.engine.actor.alarm.PeriodAlarmActor;
import com.dingzhuo.compute.engine.message.device.DeviceStatusJudgeMessage;
import com.dingzhuo.compute.engine.message.device.LoadDeviceStatusMessage;
import com.dingzhuo.compute.engine.message.device.UnloadDeviceStatusMessage;
import com.dingzhuo.compute.engine.utils.ActorUtil;
import com.dingzhuo.compute.engine.utils.CacheService;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import scala.concurrent.duration.Duration;
import scala.concurrent.duration.FiniteDuration;
 
@Component("deviceStatusTimerActor")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class DeviceStatusTimerActor extends UntypedAbstractActor {
 
  public static final String ACTOR_NAME = "deviceStatusTimerActor";
  private List<String> actorIds = new ArrayList<>();
  private final ActorSystem actorSystem;
  private final CacheService cacheService;
  private ActorSelection deviceStatusActor;
 
  public DeviceStatusTimerActor(ActorSystem actorSystem, CacheService cacheService) {
    this.actorSystem = actorSystem;
    this.cacheService = cacheService;
  }
 
  @Override
  public void preStart() throws Exception {
    super.preStart();
 
    deviceStatusActor = getContext()
        .actorSelection(ActorUtil.getActorAddress(DeviceStatusActor.ACTOR_NAME));
    FiniteDuration interval = Duration.create(30, TimeUnit.SECONDS);
    FiniteDuration delay = Duration.Zero();
    actorSystem.scheduler()
        .scheduleAtFixedRate(delay, interval, self(), Message.TIMER, actorSystem.dispatcher(),
            self());
  }
 
  @Override
  public void onReceive(Object message) {
    if (message instanceof LoadDeviceStatusMessage) {
      LoadDeviceStatusMessage loadMessage = (LoadDeviceStatusMessage) message;
      actorIds.add(loadMessage.getActorId());
      cacheService.cacheDeviceStatusSetting(loadMessage.getDeviceFormula());
    } else if (message instanceof UnloadDeviceStatusMessage) {
      UnloadDeviceStatusMessage unloadMessage = (UnloadDeviceStatusMessage) message;
      actorIds.remove(unloadMessage.getActorId());
      cacheService.removeDeviceStatusSetting(unloadMessage.getActorId());
    } else if (message == Message.TIMER) {
      doTimer();
    }
  }
 
  private void doTimer() {
    if (!actorIds.isEmpty()) {
      actorIds.forEach(id -> deviceStatusActor.tell(new DeviceStatusJudgeMessage(id), getSelf()));
    }
  }
 
  enum Message {
    /**
     * 到点触发
     */
    TIMER
  }
}