2013-02-21 1 views
2

문서에서 잘못 생각한 것 같습니다.GPars : 배우가 완료되기를 기다리는 중

저는 XMLActor와 HttpActor의 두 액터가 있습니다. XMLActor는 xmlFiles를 읽고 HTTPActor에 메시지를 보내 처리합니다. XMLActor는 HttpActor보다 빨리 끝날 것입니다.

내 주 클래스 호출은 두 액터 모두에 참여합니다. 두 주체가 끝난 후 주 스레드 만 종료 될 것으로 예상했습니다. 그러나 실제로 일어나고있는 일은 모든 메시지가 XMLActor에 의해 처리되는 즉시 시스템이 종료되고 많은 메시지가 HttpActor에 의해 처리되지 않는다는 것입니다.

일부 래치 또는 AtomicInteger를 사용하여 모든 메시지가 소비 될 때까지 기다릴 수는 있지만 좀 더 우아한 방법이 있는지 궁금합니다.

final HttpActor httpActor = new HttpActor().start() 
final XMLActor xmlActor = new XMLActor(httpActor:httpActor).start() 
Actors.actor { 
     file.eachLine { line -> 
      def chunks = line.split(",") 
      def id = chunks[0].replaceAll("\\\"","").trim() 
      def name = chunks[1].replaceAll("\\\"","").trim() 
      xmlActor << new FileToRead(basePath:args[1],id:id,name:name, fileCounter:counter) 
     } 
    } 
[httpActor, xmlActor]*.join() 

//inside xmlActor 
countries.each { country -> 
      httpActor << new AlbumPriceMessage(id:message.id, country:country) 
     } 

답변

3

join() 메소드는 두 배우가 모두 끝날 때까지 기다릴 것입니다. 나는 두 배우를 어떻게 멈추게 할 지 모르겠다. 그래서 그것에 대해 정말로 논평 할 수는 없다. 독약 같은 종류의 메시지를 보냅니 까? 또는 배우에게 stop()을 호출합니까?

예를 들어, 귀하의 경우 다음과 같은 시뮬레이션은 제대로 중지 : 무슨 일이 일어 났는지

import groovyx.gpars.actor.*; 

def httpActor = Actors.staticMessageHandler { 
    println "Http actor processing " + it 
} 

def xmlActor = Actors.staticMessageHandler { 
    println "XML Actor processing " + it 
    httpActor << it 
} 

xmlActor.metaClass.afterStop = { 
    httpActor.stop() 
} 

100.times { 
    xmlActor << "File$it" 
} 
xmlActor.stop() 

[xmlActor, httpActor]*.join() 
println "done" 
+0

당신은 맞다는 자동으로 프로세스를 죽이는 HTTPActor에서 예외였다. 스크립트가 백그라운드에서 실행 중이고/dev/null에 출력을 보내고있는 동안 그걸 알아내는 동안 시간이 좀 걸렸습니다. D –

+0

한 가지 질문은 중지를 호출해야합니까? 나는 또 다른 이슈 (OOM 오류)를 만났는데, 이것이 내가 배우들을 멈추지 않았다는 사실 때문인지 궁금하다. 그리고 나는 수십만 명의 액티브 배우들과 함께 추억 속에 남았다. –