SCALA Lift - S.param访问Comet Actor

时间:2011-10-27 11:31:53

标签: ajax scala comet lift

我正在尝试检索CometActor中的url参数以验证数据源是否与目标匹配,例如,用户从房间A发送消息,该消息应该仅在房间A中接收和显示,而不是B或C.

我试过了:

S.param("message").openOr("") 

但它总是空的,可以这样做吗?还是有另一种方法可以阻止彗星消息进入他们不应该去的地方吗?

提前感谢您的帮助,非常感谢:)

2 个答案:

答案 0 :(得分:4)

CometActors存在于会话之外,因此无法访问(大部分)它。解决方案是使用包含所需会话数据的初始化消息初始化actor。可能会在LiftRules中使用某种帮助器来做到这一点。我正在通电话并从记忆中重述这一点,但希望它足以继续下去。

具体来说,你想做的事情如下:

for (
  session <- S.session
  message <- S.param("message")
) {
  session.setupComet("myCometActor", Some("unique name, if you want it"), message)
}

Boot.scala

查看LiftSession了解更多信息。我认为可能有一种方法可以挂钩LiftRules以便在创建会话时调用相关代码...

更新:如果我们发送一个包含以下内容的案例类,那么这就是您的CometActor的样子:

// ...
session.setupComet(
  "myCometActor",
  Some("unique name, if you want it"),
  Message(message)
)
// ...
case class Message(text: String)

class CometMessage extends CometActor { 
  override def lowPriority = {
    case Message(text) => {
      // do something here with the text, whether settings a SessionVar or even just a plain var
    }
  }
}

答案 1 :(得分:0)

来自Lift's mailing list

  

CometActors存在于HTTP请求/响应周期之外。这意味着在CometActor中处理消息时,您无法看到Req,因为消息处理过程中从未提供过Req。

     

与此线程上的一些帖子相反,S上下文 可用,因为SessionVars(但不是RequestVars,因为CometActor不在请求范围内)。

     

(...)

     

最好的办法是创建一个容纳主机和端口的SessionVar(或几个SessionVars)。从片段中设置这些SessionVars(如果它们尚未设置)。然后从CometActors访问SessionVars。

这是一种可能的选择。但是,我个人的偏好是使用NamedCometActorSnippet将彗星插入页面并立即向创建的彗星发送消息:

class MyCometSnippet extends NamedCometActorSnippet {

  val cometClass = "MyComet"
  val name = "MyComet-instance"

  for {
    liftSession <- S.session
    processingMode <- S.param("message")
  } yield {
    liftSession.sendCometActorMessage(cometClass, Full(name), SetMessageValue(message))
  }
}