如何创建一个groovy actor,除非停止,否则继续执行

时间:2014-07-29 14:56:44

标签: java groovy gpars

我想创建一个继续执行任务的Actor,然后可以通过外部调用来停止,但是被阻止了。

演员应该看下面的

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之后,它只是自动运行;

其次,虽然我试图在我的测试文件的@AfterMethod中调用“myActor.send”,但看起来myActor的循环{}似乎永远不会被访问并继续使用while {}。

我还尝试将循环{}放入while {},但它仍然不起作用且循环{}仍未被调用

我错过了什么吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

此代码段应显示如何构建代码:

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循环()放在同一个主体中的确会产生控制流在循环开始之前到达while循环的效果。
  2. 你可能会考虑直接在演员身上调用stop()而不是发送一个人为的"停止"信息。仍然会调用afterStop处理程序。
  3. 通过actor()工厂方法启动的Actor自动启动。