播放框架用java中的actor处理websockets

Posted

技术标签:

【中文标题】播放框架用java中的actor处理websockets【英文标题】:Play framework Handling websockets with actors in java 【发布时间】:2018-07-27 19:55:10 【问题描述】:

我正在尝试用 java 中的演员实现 websocket。我们接受websocket连接并创建一个ActorFlow.actorRef来处理websockets的地方,有没有什么方法可以将参数传递给websocket actor?我从这里的文档中关注这个例子.. https://www.playframework.com/documentation/2.6.x/JavaWebSockets#handling-websockets-with-actors

public WebSocket socket()  
    return WebSocket.Text.accept(request -> 
        ActorFlow.actorRef(MyWebSocketActor::props, actorSystem, 
        materializer));

有没有办法将参数传递给 MyWebSocketActor?

【问题讨论】:

【参考方案1】:

除了按照@Igmar 的建议实现 Props 功能,

来自其他论坛的人在下面提出了建议,效果很好。

MyWebSocketActor::props 是 (actorRef) -> MyWebSocketActor.props(actorRef) 的简写 所以称它为 (actorRef) -> MyWebSocketActor.props(actorRef, otherStuff)

【讨论】:

这是从 Play 2.4 迁移到 2.6 的救命稻草。 这确实是我迁移项目所需的最重要的一行。请注意,通常用于将事物组合在一起的 ActorFlow 类在 Play 2.5 for Java 中被破坏了。但是,您可以从 Play 2.6 中获取 ActorFlow.actorRef() 并将该代码复制到您想要的任何位置并使用它。由于我们的迁移是从 Play 2.5 及其 LegacyWebSockets 开始的,所以我需要这个额外的步骤。【参考方案2】:

一般来说,向actor传递参数如下:

final Props props = Props.create(SomeActorClass.class, arg1, arg2, ...);

您需要在正确的位置创建道具。参数被传递给actor类的构造函数。

【讨论】:

是的,我像这样编写了 Props.create,但我在从 ActorFlow.actorRef 传递它时遇到了麻烦。我试着把它叫做“ActorFlow.actorRef(MyWebSocketActor::props(otherStuff), actorSystem, materializer));)” 但它没有用。来自其他论坛的一个人建议 MyWebSocketActor::props 是 (actorRef) -> MyWebSocketActor.props(actorRef) 的简写,所以将其称为 (actorRef) -> MyWebSocketActor.props(actorRef, otherStuff) 这很好用。

以上是关于播放框架用java中的actor处理websockets的主要内容,如果未能解决你的问题,请参考以下文章

一 Akka学习 - actor

Akka框架使用注意点

Actor事件处理框架介绍

在 Java 中播放框架异步处理和阻塞 I/O

Akka Java 文档 -- 容错

C++ Actor并发模型框架 Actor Framework (CAF)