首页 文章

监控系统用户对覆盆子pi与akka演员

提问于
浏览
0

我的网络上有一个覆盆子pi,上面附有一个LED灯条 . 我的目的是创建一个jar文件,它将位于pi上,监视系统事件,例如登录和平均负载,并根据这些输入驱动LED .

为了持续监控登录用户,我正在尝试使用akka actor . 使用提供的示例here,这是我到目前为止所获得的:

import com.pi4j.io.gpio.GpioFactory
import com.pi4j.io.gpio.RaspiPin

import sys.process._

import akka.actor.{Actor, Props, ActorSystem}
import scala.concurrent.duration._


val who :String = "who".!!

class Blinker extends Actor {

  private def gpio = GpioFactory.getInstance
  private def led = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_08)

  def receive = {
    case x if who.contains("pi") => led.blink(250)
    case x if who.contains("moocow") => println("falalalala")
  }

  val blinker = system.actorOf(Props(classOf[Blinker], this))

  val cancellable =  system.scheduler.schedule(
    0 milliseconds,
    50 milliseconds,
    blinker,
    who)
}

但是,我的IDE(IntelliJ)无法识别 system ,它说, cannot resolve symbol

我也有一个像这样的主要对象:

object ledStrip  {

  def main(args: Array[String]): Unit = {

    val blink = new Blinker
    // blink.receive

  }

}

main 中,我不太确定如何初始化应用程序 .

毋庸置疑,这是我第一次编写scala程序帮助?

Edit::

在结合Michal所说的内容之后,这是更新的程序

class Blinker extends Actor {

  val who: String = "who".!!

  private val gpio = GpioFactory.getInstance
  private val led = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_08)

  def receive = {
    case x if who.contains("pi") => led.blink(250)
    case x if who.contains("moocow") => println("falalalala")
  }

  val system = ActorSystem()


}



object ledStrip  extends  Blinker {

  def main(args: Array[String]): Unit = {

    val blinker = system.actorOf(Props(classOf[Blinker], this))
    import system.dispatcher

    val cancellable =
    system.scheduler.schedule(
      50 milliseconds,
      5000 milliseconds,
      blinker,
      who)

  }

}

此程序编译正常,但在执行时抛出以下错误:

线程“main”java.Slang.ExceptionInInitializerError在ledStrip.main(ledStrip.scala)中的异常引起:akka.actor.ActorInitializationException:您无法使用构造函数(new)显式创建[ledStrip $]实例 . 您必须使用'actorOf'工厂方法之一来创建新actor . 请参阅文档 . at akka.actor.ActorInitializationException $ .apply(Actor.scala:194)at akka.actor.Actor . $ init $(Actor.scala:472)at Blinker . (ledStrip.scala:15)at ledStrip $ . (ledStrip . scala:34)在ledStrip $ . (ledStrip.scala)...还有1个

Edit 2

编译和运行的代码(行为仍然不符合要求)< blink(1500) 永远不会执行用户: pi 从shell注销>

object sysUser {
  val who: String = "who".!!
}

class Blinker extends Actor {

  private val gpio = GpioFactory.getInstance
  private val led = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_08)

  def receive = {
    case x if x.toString.contains("pi")  => led.blink(50)
    case x if x.toString.contains("moocow")  => println("falalalala")
    case _ => led.blink(1500)
  }
}

object ledStrip  {
  def main(args: Array[String]): Unit = {
    val system = ActorSystem()

    val blinker = system.actorOf(Props[Blinker], "blinker")
    import system.dispatcher

    val cancellable =
      system.scheduler.schedule(
        50 milliseconds,
        5000 milliseconds,
        blinker,
        sysUser.who)
  }
}

2 回答

  • 1

    好吧,看起来你没有在任何地方定义"system" . 例如,请参见此示例:https://doc.akka.io/docs/akka/current/actors.html#here-is-another-example-that-you-can-edit-and-run-in-the-browser-

    你会在那里找到这条线:

    val system = ActorSystem("pingpong")
    

    这就是创建ActorSystem并定义名为“system”的val的原因,然后您可以调用方法 .

    在主要的,我不认为你想用“新的Blinker”创建另一个实例,只需使用:

    system.actorOf(Props[Blinker], "blinker")
    

    (你已经在做了,并把它放入“闪光灯”val)

  • 1

    似乎这只是一个akka使用问题 . 我不知道为什么你做的事似乎很奇怪,所以我改为 change1, change2, change3 ,FYI .

    class Blinker extends Actor {
      val who: String = "who".!!
    
      private val gpio = GpioFactory.getInstance
      private val led = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_08)
    
      def receive = {
        case x if who.contains("pi") => led.blink(250)
        case x if who.contains("moocow") => println("falalalala")
      }
    }
    
    object ledStrip { // change1
      def main(args: Array[String]): Unit = {
        val system = ActorSystem() // change2
    
        val blinker = system.actorOf(Props(classOf[Blinker])) // change3
        import system.dispatcher
    
        val cancellable =
        system.scheduler.schedule(
          50 milliseconds,
          5000 milliseconds,
          blinker,
          who)
      }
    }
    

相关问题