Dynamic Flow.via基于邮件内容

时间:2017-10-07 20:25:52

标签: scala playframework akka akka-stream

基于我以前的方法: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"中心:(

总结一下我想要实现的目标:

  • 如果消息与项目相关,我想通过" hub" 对于那个项目。
  • 这必须像其他人一样动态发生 请求可能是另一个项目。

0 个答案:

没有答案