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