Akka Actor中的timers.startSingleTimer和scheduler.scheduleOnce有什么区别?

时间:2019-01-30 09:38:46

标签: scala akka scheduling actor

我正在设计一个演员,该演员应该安排向自己发送消息。

我注意到至少有两种方法可以做到。

我想了解选择合适的商品的区别。

第一种是akka.actor.Timers的一种方法:

def startSingleTimer(key: Any, msg: Any, timeout: FiniteDuration): Unit

第二种是actor上下文系统的调度程序的常见方法:

final def scheduleOnce(
    delay:    FiniteDuration,
    receiver: ActorRef,
    message:  Any)(implicit executor: ExecutionContext,
                            sender: ActorRef = Actor.noSender): Cancellable

问题:

  • 在安排 自己发消息吗?
  • 将actor上下文传递给scheduleOnce方法是个好主意吗?

1 个答案:

答案 0 :(得分:4)

akka.actor.Timers.startSingleTimer

  • 只能在演员中使用
  • 允许向自己安排消息,即无法向其他参与者安排消息
  • 如果演员去世,活动计时器将自动取消
  • 由用户提供的final HorizontalScrollView s = (HorizontalScrollView) findViewById(R.id.hscrollview); s.post(new Runnable() { public void run() { s.fullScroll(HorizontalScrollView.FOCUS_LEFT); s.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int padding = getResources().getDisplayMetrics().widthPixels / 2; s.setPadding(padding, 0, padding, 0); s.setClipToPadding(false); } }); } }); 跟踪活动计时器

context.system.scheduler.scheduleOnce

  • 可用于安排参与者外部和内部的消息
  • key需要显式ActorRef,可选receiver则需要
  • 没有自动清理过程。应该通过调用返回的sender
  • 来显式处理所有内容

因此,如果您只需要自己安排消息,请选择akka.actor.Cancellable

  

将actor上下文传递给scheduleOnce方法是一个好主意吗?

不确定要以哪种方式进行操作,但通常必须仅在akka.actor.Timers方法内使用actor上下文,并且不要将其传递给receive的回调方法中既不使用的actor。