Я порождаю небольшое количество актеров для извлечения, обработки и сохранения элементов RSS-ленты в базе данных.Это делается с помощью основного метода объекта, работающего на cron.Я создаю этих актеров и раздаю им задания по мере того, как они выполняют предыдущую работу, назначенную им.Мой основной класс порождает одного актера, который распределяет работу среди группы актеров.В конце концов основной метод, кажется, зависает.Это не выходит, но выполнение останавливается на всех актерах.Мой технический директор считает, что главное - выйти, прежде чем актеры завершат свою работу и покинут их, но я не уверен, что это так.Я не получаю успешный выход на мейн (вообще нет выхода).
По сути, мне интересно, как отлаживать этих актеров, и какая возможная причина могла бы вызвать это.Будет ли основной выход до того, как актеры завершат свое выполнение (и если это так, имеет ли это значение?) Из того, что я могу сказать, актеры, использующие получение, отображаются 1-в-1 в потоки, правильно?Код ниже.Пожалуйста, задавайте любые дополнительные вопросы, помощь очень ценится.Я знаю, что, возможно, не предоставил достаточно подробностей, я новичок в scala и актерах и буду обновлять по мере необходимости.
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
}
}
}
}