我有一个基于socko websockets的现有akka应用程序。与套接字的通信发生在单个参与者内,消息的出入消息(分别为传入消息和传出消息)都标有套接字ID,这是socko websocket的一流属性(在socko中,连接请求到达)带有id标记,并且所有生命周期过渡(例如握手,断开连接,传入的帧等)都被类似地标记)
我想使用akka-http重新实现这个单一的参与者(由于明显的原因,socko如今或多或少都被抛弃了),但这并不简单,因为这两个库在概念上有很大的不同。 akka-http隐藏了握手,断开连接等的较低级别的详细信息,只需将绑定到http服务器的任何参与者发送一个UpgradeToWebsocket请求标头即可。标头对象包含一个方法,该方法将物化流程作为与客户端交换的所有消息的处理程序。
到目前为止,一切都很好;我能够在网络套接字上接收消息并直接回复它们。官方示例都假设某种无状态的请求-答复模型,因此我在理解如何下一步为物化流分配标签,管理其生命周期和连接状态方面很费力(我需要通知其他参与者客户端断开连接并标记消息时显示应用程序。)
替代方案(使用akka-streams重塑整个应用程序)的工作量太大,因此,任何有关如何跟踪套接字的建议都将不胜感激。
最佳答案
要与现有的基于actor的系统接口,您应该查看 Source.actorRef
和 Sink.actorRef
。 Source.actorRef
创建一个ActorRef,您可以将消息发送到该ActorRef,Sink.actorRef
允许您使用actor处理传入的消息并检测websocket的关闭。
要将Source.actorRef
创建的actor连接到现有的长寿命actor,请使用 Flow#mapMaterializedValue
。这也是为套接字连接分配唯一ID的好地方。
这个answer to a related question可能会让您入门。
要注意的一件事。当使用websocket close message关闭客户端到服务器流时,当前的websocket实现不会关闭服务器到客户端流。有一个issue可以实现此功能,但是在实现之前,您必须自己执行此操作。例如,通过在协议栈中添加something like this。