我的网络上有一个覆盆子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 回答
好吧,看起来你没有在任何地方定义"system" . 例如,请参见此示例:https://doc.akka.io/docs/akka/current/actors.html#here-is-another-example-that-you-can-edit-and-run-in-the-browser-
你会在那里找到这条线:
这就是创建ActorSystem并定义名为“system”的val的原因,然后您可以调用方法 .
在主要的,我不认为你想用“新的Blinker”创建另一个实例,只需使用:
(你已经在做了,并把它放入“闪光灯”val)
似乎这只是一个akka使用问题 . 我不知道为什么你做的事似乎很奇怪,所以我改为
change1, change2, change3
,FYI .