在akka中重新启动已取消的计划程序

在akka中重新启动已取消的计划程序,akka,scheduler,Akka,Scheduler,我刚从Akka开始,已经创建了一个测试应用程序。在其中,我创建了一群参与者,他们创建了一个调度器来生成心跳事件。对于另一种类型的事件,我使用heartbeat.cancel()取消调度程序,但我希望在发生其他事件时重新启动它。如果我重新创建调度程序,我会看到内存消耗不断增加 接下来的问题是如何恢复调度程序,或者如何正确地处理调度程序 这是那个演员的密码 public class Device extends UntypedActor { enum CommunicationStatus

我刚从Akka开始,已经创建了一个测试应用程序。在其中,我创建了一群参与者,他们创建了一个调度器来生成心跳事件。对于另一种类型的事件,我使用
heartbeat.cancel()取消调度程序,但我希望在发生其他事件时重新启动它。如果我重新创建调度程序,我会看到内存消耗不断增加

接下来的问题是如何恢复调度程序,或者如何正确地处理调度程序

这是那个演员的密码

public class Device extends UntypedActor {

    enum CommunicationStatus{
        OK,
        FAIL,
        UNKNOWN
    }

    private static class Heartbeat {

    }

    public final String deviceId;
    private CommunicationStatus commStatus;
    private Cancellable heartBeatScheduler;

    public Device(String Id)
    {
        deviceId = Id;
        commStatus = CommunicationStatus.UNKNOWN;

    }

    @Override
    public void preStart() {
        getContext().system().eventStream().subscribe(getSelf(), DeviceCommunicationStatusUpdated.class);
        startHeartbeat();
    }

    @Override
    public void postStop() {
        stopHeartBeat();
    }

    private void startHeartbeat() {

        LoggingAdapter log = Logging.getLogger(getContext().system(), this);
        log.info("Starting heartbeat");

        heartBeatScheduler = getContext().system().scheduler().
                schedule(Duration.Zero(),
                        Duration.create(1, TimeUnit.SECONDS),
                        getContext().self(),
                        new Heartbeat(),
                        getContext().system().dispatcher(),
                        ActorRef.noSender());
    }

    private void stopHeartBeat() {
        if(!heartBeatScheduler.isCancelled()) {
            LoggingAdapter log = Logging.getLogger(getContext().system(), this);
            log.info("Stopping heartbeat");
            heartBeatScheduler.cancel();
        }
    }

    public String getDeviceId() {
        return deviceId;
    }

    public CommunicationStatus getCommunicationStatus(){
        return commStatus;
    }

    @Override
    public void onReceive(Object message) throws Exception {
        LoggingAdapter log = Logging.getLogger(getContext().system(), this);

        if(message instanceof Heartbeat){
            log.info("Pum, pum");
        }
        else if (message instanceof DeviceCommunicationStatusUpdated){
            DeviceCommunicationStatusUpdated event = (DeviceCommunicationStatusUpdated) message;

            if(event.deviceId == this.deviceId){
                log.info("Received communication status update. '{}' is now {}", deviceId, event.state);
                this.commStatus =
                        event.state == DeviceCommunicationStatusUpdated.State.OK ?
                                CommunicationStatus.OK : CommunicationStatus.FAIL;

                if(commStatus == CommunicationStatus.OK && heartBeatScheduler.isCancelled()){
                    startHeartbeat();
                }
                else {
                    stopHeartBeat();
                }

            }
        }

        else unhandled(message);
    }
}

最后没有泄漏,只是我是Java新手,对垃圾收集不耐烦。在任何情况下,我都想知道计划程序的重置/重新启动。

您所说的“内存消耗增加”是什么意思?存在泄漏。在每次创建新调度程序的事件之后,进程都会占用更多内存,而在取消它们时不会释放它。对于可取消类来说,没有什么比重新启动更好的了。当您实例化heartBearScheduler变量时,您只需要像代码中那样调用一个新的调度器