Тайм-аут метода Akka для TypedActor, но он должен быть асинхронным - PullRequest
2 голосов
/ 10 августа 2011

Я пытаюсь использовать 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:

<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', говорит мне, что что-то не так.

Буду признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2011

Thread necro в лучшем виде, но на днях я столкнулся с аналогичным исключением и подумал, что в какой-то момент это может кому-нибудь помочь.:)

Может быть, у вас есть переопределенный метод receive в NamespaceImpl?Потому что я это сделал (переключился с Actor на TypedActor), и это все испортило точно так же, как для вас ...

Кстати: так вы можете переопределить receive и все равно делать что-то в этом, если хотите:

override def receive = {
  super.receive andThen {
    case message => {
      logger.debug("Received message: " + message)
    }
  }
}
0 голосов
/ 12 августа 2011

Что произойдет, если вы на самом деле укажете тип возвращаемого значения для updateOrCreateCell, равный Unit?

...