当前位置: 首页 > 知识库问答 >
问题:

检查参与者的终止并避免向该参与者发送消息

子车鸿运
2023-03-14

我希望避免给终止的参与者发送死信消息,并避免向该参与者发送消息

class PingActor extends Actor with ActorLogging {
  import PingActor._

  var counter = 0
  var sendMessages = true
  val pongActor = context.actorOf(PongActor.props, "pongActor")
  context.watch(pongActor)

  def receive = {
    case Terminated(pong) =>
      sendMessages = false


    case Initialize =>
        println("In PingActor - starting ping-pong")
      pongActor ! PingMessage("ping")
    case PongActor.PongMessage(text) =>
      println("In PingActor - received message: {}", text)
      counter += 1
      if (counter == 10 ) context.system.shutdown()
      else {
        context.actorSelection(pongActor.path) ! PingMessage("ping")
      }
  } 
}
class PongActor extends Actor with ActorLogging {
  import PongActor._
  var counter = 0

  def receive = {
    case PingActor.PingMessage(text) => 
      println(s"In PongActor - received message: $text counter = $counter \n reply with pong message")

      if (counter < 5) {
        counter = counter + 1
      }
      else
        {
          println("Oh crap , bye bye ")
          context.stop(self)
        }
      sender() ! PongMessage("pong")

  }

actorSelection没有像我预期的那样工作,从ping发送的最后一条消息仍然以一纸空文告终:

[信息][09/16/2016 00:47:46.237][MyActorSystem-Akka.Actor.Default-Dispatcher-4][Akka://MyActorSystem/User/PingActor/PongActor]从参与者[Akka://MyActorSystem/User/PingActor#1697177867]到参与者[Akka://MyActorSystem/User/PingActor/PongActor#524615423]的消息[com.example.PingActor$PingMessage]未传递。[1]遇到的一纸空文。可以通过配置设置'Akka.log-dead-letters'和'Akka.log-dead-letters-dhider-shutdown'关闭或调整此日志记录。

共有1个答案

贺立果
2023-03-14

基于actors的异步特性,我认为您不能继续使用actorselection。我认为,一旦您收到terminated消息,您就可以确定该演员已经死亡。但是,当参与者死亡时,邮箱中等待处理的邮件可能仍然很少。您可以做的是让另一个参与者监听deadletter通道,如果该参与者收到了一条本来要发送给其他参与者的消息,则该参与者就会执行操作。

 类似资料:
  • 考虑下面的代码示例(版本1)。在这里,父角色(ActorA)向子角色(ActorB)发送消息,然后停止自我。由于父角色的自停止,在高负载下,子角色甚至在从邮箱提取邮件之前就会死亡,因此邮件变成了“死信”(参见下面的示例输出1)。 由于某些原因,我无法修改应用程序设计以删除父参与者的自停止。 版本1 样本输出1 现在考虑下面的代码修改(版本2)。通过将消息确认从子参与者引入到父参与者,然后在收到此确

  • 我想让我的主演员在第一个演员完成工作后立即终止所有的奴隶演员<然而,我不知道怎样才能从我的主人那里向所有的奴隶发送广播。这有函数或编程模式吗? 解决这个问题的另一种方法可能是给主人一个所有奴隶的列表,并循环通过它们,给每个奴隶发送一条终止消息,但是奴隶也需要主人作为属性,我认为这是一个问题: 此代码不编译。 错误消息: Actor线程Actor线程2 java中发生异常。lang.NullPoin

  • 我用的是Akka。NET来实现一个actor系统,其中一些actor是按需创建的,并在可配置的空闲时间后删除(我使用Akka的“ReceiveTimeout”机制)。这些参与者中的每一个都由一个密钥标识,并且不应该存在具有相同密钥的两个参与者。 这些参与者当前由一个普通主管创建和删除。可以要求主管返回与给定密钥匹配的参与者的引用,如果具有该密钥的参与者尚不存在,则可以返回现有的参与者,也可以创建新

  • 使用API,命令行或在Hyperledger Composer Playground中使用ID卡,可以向参与者发放新的身份。一旦发放了新的身份,参与者就可以使用该身份在参与者上下文中与业务网络进行交互。 使用Hyperledger Fabric时,Hyperledger Composer使用Hyperledger Fabric证书颁发机构(CA)来注册新的登记证书,从而发放新的身份。Hyperle

  • 例如,我有两个演员——一个家长演员和一个孩子演员。当父级收到消息时,它会产生消息中指定的尽可能多的子角色。如何测试此功能?有没有一种方法可以模拟上下文,或者其他一些方法来检查参与者的创建是否正确和数量是否正确? 更新:基于@Tim answer的解决方案 更改类别: 测试:

  • 参与者可以使用API或命令行添加到参与者库中。 在你开始之前 在你执行这些步骤之前,你在业务网络定义中必须建模一个参与者,并将其部署为业务网络。 下面的过程显示了一个使用以下数字财产范例业务网络定义的参与者模型的示例:digitalproperty-network 请注意:如果你使用composer participant add命令添加参与者,请确保参与者的JSON陈述包裹在单引号中。 name