Как создать заводного актера, который сохраняет исполнение, пока не остановится
Я хочу создать актера, который продолжает выполнять задачу, затем его можно остановить внешним вызовом, чтобы остановить, но он был совершенно заблокирован.
Актер должен выглядеть следующим образом
myActor = actor {
loop {
react { message ->
if(message instanceof String && "stop".equals(message))
{
stop()
}
}
}
while(true)
{
// do some work
}
}
После создания актер может быть запущен через мой тестовый файл @BeforeMethod:
myActor.start()
И его дескриптор может быть сохранен основным потоком и остановлен с помощью команды ниже в моем тестовом файле, @AfterMethod:
myActor.send "stop"
Тем не менее, я не могу получить выше подход работает. Прежде всего, я считаю, что мне не нужно "myActor.start()", после @BeforeMethod он просто запускается автоматически;
Во-вторых, хотя я пытался вызвать "myActor.send "stop"в моем тестовом файле @AfterMethod, похоже, что цикл {} myActor никогда не посещается и продолжает работать с while{}.
Я также попытался поместить цикл {} в while{}, но он все еще не работает, а loop{} все еще не вызывается
Я что-то пропустил?
Спасибо!
1 ответ
Этот фрагмент кода должен показать вам, как структурировать код:
def myActor = Actors.actor {
loop {
react { message ->
if(message instanceof String && "stop".equals(message))
{
stop()
}
}
}
}
myActor.metaClass.afterStop = {
while(true)
{
// do some work
println "After finished"
return
}
}
myActor.send "stop"
sleep 5000
Несколько заметок:
- Размещение цикла while after () в том же теле действительно приводит к тому, что поток управления достигает цикла while до того, как цикл может даже запуститься.
- Вы можете рассмотреть возможность вызова stop() для актера напрямую, вместо отправки искусственного сообщения "stop". Обработчик afterStop будет по-прежнему вызываться.
- Актеры, запущенные с помощью фабричного метода actor(), запускаются автоматически.