Akka Cluster-Sharding看起来很像用例,我必须在Akka节点上创建状态持久actor的单个实例。Akka cluster-sharding:Can Entry actor have dynamic props
我不清楚是否有可能有一个Entry actor类型需要参数来构造它。或者,也许我需要重新考虑入门演员如何获取这些信息。
Object Account {
def apply(region: String, accountId: String): Props = Props(new Account(region, accountId))
}
class Account(val region: String, val accountId: String) extends Actor with PersistentActor { ... }
而ClusterSharding.start
接受一个单一的Props实例来创建所有的Entry actor。
val counterRegion: ActorRef = ClusterSharding(system).start(
typeName = "Counter",
entryProps = Some(Props[Counter]),
idExtractor = idExtractor,
shardResolver = shardResolver)
然后它解决了基于你如何定义idExtractor接收消息的输入演员。从碎片可以看出它的源代码使用id作为名称对于给定的输入主角实例:
def getEntry(id: EntryId): ActorRef = {
val name = URLEncoder.encode(id, "utf-8")
context.child(name).getOrElse {
log.debug("Starting entry [{}] in shard [{}]", id, shardId)
val a = context.watch(context.actorOf(entryProps, name))
idByRef = idByRef.updated(a, id)
refById = refById.updated(id, a)
state = state.copy(state.entries + id)
a
}
}
看来我应该不是有我的入学演员弄不清它的区域和accountId按它的名字给出,尽管这会让我感觉有点不好意思,因为现在我会从字符串中解析出来,而不是直接获取值。这是我最好的选择吗?
感谢您的想法。作为我们仅暗示的问题的第一部分的直接答案,ClusterSharding没有内置的方式来支持动态道具。因此,将您的答案描述为与我的后续问题“这是我的最佳选择?”有关吗?我相信你的回答很好。 – Rich 2014-10-23 19:00:57
是的,我不确定是最好将它完全移除还是将它标记为非工作状态,这样也许有人会在akka上捡起它* wink wink *(或者至少人们会知道这不是一种选择,并且不会浪费时间尝试它)。另外,也许可以通过Guice获得一些东西,然后入侵InjectedProps,我在某处看到过类似的东西,但不幸的是我不记得细节。 – 2014-10-24 19:29:07