是我愚蠢 - 我没有将索引器道具传递到系统创建中。我会在这里留下答案,以防有人从中受益*
我正在创建一个单身人士并发送这样的消息:
val indexerProps = ClusterSingletonManager.props(had => Props(
classOf[SingleCoreIndexer], dataProvider, publisher, name), name, End, None)
val coreIndexer = system.actorOf(indexerProps, name)
//val coreIndexer = system.actorOf(Props(classOf[SingleCoreIndexer], dataProvider, publisher, name))
coreIndexer ! "start_indexing"
Run Code Online (Sandbox Code Playgroud)
注释掉的行显示了工作正常的非单例道具
当我运行应用程序时,我收到以下错误:
[WARN] [06/21/2013 11:55:32.443] [deadcoreindexerstest-akka.actor.default-dispatcher-5] [akka://deadcoreindexerstest/user/node1] unhandled event start_indexing in state Start
Run Code Online (Sandbox Code Playgroud)
所有其他功能都停止工作,这与暗示“coreIndexer”actor 未收到“start_indexing”消息的消息相关
更多代码:
class Indexer(systemCreator: SystemCreator, publisherProps: Props, dataProviderProps: Props, name: String) {
def start {
val system = systemCreator.create
val dataProvider = system.actorOf(dataProviderProps)
val publisher = system.actorOf(publisherProps)
val indexerProps = ClusterSingletonManager.props(
singletonProps = had => Props(classOf[SingleCoreIndexer], dataProvider, publisher, name),
singletonName = "aaa",
terminationMessage = End,
role = None
)
val coreIndexer = system.actorOf(Props(classOf[SingleCoreIndexer], dataProvider, publisher, name))
coreIndexer ! "start_indexing"
}
}
class SingleCoreIndexer(dataProvider: ActorRef, publisher: ActorRef, name: String) extends Actor {
def receive = {
case "start_indexing" => {
println("Single core indexer starting indexing")
dataProvider ! new NextBatchOfDataPlease
}
case BatchOfData(data) => {
publisher ! (name, data)
self ! "next_batch"
}
case "next_batch" => {
dataProvider ! new NextBatchOfDataPlease
}
}
}
Run Code Online (Sandbox Code Playgroud)
看起来我正在向经理而不是单身人士发送消息。但是,当我向单身人士发送消息时,没有任何反应:
class Indexer(systemCreator: SystemCreator, publisherProps: Props, dataProviderProps: Props, name: String) {
def start {
val system = systemCreator.create
val dataProvider = system.actorOf(dataProviderProps)
val publisher = system.actorOf(publisherProps)
val indexerProps = ClusterSingletonManager.props(
singletonProps = had => Props(classOf[SingleCoreIndexer], dataProvider, publisher, name),
singletonName = "singlecoreindexer",
terminationMessage = End,
role = None
)
system.actorOf(Props(classOf[SingleCoreIndexer], dataProvider, publisher, name))
val coreIndexer = system.actorSelection(s"/user/$name/singlecoreindexer")
coreIndexer ! "start_indexing"
}
}
Run Code Online (Sandbox Code Playgroud)
您所看到的问题(我认为)源于您向 发送消息,而ClusterSingletonManager不是向坐在其下面的实际演员发送消息。尝试按姓名 ( ) 查找下面的演员actorFor,应该可以。