2

ドキュメントからこれを間違えたと思います。

XMLActor と HttpActor の 2 つのアクターがあります。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)
        }
4

1 に答える 1

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"
于 2013-02-22T04:55:42.817 に答える