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