SCALA Lift - доступ S.param в Comet Actor - PullRequest
3 голосов
/ 27 октября 2011

Я пытаюсь получить параметр url в CometActor, чтобы проверить, что источник данных соответствует месту назначения, например, пользователь отправляет сообщение из комнаты A, которое должно быть получено и отображено только в комнате A, а не в Bили C.

Я пробовал:

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

Но это всегда пусто, это можно сделать?Или есть другой способ остановить отправку сообщений Comet туда, куда не следует?

Заранее спасибо за любую помощь, высоко ценится:)

Ответы [ 2 ]

4 голосов
/ 27 октября 2011

CometActors существуют вне сеанса и поэтому не имеют доступа к (большей части).Решение состоит в том, чтобы инициализировать актера с помощью сообщения инициализации, содержащего требуемые данные сеанса.Для этого есть какой-то помощник, возможно, в 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может выглядеть так, если мы отправим класс case, содержащий:

// ...
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
    }
  }
}
0 голосов
/ 27 мая 2016

Из Список рассылки Lift :

CometActors существуют вне цикла HTTP запрос / ответ. Это означает, что во время обработки сообщения в CometActor вы не видите Req, потому что никогда нет Req, доступного как часть обработки сообщения.

В отличие от некоторых сообщений в этой теме, S-контекст доступен , как и SessionVars (но не RequestVars, поскольку CometActor находится вне области запроса).

(...)

Лучше всего создать SessionVar (или несколько SessionVar), которые содержат хост и порт. Установите эти SessionVars из фрагмента (если они еще не установлены). Затем получите доступ к SessionVars из ваших CometActors.

Это один из возможных вариантов. Тем не менее, я предпочитаю вставлять кометы на страницу с помощью 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))
  }
}
...