WebSockets客户端未从Akka streams ActorSource接收数据

WebSockets客户端未从Akka streams ActorSource接收数据,websocket,akka-stream,Websocket,Akka Stream,我正在尝试使用Akka和WebSockets实现服务器推送,并编写了以下程序: 我曾尝试使用handleMessagesWithSinkSource,使用ActorSource作为源,并使用忽略的接收器;我的问题是,没有发送给底层参与者的消息被推送到web套接字输出流中,web套接字客户端也没有收到任何消息。我遗漏了什么,使它能按预期工作;GET/send-42应该将带有42的文本消息推送到输出通道,并由WS-client接收 一个简单的方法是由发布者创建actorRef和source。 根据

我正在尝试使用Akka和WebSockets实现服务器推送,并编写了以下程序:

我曾尝试使用handleMessagesWithSinkSource,使用ActorSource作为源,并使用忽略的接收器;我的问题是,没有发送给底层参与者的消息被推送到web套接字输出流中,web套接字客户端也没有收到任何消息。我遗漏了什么,使它能按预期工作;GET/send-42应该将带有42的文本消息推送到输出通道,并由WS-client接收


一个简单的方法是由发布者创建actorRef和source。 根据你的代码,我更新了一些代码。那就行了

//val actorRef: ActorRef[Protocol] = actorSource
//.to(Sink.foreach(println))
//.run()


val (actorRef, publisher) =
    Source.actorRef[Protocol](16, OverflowStrategy.fail)
        .map(msg => TextMessage.Strict(msg.toString))
        .toMat(Sink.asPublisher(false))(Keep.both).run()


每次具体化
源代码时,您都会得到一个新的参与者。它一次又一次地具体化。换句话说:您最终发送到的
actorRef
不会重新用于您的WS端点。我认为您希望调用actor源上的
preMaterialize
,然后使用从
HandleMessageswithinkSource
中返回的源。然后,你最终只会变成一个演员。
path("ws-push-actor")

//complete(upgrade.handleMessagesWithSinkSource(Sink.ignore, actorSource))

complete(upgrade.handleMessagesWithSinkSource(Sink.ignore, Source.fromPublisher(publisher)))