基于我以前的方法:BroadcastHub filtering based on "resource" the connected client is working on?我尝试了一些不同的东西,并希望使用演员来进行内心流动"代替。
基本构思/概述来自https://markatta.com/codemonkey/blog/2016/04/18/chat-with-akka-http-websockets/
现在我的问题是,在那个例子中,聊天室在开始时是固定的。
(val chatRoom = system.actorOf(Props(new ChatRoom), "chat")
)
对我而言,情况有所不同。根据收到的消息,我想使用另一个"房间" (就我而言,它被称为projectHub但是没关系)
我为此创造了这个:
private val projectHubs = mutable.Map[String, ActorRef]()
private val hub = system.actorOf(Props(new Hub("universe")), "universe")
def handle: WebSocket = WebSocket.accept[WebSocketMessage, WebSocketMessage]
{
_ =>
var ourHub: ActorRef = hub
Flow[WebSocketMessage]
.map
{ m =>
val msg = Wrapper.parseFrom(m)
logger.info(s"client sent message: ${msg.toString}");
m
}
.map
{
case isProjectRelated if !extractUserAndProject(isProjectRelated)._2.isEmpty =>
val (_, projectName) = extractUserAndProject(isProjectRelated)
if (!projectName.isEmpty)
{
projectHubs.get(projectName) match
{
case Some(ph) =>
{
logger.info(s"Found EXISTING hub for $projectName")
ourHub = ph
}
case None =>
{
logger.info(s"Creating NEW hub for $projectName")
// TODO shouldn't be projectName alone but also group or something
val newHub = system.actorOf(Props(new Hub(projectName)), projectName)
projectHubs.put(projectName, newHub)
ourHub = newHub
logger.info(s"ourHub should be $ourHub")
}
}
}
isProjectRelated
case other => other
} via {
logger.info(s"ourHub is $ourHub")
userFlowThrough(ourHub)
}
}
现在,我明白为什么这不起作用。虽然我天真地重新分配ourHub
,但这个更改永远不会传播到实际流程,这是在websocket初始化时创建的。
知道我的错误并没有让我找到解决方案。我尝试使用Partition
但是以史诗般的方式失败了。
我现在所处的位置,每个人都会为任何请求获取所有内容,因为所有用户都在"universe"
中心:(
总结一下我想要实现的目标: