RSSフィード項目を取得し、処理してデータベースに保存する少数の俳優を産んでいます。これは、cronで実行されているオブジェクトの主な方法によって行われます。私はこれらの俳優を作成し、彼らに割り当てられた前の仕事を完了すると、彼らに仕事を出します。私のメインクラスは、ひとりの俳優、つまり俳優のプールに仕事を奪い取る俳優を生み出します。結局のところ、メインの方法はハングアップしているようです。終了しませんが、すべてのアクタで実行が停止します。私のCTOは、俳優が仕事を終えて去る前にメインが終了していると信じていますが、そうは確信していません。私はメインで成功出口を受け取っていない(全く出口がない)。スカラの俳優がぶら下がった
私はこれらのアクターをどのようにデバッグするのか、と考えられています。アクターが実行を完了する前にメインの出口が出るのですか?そうであれば、それは関係ありますか?私が受け取ったアクターがスレッドに1対1でマッピングされていることを教えてください。コードは以下のとおりです。フォローアップの質問をしてください、助けていただければ幸いです。私は十分な詳細を提供していない可能性があることを知っています、私はスカラーと俳優には新しく、必要に応じて更新します。あなたはすべてのスピナーの俳優が「終了」したか否かを判断するために、左を折るしているときに、小さなしかし重要な間違いを作っている一つのことについては
object ActorTester {
val poolSize = 10
var pendingQueue :Set[RssFeed] = RssFeed.pendingQueue
def main(args :Array[String]) {
val manager = new SpinnerManager(poolSize, pendingQueue)
manager.start
}
}
case object Stop
class SpinnerManager(poolSize :Int = 1, var pendingQueue :Set[RssFeed]) extends Actor {
val pool = new Array[Spinner](poolSize)
override def start() :Actor = {
for (i <- 0 to (poolSize - 1)) {
val spinner = new Spinner(i)
spinner.start()
pool(i) = spinner
}
super.start
}
def act() {
for {
s <- pool
if (!pendingQueue.isEmpty)
} {
s ! pendingQueue.head
pendingQueue = pendingQueue.tail
}
while(true) {
receive {
case id :Int => {
if (!pendingQueue.isEmpty) {
pool(id) ! pendingQueue.head
pendingQueue = pendingQueue.tail
} else if ((true /: pool) { (done, s) => {
if (s.getState != Actor.State.Runnable) {
val exited = future {
s ! Stop
done && true
}
exited()
} else {
done && false
}
}}) {
exit
}
}
}
}
}
}
class Spinner(id :Int) extends Actor {
def act() {
while(true) {
receive {
case dbFeed :RssFeed => {
//process rss feed
//this has multiple network requests, to the original blogs, bing image api
//our instance of solr - some of these spawn their own actors
sender ! id
}
case Stop => exit
}
}
}
}
もちろん更新されました。もう一度テストします。ありがとう。 – Kareem
まだぶら下がっています。しかし、ありがとう。 – Kareem
編集を確認してください。 – fotNelton