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 を使用してアクターを作成します。

<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

スレッドネクロは最高ですが、先日同様の例外に遭遇し、いつか誰かを助けるかもしれないと考えました. :)

にオーバーライドされたreceiveメソッドがある可能性がありますNamespaceImplか? 私が(ActorからTypedActorに切り替えた)原因は、あなたとまったく同じように物事を台無しにしてしまった...

ところで:これは、必要に応じてオーバーライドreceiveして、それでも何かを行う方法です:

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