как очистить мой мертвый актер в Scala

Привет Я использую scala (2.8.1) для реализации трудоемкого обработчика задач с использованием актора, однако я не могу очистить его при запуске своих модульных тестов, поэтому мои модульные тесты зависали навсегда.

как я вызываю метод:

  val configs = new ProjectsConfig("XXXXXXXXXXXXX")
  try {
    configs.start
    configs.init//time consuming stuff
  } finally {
    configs.destory
    configs.stop
  }

Я планирую сохранить ссылку на акторов и выполнить выход из вызова при каждом включении, фрагмент кода выглядит следующим образом:

  • init, инициализируйте акторов и сохраняйте ссылку на каждого актера.
  • ] destory, вызовите exit для каждого актера.
  • остановите, вызовите exit для этого субъекта.

однако, похоже, это не работает. как очистить всех актеров в этом случае?

class ProjectsConfig(val url: String) extends Actor {
  private var actors: List[Actor] = List()
  private object Stop

  def init = {
    val caller = this;
    for (projectConfig <- list) {
      val myActor: Actor = actor {
        caller ! projectConfig.instantiate
      }
      actors = actors ::: List(myActor)
    }
  }

  def act() {
    while (true) {
      receive {
        case project: Project =>
          Projects.update(project)
        case Stop => exit()
      }
    }
  }

  def destory {
    for (actor <- actors) {
      try {
        actor ! exit
      } catch {
        case e => System.out.println(e.printStackTrace)
      }
    }
  }

  def stop() {
    this ! Stop
  }
5
задан user192048 30 April 2011 в 02:01
поделиться