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

如何启动Scala akka actor

娄浩荡
2023-03-14

class下导致new HelloWorld行出现错误:

Exception in thread "main" akka.actor.ActorInitializationException: You cannot create an instance of [HelloWorld] explicitly using the constructor (new). You have to use one of the 'actorOf' factory methods to create a new actor. See the documentation.
  at akka.actor.ActorInitializationException$.apply(Actor.scala:219)
  at akka.actor.Actor$class.$init$(Actor.scala:436)
  at HelloWorld.<init>(HelloWorld.scala:4)
  at Driver$.main(HelloWorld.scala:38)
  at Driver.main(HelloWorld.scala)

所以我尝试:val hw=actorOf(new HelloWorld),但这会导致编译器错误:

not found: value actorOf

下面的HelloWorld应该如何实现?

阅读其他Scala文档时,要求在扩展Actor的类中定义act方法,然后在该类上调用start方法,是否有理由使用actorOf而不是定义act方法?

以下内容摘自Scala akka docs http://doc.akka.io/docs/akka/2.2.0/Scala.html:

import akka.actor.Actor
import akka.actor.Actor._
import akka.actor.Props

class HelloWorld extends Actor {

  override def preStart(): Unit = {
    // create the greeter actor
    val greeter = context.actorOf(Props[Greeter], "greeter")
    // tell it to perform the greeting
    greeter ! Greeter.Greet
  }
  def receive = {
    // when the greeter is done, stop this actor and with it the application
    case Greeter.Done => context.stop(self)
  }

  object Greeter {   

    case object Greet
    case object Done


  }
  class Greeter extends Actor {
    def receive = {
      case Greeter.Greet =>
        println("Hello World!")
        sender ! Greeter.Done
    }
  }


}

object Driver {

    def main(args: Array[String]) {
      new HelloWorld
    }

}

共有1个答案

燕玉堂
2023-03-14

你需要编辑你的主,如下所示。其次,在第5行中,您需要将其更改为context.actorof(Props(new Greeter))。这是因为您的Greeter没有定义apply函数,因此您需要自己手动创建Greeter对象。

工作代码如下:

import akka.actor.ActorSystem

class HelloWorld extends Actor {

  override def preStart(): Unit = {
    // create the greeter actor
    val greeter = context.actorOf(Props(new Greeter), "greeter")//line 5
    // tell it to perform the greeting
    greeter ! Greeter.Greet
  }
  def receive = {
    // when the greeter is done, stop this actor and with it the application
    case Greeter.Done => context.stop(self)
  }

  object Greeter {   

    case object Greet
    case object Done


  }
  class Greeter extends Actor {
    def receive = {
      case Greeter.Greet =>
        println("Hello World!")
        sender ! Greeter.Done
    }
  }


}

object Driver {

    def main(args: Array[String]) {
      val system = ActorSystem("Main")
      val ac = system.actorOf(Props[HelloWorld])
    }

}
 类似资料:
  • 初始化Yearning 启动juno(可以通过-p 指定端口 默认端口为50001) 填写conf.toml内GrpcAddr参数(默认127.0.0.1:50001) 进行调试 注意 juno与Yearning 必须共用同一个数据库且共用同一份配置文件(如juno与Yearning不在同一台主机,则需拷贝一份cofnig.toml文件与juno放在同级目录。且Yearning项目内的config

  • 我已经通过包管理器安装了QGIS,我可以通过终端运行。如何启动QGIS? 在我的Ubuntu中,我转到nautilus并得到一个QGIS桌面图标,单击该图标后,将启动应用程序的gui。在Debian GNU/Linux8(jessie)中如何做到这一点? 下面是软件包管理器的视图:

  • 大家好,我正在windows 7中使用xampp v3.2.1。我想在windows启动时自动启动它,但无法启动。 我尝试了这里提供的解决方案,但在服务中找不到任何东西。 我在D驱动器中安装了xampp,这就是为什么apache和mysql在从run打开services.msc时不显示在服务中的原因。 我已经从xampp控制面板的config(配置)按钮尝试过了,我选中了autostart(自动启

  • 本文向大家介绍Spring Boot 启动端口如何启动,包括了Spring Boot 启动端口如何启动的使用技巧和注意事项,需要的朋友参考一下 Spring Boot 启动端口 Spring Boot 其默认是集成web容器的,启动方式由像普通Java程序一样,main函数入口启动。其内置Tomcat容器或Jetty容器,具体由配置来决定(默认Tomcat)。当然你也可以将项目打包成war包,放到

  • 问题内容: 目前,我必须去然后做: 如何使它在启动时自动启动? 我在共享Linux服务器上。 问题答案: 如果您具有计算机的超级用户访问权限,则可以根据系统的初始化流程(初始化脚本,systemd等)采用多种方法来执行此操作。 但是,如果您没有root用户,则可以采用一种干净且一致的方式在重新启动时执行程序。 首先,找出Java在您的计算机上的位置。下面的命令将告诉您它在哪里: 然后,将以下代码粘

  • 我正在使用XAMPP,3.2.1版。我刚刚在Windows上安装了它 有没有办法让它在Windows中自动启动

  • 我正在开发一个运行在PC上的Java测试控制器应用程序。它有: 在android手机上安装应用程序: 怎么做有什么想法吗?

  • 问题内容: 我刚刚开始与Jenkins一起工作,遇到了一个问题。在安装了几个插件之后,它表示需要重新启动并进入“关闭”模式,但是从不重新启动。 如何手动重启? 问题答案: 要手动重新启动Jenkins,可以使用以下任一命令(通过在浏览器中输入其URL): -允许所有正在运行的作业完成。重新启动完成后,新作业将保留在队列中以运行。 -强制重启,而无需等待构建完成。