我理解如何在akka中创建基于消息的非阻塞应用程序,并且可以轻松地模拟执行并发操作的示例并将消息中的聚合结果传回.当我的应用程序必须响应HTTP请求时,我很难理解我的非阻塞选项是什么.目标是接收一个请求并立即将其移交给本地或远程演员进行工作,然后将其移交以获得可能需要一些时间的结果.不幸的是,在这个模型下,我不明白我是如何用非阻塞系列的"告诉"来表达这一点,而不是阻止"问".如果在链中的任何一点我使用了一个tell,我将来不再使用它作为最终的响应内容(http框架接口需要,在这种情况下是finagle - 但这并不重要).我理解请求是在它自己的线程上,我的例子非常人为,但只是想了解我的设计选项.
总而言之,如果我下面的设计示例可以重新设计以减少阻止,我非常希望了解如何.这是我第一次使用akka,因为一年前的一些轻度探索,以及我所看到的每篇文章,文档和谈话都表示不会阻止服务.
概念性答案可能会有所帮助,但也可能与我已经阅读过的内容相同.工作/编辑我的例子可能是我理解我试图解决的确切问题的关键.如果当前的例子通常是需要做的事情,确认也是有帮助的,所以我不会搜索不存在的魔法.
注意以下别名:import com.twitter.util.{Future => TwitterFuture,Await => TwitterAwait}
object Server {
val system = ActorSystem("Example-System")
implicit val timeout = Timeout(1 seconds)
implicit def scalaFuture2twitterFuture[T](scFuture: Future[T]): TwitterFuture[T] = {
val promise = TwitterPromise[T]
scFuture onComplete {
case Success(result) ? promise.setValue(result)
case Failure(failure) ? promise.setException(failure)
}
promise
}
val service = new Service[HttpRequest, HttpResponse] {
def apply(req: HttpRequest): TwitterFuture[HttpResponse] = req.getUri match {
case "/a/b/c" =>
val w1 = system.actorOf(Props(new Worker1))
val r = w1 ? "take work"
val …Run Code Online (Sandbox Code Playgroud) 我是Akka的新手,并制作了几个测试文件来练习Akka概念.以下测试似乎很简单,但无论出于何种原因,如果我从演员那里收到未来,我将无法获得未来的价值.我基于akka文档(http://akka.io/docs/akka/1.3-RC2/scala/futures.html#futures-scala)中的几个例子做了我所有的假设.例如:
这就像一个向导:
val f = Future{ 1 + 4 }
f onComplete
{
_.value.get.fold(
v => throw new Exception("My Exception"),
println(_)
)
}
Run Code Online (Sandbox Code Playgroud)
这不是:
class FutureDemo extends Actor
{
def receive =
{
case (a: Int, b: Int) =>
a + b
}
}
val fa1 = actorOf[FutureDemo].start()
val future = fa1 ? (1, 2)
future onComplete
{
_.value.get.fold(
v => throw new Exception("My Exception"),
println(_)
)
}
Run Code Online (Sandbox Code Playgroud)
我非常高兴地知道,由于期货的极端简单,我是唯一一个曾经遇到过这个问题的人(幸运的是我).有人会帮助让我看到暴力明显的问题吗?
我应该注意到,我曾尝试在另一个actor中处理,并使用简单的main方法.其中每一个都以同样令人敬畏的方式失败,其中不包括任何通知.如果用简单替换onComplete,println(future.get)我最终会得到一个超时异常(线程"main"中的异常akka.dispatch.FutureTimeoutException:Futures在[4996]毫秒后超时).我还应该注意到,我也试图尝试使用1.1和1.2版本的akka.
谢谢!