Как создать заводного актера, который сохраняет исполнение, пока не остановится

Я хочу создать актера, который продолжает выполнять задачу, затем его можно остановить внешним вызовом, чтобы остановить, но он был совершенно заблокирован.

Актер должен выглядеть следующим образом

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

Несколько заметок:

  1. Размещение цикла while after () в том же теле действительно приводит к тому, что поток управления достигает цикла while до того, как цикл может даже запуститься.
  2. Вы можете рассмотреть возможность вызова stop() для актера напрямую, вместо отправки искусственного сообщения "stop". Обработчик afterStop будет по-прежнему вызываться.
  3. Актеры, запущенные с помощью фабричного метода actor(), запускаются автоматически.
Другие вопросы по тегам