Подъем SCALA — доступ к S.param в актере Comet

#ajax #scala #comet #lift

#ajax #scala #comet #подъем

Вопрос:

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

Я пробовал:

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

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

Заранее спасибо за любую помощь, очень признателен 🙂

Ответ №1:

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
    }
  }
}
 

Комментарии:

1. Итак, я использую ваш метод здесь с помощью фрагмента, который загружает всех участников comet для этой страницы. Все, что мне нужно знать сейчас, это как получить доступ к этим сообщениям из comet actor. Спасибо

2. Вы получаете их в одном из ваших обработчиков сообщений, например lowPriority .

3. Не могли бы вы привести простой пример, такой как вызываемый метод, например, S.param(«комната»), где «комната» равна переданному параметру. Еще раз спасибо

Ответ №2:

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

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

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

(…)

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

Это один из возможных вариантов. Однако я лично предпочитаю вставлять comets на страницу с использованием NamedCometActorSnippet и немедленно отправлять сообщение созданной comet:

 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))
  }
}