Это был я, будучи глупым - я не передавал реквизиты индексатора в создание системы. Я оставлю ответ здесь, в случае, если кто принимает какую-то пользу *Akka Singleton - непринятие сообщений
Я создаю одноплодный и отправляю сообщение, как это:
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
Все другой функциональности перестает работать, какой correla тес с сообщением подразумевающего «coreIndexer» актер не получает сообщение «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
}
}
}
Похоже, я отправлял сообщение менеджера, а не одиночки. Тем не менее, когда я отправлять сообщения синглтона, ничего не происходит:
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"
}
}
Вы можете поделиться код для 'SingleCoreIndexer'? Похоже, что это какая-то проблема, связанная с FSM. – cmbaxter
Забавно, вы пришли на свой ответ, пока я отправлял мой, что было тем же самым. – cmbaxter
Используйте 'ClusterSingletonProxy' для доступа к игроку за менеджером singleton. –