Akka 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

是我太愚蠢了——我没有把索引器道具传递到系统创建中。我会把答案留在这里,以防有人从中受益*

我正在创建一个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
所有其他功能都停止工作,这与暗示“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。