我有一个阿克卡演员(工人),接收请求并回复它。请求处理可能需要3到60分钟。来电者(也是演员)目前正在使用!并且等待future.get,然而,如果需要的话,呼叫者演员的设计可以改变。另外,我目前正在使用EventDriven调度程序。
如何取消(用户启动的)请求处理,从而释放工作参与者并返回到就绪状态以接收新请求?我希望找到一种类似于java.util.concurrent.Future的cancel方法,但在Akka 1.1.3中找不到。
编辑:
我们试图通过completeWithException获得我们正在寻找的行为:
object Cancel {
def main(args: Array[String]) {
val actor = Actor.actorOf[CancelActor].start
EventHandler.info(this, "Getting future")
val future = (actor ? "request").onComplete(x => EventHandler.info(this, "Completed!! " + x.get))
Thread.sleep(500L)
EventHandler.info(this, "Cancelling")
future.completeWithException(new Exception("cancel"))
EventHandler.info(this, "Future is " + future.get)
}
}
class CancelActor extends Actor {
def receive = {
case "request" =>
EventHandler.info(this, "start")
(1 to 5).foreach(x => {
EventHandler.info(this, "I am a long running process")
Thread.sleep(200L)
})
self reply "response"
EventHandler.info(this, "stop")
}
}但这并没有阻止长期运行的过程。
[INFO] [9/16/11 1:46 PM] [main] [Cancel$] Getting future
[INFO] [9/16/11 1:46 PM] [akka:event-driven:dispatcher:global-2] [CancelActor] start
[INFO] [9/16/11 1:46 PM] [akka:event-driven:dispatcher:global-2] [CancelActor] I am a long running process
[INFO] [9/16/11 1:46 PM] [akka:event-driven:dispatcher:global-2] [CancelActor] I am a long running process
[INFO] [9/16/11 1:46 PM] [akka:event-driven:dispatcher:global-2] [CancelActor] I am a long running process
[INFO] [9/16/11 1:46 PM] [main] [Cancel$] Cancelling
[ERROR] [9/16/11 1:46 PM] [akka:event-driven:dispatcher:global-7] [ActorCompletableFuture]
java.lang.Exception: cancel
at kozo.experimental.Cancel$.main(Cancel.scala:15)
...
[INFO] [9/16/11 1:46 PM] [akka:event-driven:dispatcher:global-2] [CancelActor] I am a long running process
[INFO] [9/16/11 1:46 PM] [akka:event-driven:dispatcher:global-2] [CancelActor] I am a long running process
[INFO] [9/16/11 1:46 PM] [akka:event-driven:dispatcher:global-2] [CancelActor] stop相反,请考虑java.util.concurrent.Future的行为:
object Cancel2 {
def main(args: Array[String]) {
val executor: ExecutorService = Executors.newSingleThreadExecutor()
EventHandler.info(this, "Getting future")
val future = executor.submit(new Runnable {
def run() {
EventHandler.info(this, "start")
(1 to 5).foreach(x => {
EventHandler.info(this, "I am a long running process")
Thread.sleep(200L)
})
}
})
Thread.sleep(500L)
EventHandler.info(this, "Cancelling")
future.cancel(true)
EventHandler.info(this, "Future is " + future.get)
}
}这确实会阻止长时间运行的进程。
[INFO] [9/16/11 1:48 PM] [main] [Cancel2$] Getting future
[INFO] [9/16/11 1:48 PM] [pool-1-thread-1] [anon$1] start
[INFO] [9/16/11 1:48 PM] [pool-1-thread-1] [anon$1] I am a long running process
[INFO] [9/16/11 1:48 PM] [pool-1-thread-1] [anon$1] I am a long running process
[INFO] [9/16/11 1:48 PM] [pool-1-thread-1] [anon$1] I am a long running process
Exception in thread "main" java.util.concurrent.CancellationException
...
[INFO] [9/16/11 1:48 PM] [main] [Cancel2$] Cancelling发布于 2011-09-17 12:55:49
你也可以检查“演员”中“未来”的状态。
class MyActor extends Actor {
def receive = {
case msg =>
while(!self.senderFuture.get.isCompleted) {
performWork(msg)
}
self reply result
}
...
}这需要用“?”发送消息。或者“问”。希望能帮上忙。
发布于 2011-09-15 09:53:26
如果您只是在-VM中,您只需传递一个带有作业消息的AtomicBoolean,并在您的参与者中间歇性地检查它,以查看是否应该中止。
actor ! Job(..., someAtomicBoolean)
class MyActor extends Actor {
def receive = {
case Job(..., cancelPlease) =>
while(cancelPlease.get == false) {
performWork
}
self reply result
}
}https://stackoverflow.com/questions/7420753
复制相似问题