Akka Singleton-不接受邮件
是我太愚蠢了——我没有把索引器道具传递到系统创建中。我会把答案留在这里,以防有人从中受益* 我正在创建一个singleton并发送如下消息:Akka Singleton-不接受邮件,akka,akka-cluster,Akka,Akka Cluster,是我太愚蠢了——我没有把索引器道具传递到系统创建中。我会把答案留在这里,以防有人从中受益* 我正在创建一个singleton并发送如下消息: val indexerProps = ClusterSingletonManager.props(had => Props( classOf[SingleCoreIndexer], dataProvider, publisher, name), name, End, None) val coreIndexe
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"
注释掉的行显示了工作正常的非单例道具
当我运行应用程序时,会出现以下错误:
[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
所有其他功能都停止工作,这与暗示“coreIndexer”参与者没有获得“start\u 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
}
}
}
看起来我是在给经理发信息,而不是给单身汉。但是,当我向singleton发送消息时,什么也没有发生:
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"
}
}
你看到的问题(我认为)源于你向
ClusterSingletonManager
发送了一条消息,而不是发送给坐在它下面的实际参与者。试着按姓名(actor或
)查找下面的参与者,它应该会起作用。我知道这个问题已经解决了,但即使有了这里提供的信息,我还是花了一段时间才弄清楚如何向单身汉发送消息,并决定留下我在这里找到的信息
文档中没有很好解释的两个关键概念是:
ClusterSingletonManager.props创建的参与者是实际实例的父级,并且
ClusterSingletonProxy
ClusterSingletonProxy
确保您正在与实际的代理对话,并且即使singleton暂时不可用或迁移到另一个节点,您也始终在与适当的实例对话
鉴于这些信息,代码应为:
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
)
val singletonManager = system.actorOf(
Props(classOf[SingleCoreIndexer],dataProvider, publisher, name)
)
val indexerPath = (singletonManager.path / name)
val coreIndexer = system.actorOf(
ClusterSingletonProxy.props(indexerPath, None),
s"$name-proxy"
)
coreIndexer ! "start_indexing"
}
}
您能否共享
SingleCoreIndexer
的代码?看起来这是某种与FSM相关的问题。有趣的是,在我提交我的答案时,你得到了你的答案,这是相同的结论。使用ClusterSingletonProxy
访问singleton manager后面的actor。