Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Playframework用户参与者与用户会话_Scala_Playframework_Websocket_Akka - Fatal编程技术网

Scala Playframework用户参与者与用户会话

Scala Playframework用户参与者与用户会话,scala,playframework,websocket,akka,Scala,Playframework,Websocket,Akka,我对Scala、Play框架和Akka都很陌生。在我目前从事的项目中,web应用程序的用户应该能够以异步方式要求服务器做一些事情(比如启动特定的计算)。如果服务器完成了,它也应该通知用户异步。我通过一个WebSocket连接来解决这个需求,该连接是在用户首次连接应用程序时建立的,并且WebSocket由一个UserActor处理,它连接到用户会话: def ws = WebSocket.tryAcceptWithActor[JsValue, JsValue] { implicit request

我对Scala、Play框架和Akka都很陌生。在我目前从事的项目中,web应用程序的用户应该能够以异步方式要求服务器做一些事情(比如启动特定的计算)。如果服务器完成了,它也应该通知用户异步。我通过一个WebSocket连接来解决这个需求,该连接是在用户首次连接应用程序时建立的,并且WebSocket由一个
UserActor
处理,它连接到用户会话:

def ws = WebSocket.tryAcceptWithActor[JsValue, JsValue] { implicit request =>

    Future.successful(request.session.get(UID) match {
        case None => Left(Forbidden)
        case Some(uid) => Logger.info("WebSocket has accepted the request with uid " + uid)
                          Right(UserActor.props(uid))
    })
}
目前,UserActor所做的唯一一件事就是以
JsValue
的形式从
WebSocket
接收消息。请求索引时会生成会话的UID:

def index = Action { implicit request => {
    val uid = request.session.get(UID).getOrElse {
      counter += 1
      counter.toString
    }
    Ok(views.html.index(uid)).withSession {
      Logger.debug("create uid " + uid)
      request.session + (UID -> uid)
    }}
}
UserActor
应该代表服务器上的实际用户,因此包括用户可以在服务器上执行的所有操作的逻辑。只要我通过
WebSocket
发送所有用户交互,这就可以正常工作

现在,其他用户输入的情况如何,比如表单提交?该应用程序包括一个表单,其数据不应通过
WebSocket
,而应通过
POST
请求提交(可能使用AJAX),并在控制器中绑定到文档中描述的模型

def saveContact = Action { implicit request =>
  contactForm.bindFromRequest.fold(
    formWithErrors => {
      BadRequest(views.html.contact.form(formWithErrors))
    },
    contact => {
      val contactId = Contact.save(contact)
      Redirect(routes.Application.showContact(contactId)).flashing("success" -> "Contact saved!")
    }
  )
}
此示例取自

现在,如何将表单提交处理程序与
UserActor
链接?假设我想告诉用户参与者表单已经提交。一个简单的例子是,
UserActor
在收到表单的一个值后,通过
WebSocket
将其发送回客户端。因此,问题基本上归结为我想从任何
控制器
发送
UserActor
消息的问题

我可能会想到通过WebSocket发送所有表单数据的想法,但我还想在将来实现大数据的上传,我想像前面描述的那样解决这个问题。然后我可以想象的一个场景是,
UserActor
应该为它接收的每个块发送消息

我想一个问题是
UserActor
WebSocketActor
是相同的,我更应该拆分它们的逻辑,这样
UserActor
只与会话关联,但我不知道如何实现这一点。也许我需要另一个参与者,比如说
UserManager
,它跟踪当前的
UserActors
,并允许访问
UserActors

您是否有任何建议、建议或示例应用程序也可以处理此案例?事先非常感谢


致以最诚挚的问候

不要使用传递给
tryaacceptwithactor
的actor作为
用户
的表示。它应该表示与该用户的特定会话。用户可能在特定时间打开多个并发会话(多个浏览器或选项卡)中的一个


创建一个单独的参与者来代表用户及其可以执行的所有操作。现在,会话参与者应该将其消息转发给用户参与者。传统的控制器方法也可以将请求转发给相应的用户参与者。

不要使用传递给
tryaacceptwithactor
的参与者作为
用户的表示形式。它应该表示与该用户的特定会话。用户可能在特定时间打开多个并发会话(多个浏览器或选项卡)中的一个

创建一个单独的参与者来代表用户及其可以执行的所有操作。现在,会话参与者应该将其消息转发给用户参与者。传统的控制器方法也可以将请求转发给相应的用户参与者