gpt4 book ai didi

java - Akka 和 Play,与非 Controller 库集成

转载 作者:行者123 更新时间:2023-12-02 04:15:29 25 4
gpt4 key购买 nike

我很难理解 Akka 与 Play 框架的集成。我想将 Akka Actor 集成到我自己创建的非 Controller 库类中,但文档仅提供了 Controller 返回结果的示例(播放 2.3)。我还没有编写任何代码,因为我对如何继续前进感到非常烦恼。有人有关于在 Controller 之外正确使用 Akka 的示例吗?我找到了这个例子(Java 8):

import play.libs.F.Promise;
import play.mvc.*;

import static play.libs.F.Promise.promise;

public class Application extends Controller {
public static Promise<Result> index() {
return promise(() -> longComputation())
.map((Integer i) -> ok("Got " + i));
}
}

但是看起来和Akka一点关系都没有。我很困惑,我什至不确定我是否正确地问了这个问题,对于没有代码示例,我深表歉意。

我的假设是这样的:将上述代码示例放入我的库类中并按指定使用它,将“longRunningComputation()”视为任何其他方法调用,然后将其保留。我当时担心的是我并没有真正利用 Akka 提供的功能。

有人会推荐一个 Akka 教程来帮助这里吗?

最佳答案

总体

请记住,Akka(实际上)与 Play 没有任何关系或限制。有数以千计的系统构建在 Akka 之上,与 Play 无关。 Akka 和 Play 配合得很好。

<小时/>

Akka +播放

在应用程序的非 Controller 部分使用 Akka Actor 是完全可以的。您只需要一种将 Controller 连接到 Actor 系统的方法。这意味着您需要找到一种与 Actor 系统中的 Actor 交谈的方法。在 Akka 中(通常)有两种方法可以做到这一点。您要么向 Actor 说(发送)一些东西,要么问他一些东西。

告诉

说/发送(也称为告诉或即发即忘)是在Java中通过 actor.tell(message, getSelf()) 完成的在 Scala 中为 actor ! message

import akka.actor.*;
import play.mvc.*;
import play.libs.Akka;
import play.libs.F.Promise;

import static akka.pattern.Patterns.ask;

public class Application extends Controller {

public static Result index() {
// select some actor from your system
ActorSelection actor = Akka.system().actorSelection("user/my-actor");

// now tell the actor something and do something else because we don't get a reply
actor.tell("Something");
return ok("Hello");
}
}

当然,您决不限于只能通过 Controller 的方法联系 Actor 。

整个消息传递过程当然可能非常复杂 - 这完全取决于您的业务逻辑。上面的 actor my-actor 现在将接收消息并在此时执行许多操作 - 转发消息、生成子级、杀死自身、进行计算等。

在 Java 中,你将有一个像这样的角色:

import akka.actor.UntypedActor;
import akka.event.Logging;
import akka.event.LoggingAdapter;

public class MyUntypedActor extends UntypedActor {
LoggingAdapter log = Logging.getLogger(getContext().system(), this);

public void onReceive(Object message) throws Exception {
if (message instanceof String) {
log.info("Received String message: {}", message);
// do whatever you want with this String message
} else
unhandled(message);
}
}
<小时/>

询问

询问是通过......惊喜......询问模式完成的 - 在 Scala 中使用 actor ? message .

您已经找到了如何在 Java 中执行此操作的示例。请记住,这次你会得到一些返回。这就是所谓的Future 。一旦这个 future 完成(成功),你就会得到你的结果。然后你就可以map这个结果到其他一些结果。现在看看为什么map()有电话吗?

import akka.actor.*;
import play.mvc.*;
import play.libs.Akka;
import play.libs.F.Promise;

import static akka.pattern.Patterns.ask;

public class Application extends Controller {

public static Promise<Result> index() {
// select some actor from your system
ActorSelection actor = Akka.system().actorSelection("user/my-actor");

// now ask the actor something and do something with the reply
return Promise.wrap(ask(actor, "how are you?", 1000))
.map(response -> ok(response.toString()));
}
}
<小时/>

个人经验的一些笔记:

  • Akka 文档是您的 friend
  • 查看 WebSocket 连接用例 - 自己构建一个演示 Play 应用程序,在其中支持 WebSocket 并且每个连接都由参与者处理。现在考虑一个聊天应用程序 - 一旦我在 WebSocket 上发送一些内容,我希望该应用程序的每个其他用户都能收到它 - 现在这对于“hello-world-Akka actor”来说是一个很好的情况,不是吗

关于java - Akka 和 Play,与非 Controller 库集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33369732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com