2

我正在尝试使用 Akka TypedActors (1.1.2)。我有一个类似的界面

trait Namespace  {
  def cellCount: Int
  def isEmpty: Boolean
  def cell(key: String): Option[CellOperations[_]]
  def cellsLike(key: String): List[CellOperations[_]]
  def updateOrCreateCell[T](n: String, v: Option[T]=None, d:List[DataOps[T]]=List.empty[DataOps[T]])
}

我有一个定义明确的 NamespaceImpl 来扩展它。

class NamespaceImpl extends TypedActor with Namespace with Logging {
    ...
}

我通过 Spring 创建了 actor:

<akka:typed-actor id="namespace"
                  interface="com.fi.depends.namespace.akka.Namespace"
                  implementation="com.fi.depends.namespace.akka.NamespaceImpl"
                  timeout="10000"
                  scope="singleton">
</akka:typed-actor>

在运行时,我会定期对 updateOrCreateCell 的调用超时,据我了解,这不应该发生,因为该方法是 Unit 类型,因此我希望它生成异步调用。

在堆栈跟踪中,我看到:

akka.dispatch.FutureTimeoutException: Futures timed out after [10000] milliseconds
[NYCWD2328_1c52ee80-c372-11e0-8343-0023ae9118d8]
    at akka.dispatch.DefaultCompletableFuture.await(Future.scala:718)
    at akka.actor.ScalaActorRef$class.$bang$bang(ActorRef.scala:1332)
    at akka.actor.LocalActorRef.$bang$bang(ActorRef.scala:587)
    at akka.actor.ActorAspect.localDispatch(TypedActor.scala:966)
    at akka.actor.TypedActorAspect.dispatch(TypedActor.scala:904)
    at akka.actor.TypedActorAspect.invoke(TypedActor.scala:899)
    at com.fi.depends.namespace.akka.Namespace$$ProxiedByAWDelegation$$1314085842186_1__786390915__878797045___AW_JoinPoint.proceed(Unknown Source)
    at com.fi.depends.namespace.akka.Namespace$$ProxiedByAWDelegation$$1314085842186_1__786390915__878797045___AW_JoinPoint.invoke(Unknown Source)
    at com.fi.depends.namespace.akka.Namespace$$ProxiedByAWDelegation$$1314085842186.updateOrCreateCell$default$3(Unknown Source)

我看到 'ScalaActorRef$class.$bang$bang' 的事实告诉我有些事情是非常错误的。

任何帮助,将不胜感激。

4

2 回答 2

0

如果您实际上将“updateOrCreateCell”的返回类型指定为 Unit,会发生什么?

于 2011-08-12T09:06:27.677 回答
0

Thread necro 处于最佳状态,但前几天我遇到了类似的异常,并认为它可能会在某个时候对某人有所帮助。:)

可能是你有一个覆盖的receive方法NamespaceImpl吗?因为我做到了(从 Actor 切换到 TypedActor),这把事情搞砸了,就像它对你所做的一样......

顺便说一句:如果您愿意,这就是您可以覆盖receive并仍然在其中执行操作的方式:

override def receive = {
  super.receive andThen {
    case message => {
      logger.debug("Received message: " + message)
    }
  }
}
于 2011-11-20T12:37:55.067 回答