Scala Lift: несколько актеров кометы на одной странице - PullRequest
2 голосов
/ 11 октября 2011

Это хорошая идея, чтобы иметь более одного кометного актера на странице?

В настоящее время у меня есть простое окно чата, такое как в документах Lift, и простой обработчик потока веб-камеры.

У меня возникают блокировки, когда оба активированы, например, я набираю сообщение в чате, все хорошо, но когда я запускаю камеру, окно чата больше не работает.

Какова наилучшая практика для такого рода установки? Я хочу, чтобы на странице было больше двух страниц, но мне было интересно, будет ли лучше иметь одного актера, который отправляет результаты на страницу как для чата, так и для потоков и т. Д.

Код размещен ниже:

ЧАТ

case class ChatMessage(name: String, text: String)

class ChatComet extends CometActor with CometListener {

    private var messages: List[ChatMessage] = Nil 

    def registerWith = ChatServer

    override def lowPriority = {
        case v: List[ChatMessage] => messages = v; reRender()
    }

    def render = {  
        "li *" #> messages.map(message =>   
            ".name *" #> message.name &
            ".text *" #> message.text           
        )       
    }   
}

object ChatServer extends LiftActor with ListenerManager {

    private var messages: List[ChatMessage] = Nil

    def createUpdate = messages

    override def lowPriority = {
        case message: String if message.length > 0 =>
            messages :+= ChatMessage("Anon", message);
            updateListeners()   
    }
}

STREAM (веб-камера)

case class StreamItem(name: String, path: String, level: String)

class StreamComet extends CometActor with CometListener {

    private var streams: List[StreamItem] = Nil 

    def registerWith = StreamServer

    override def lowPriority = {
        case v: List[StreamItem] => 
            streams = v;
            reRender();
          partialUpdate(Call("STREAMMOD.stream_view.add_stream({ path : '" + streams.reverse(0).path + "', level : '_1'})"));   
    }

    def render = {
        "li *" #> streams.map(stream =>
            ".name *" #> stream.name.toString &
            ".stream [id]" #> stream.path.toString  
        )
    }
}

object StreamServer extends LiftActor with ListenerManager {

    private var streams: List[StreamItem] = Nil

    def createUpdate = streams

    override def lowPriority = {    
        case stream: String if stream.length > 0 =>     
            streams :+= StreamItem("James", stream, "_1");
            updateListeners()       
    }
}

1 Ответ

2 голосов
/ 13 июня 2012

Несколько кометных актеров на странице должны работать нормально.Максимум, что у меня было на одной странице, - 11. В других проектах у меня было 4. Некоторые могут подумать, что это излишне, но это позволяет мне иметь меньших актеров с ограниченной ответственностью.Lift обрабатывает все, что нужно, чтобы актеры запускали одно соединение с сервером, что означает, что он не будет использовать больше ресурсов, чем необходимо.

Код выглядит правильно, но я бы исследовал STREAMMOD.stream_view.add_stream.

Я знаю, что этот ответ приходит поздно, но он может помочь другим.

...