Akka Scheduler仅在MicroKernel中引发异常,但在Eclipse IDE for scala中可以正常工作 [英] Akka Scheduler throws exceptions only in MicroKernel but works fine in eclipse IDE for scala

查看:80
本文介绍了Akka Scheduler仅在MicroKernel中引发异常,但在Eclipse IDE for scala中可以正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个如下所示的调度程序。它的目的是每30分钟将消息发送给Actor系统中的另一个actor。当我在用于scala的eclipse IDE中运行该代码时,它运行良好。
但是,当我在MicroKernel中将此代码(与可引导程序一起使用,以便Microkernel可以调用它)时,出现异常,提示

I have a scheduler that looks like given below. It is meant to send a message every 30 minute to another actor in the Actor system. This code works fine when I run it in eclipse IDE for scala. However when I throw this code(with the bootable so that Microkernel can invoke it) in MicroKernel, I get an exception saying

java.lang.NoSuchMethodError: akka.actor.ActorSystem.dispatcher()Lscala / concurrent / ExecutionContext;
完整的堆栈跟踪如下所示。
我怀疑问题可能与在这种情况下无效的 import system.dispatcher行有关。或调度程序试图过早地发送消息。

java.lang.NoSuchMethodError: akka.actor.ActorSystem.dispatcher()Lscala/concurrent/ExecutionContext; The full stack trace is given below. I suspect the problem might be related to "import system.dispatcher" line that is not valid in this context. Or the Scheduler is trying to fire the message too soon.

请帮助...

scheduler.scala:

import akka.actor.Actor
import akka.actor.Props
import scala.concurrent.duration._
import akka.actor._
import java.sql.Timestamp;
import java.util.Date;

class Scheduler extends Actor with ActorLogging {
    import transactions._

    val system = ActorSystem("Daemon")
    import system.dispatcher
    log.info("Scheduler initializing.")
    system.scheduler.schedule( 30 milliseconds, (1000*60*30 ) milliseconds){ 
                self! updateUows(new Timestamp(new java.util.Date().getTime()))}

    def receive = {

    case updateUows(time) => { 
        log.info("updateuow to be sent.")
        context.parent!updateUows(time) 
    }
    }

}

完整堆栈跟踪:

    [DEBUG] [07/26/2013 15:38:23.324] [Daemon-akka.actor.default-dispatcher-4] [EventStream(akka://Daemon)] Default Loggers started
Uncaught error from thread [Daemon-akka.actor.default-dispatcher-4] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled for ActorSystem[Daemon[ERROR] [07/26/2013
15:38:23.960] [Daemon-akka.actor.default-dispatcher-4] [ActorSystem(Daemon)] Uncaught error from thread [Daemon-akka.actor.default-dispatcher-4] shutting down JVM since 'akka
.jvm-exit-on-fatal-error' is enabled
java.lang.NoSuchMethodError: akka.actor.ActorSystem.dispatcher()Lscala/concurrent/ExecutionContext;
        at org.exactearth.PVDaemon.Scheduler$$anonfun$receive$1.applyOrElse(Scheduler.scala:25)
        at akka.actor.ActorCell.receiveMessage(ActorCell.scala:425)
        at akka.actor.ActorCell.invoke(ActorCell.scala:386)
        at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:230)
        at akka.dispatch.Mailbox.run(Mailbox.scala:212)
        at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:506)
        at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
        at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
        at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
        at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
]

java.lang.NoSuchMethodError: akka.actor.ActorSystem.dispatcher()Lscala/concurrent/ExecutionContext;
        at org.exactearth.PVDaemon.Scheduler$$anonfun$receive$1.applyOrElse(Scheduler.scala:25)
        at akka.actor.ActorCell.receiveMessage(ActorCell.scala:425)
        at akka.actor.ActorCell.invoke(ActorCell.scala:386)
        at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:230)
        at akka.dispatch.Mailbox.run(Mailbox.scala:212)
        at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:506)
        at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
        at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
        at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
        at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

Shutting down Akka...
Shutting down .............(my program)


推荐答案

应该使用下面的代码使用ActorSystem创建Actors:

It should create Actors with ActorSystem like in the code below:

case object StartSched

class Test extends Actor with ActorLogging {
  def receive = {
    case StartSched =>
      context.system.scheduler.schedule( 30 milliseconds, (1000*60*30) milliseconds){
        self ! updateUows(new Timestamp(new java.util.Date().getTime()))
      }
  }
}

object Main {
  def main(args: Array[String]) {
    val sys = ActorSystem("Test")
    sys.actorOf(Props[Test])
  }
}

要在MicroKernel中启动它,您应该扩展 Bootable 特性和重载两种方法:启动关闭文档

To start it in MicroKernel you should extend Bootable trait and overload two methods: startup and shutdown. Docs

在Actor中创建ActorSystem 是一个非常糟糕的决定。

And creating ActorSystem inside an Actor is a very bad decision.

这篇关于Akka Scheduler仅在MicroKernel中引发异常,但在Eclipse IDE for scala中可以正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆