2013-07-26 1 views
2

다음과 같은 스케줄러가 있습니다. 이것은 30 분마다 Actor 시스템에서 다른 액터에게 메시지를 보내는 것을 의미합니다. 이 코드는 Eclipse IDE에서 scala 용으로 실행할 때 잘 작동합니다. akka.actor.ActorSystem.dispatcher() Lscala/동시/ExecutionContext에 : 나는 마이크로 커널에서 (마이크로 커널이 그것을 호출 할 수 있도록 부팅과 함께)이 코드를 던질 때 는 그러나, 나는Akka Scheduler는 MicroKernel에서만 예외를 throw하지만 scala에 대해서는 Eclipse IDE에서 정상적으로 작동합니다.

java.lang.NoSuchMethodError 말하는 예외가 ; 전체 스택 추적이 아래에 나와 있습니다. 이 컨텍스트에서 유효하지 않은 "import system.dispatcher"행과 관련된 문제 일 수 있습니다. 또는 스케줄러가 너무 빨리 메시지를 시작하려고합니다.

도와주세요 ...

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) 
+0

이클립스에서 잘 작동한다는 것은 무엇을 의미합니까? 그리고 커널은 어디 있습니까? – 4lex1v

+0

IDE와 마이크로 커널에서 실행되는 클래스 경로가 같습니까? 어쩌면 귀하의 마이크로 커널 응용 프로그램이 어쩌면 다른 버전의 akka를 집어 들고있는 것처럼 보입니다. – cmbaxter

+1

실제로 Akka 2.2 (두 개는 바이너리 호환되지 않음)로 컴파일하면서 Akka 2.1 마이크로 커널을 사용하여 실행하려고했습니다. –

답변

1

그것은 아래의 코드처럼 ActorSystem와 배우를 만들어야합니다 :

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에서 시작하려면 특성을 확장하고 두 가지 방법, 즉 startupshutdown을 확장해야합니다. Docs

액자 안에 ActorSystem을 만드는 것은 매우 나쁜 결정입니다.

+0

line을 가져 오지 않고 system.dispatcher를 가져 오면 context.system.scheduler.schedule 줄에 컴파일 타임 오류가 발생합니다. – Manas

+0

답장을 보내 주셔서 대단히 감사합니다. "import system.dispatcher"행을 가지고있는 상황에서 context.system.scheduler.schedule 줄은 컴파일 타임 오류를 발생시킵니다. 오류는 암시 적 ExecutionContext를 찾을 수 없습니다.Eclipse에서 실행되는 동안 앱을 확장하는 객체로 앱을 실행한다는 점을 잊어 버렸습니다. 내 것은 일식으로 실행되도록 변환하는 maven 빌드입니다. 나는 당신이 제안한 것과 비슷한 스케쥴러에 대한 http://doc.akka.io/docs/akka/snapshot/scala/scheduler.html 링크를 따라 갔다. 나는 ActorSystem (" 악마")? 스칼라 초보자 : – Manas

+0

'액터 안에 ActorSystem을 만드는 것은 매우 나쁜 결정입니다. '- 왜? –

1

문제점은 내 코드가 ActorSystem을 만들려고한다는 것입니다.

및 import system.dispatcher가 코드가 실패한 이유입니다.

대신에 line import scala.concurrent.ExecutionContext.Implicits.global은 사용할 기본 executionContext를 제공합니다.

내게 올바른 방향으로 안내해 주신 Alex에게 감사드립니다.

case object StartSched 

class Scheduler extends Actor with ActorLogging { 
    import transactions._ 
    log.info("Scheduler initializing.") 
    self!StartSched 
    def receive = { 
    case StartSched =>{ 
    import scala.concurrent.ExecutionContext.Implicits.global 
    context.system.scheduler.schedule(30 milliseconds, (1000*60*30) milliseconds){ 
     self ! updateUows(new Timestamp(new java.util.Date().getTime())) 
     } 
    } 
    case updateUows(time) => { 
     log.info("updateuow to be sent.") 
     context.parent!updateUows(time) 
    } 
    case _=>{log.info("Don't know why we reached here.")} 

} 
} 
1

의견의 롤랜드 답변이 정확한 것입니다. 스칼라의 java.lang.NoSuchMethodError는 일반적으로 바이너리 호환되지 않는 라이브러리를 사용한다는 것을 의미합니다.

IDE 프로젝트와 Microkernel 응용 프로그램에서 서로 다른 주요 Scala 버전을 사용하거나 다른 주요 Akka 버전을 사용합니다.

관련 문제