Scala Lift:同一页面上的多个Comet Actors

时间:2011-10-11 11:54:42

标签: scala comet lift

在页面上拥有多个彗星演员是个好主意吗?

我目前有一个简单的聊天框,就像Lift文档和简单的网络摄像头流处理程序一样。

当两个人都被激活时我遇到了锁定,例如我在聊天中输入了一条消息,一切都很好,但是当我启动相机时,聊天框不再有效。

这种设置的最佳做法是什么?我的目标是在页面上有两个以上,但是想知道是否有一个演员将结果发送到页面以进行聊天和流等会更好。

代码发布如下:

CHAT

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 个答案:

答案 0 :(得分:2)

每页有几个彗星演员应该可以正常工作。我在一个页面上拥有的最多的是11.在其他项目中我有过4.有些人可能认为它有点矫枉过正,但它让我有较小的演员,责任有限。 Lift处理使演员通过一个连接到服务器的所有管道,这意味着它将不会使用比所需更多的资源。

代码看起来正确,但我会调查STREAMMOD.stream_view.add_stream

我知道这个答案来得很晚,但它可能对其他人有所帮助。