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

发布于 2024-12-09 08:57:54 字数 2217 浏览 4 评论 0原文

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

我目前有一个简单的聊天框(如 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()       
    }
}

Is it a good idea to have more than one comet actor on a page?

I've currently got a simple chat box like the one in the Lift docs and a simple webcam stream handler.

I'm experiencing locks when both are activated, e.g I type a message into the chat, all is well, but when I start a camera feed the chat box no longer works.

What is best practice for this kind of setup? I aim to have alot more than two on a page, but was wondering if it would be better to have a single actor that dispatches the results to the page for both chat and streams etc.

Code is posted below:

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 (Webcam)

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

手心的海 2024-12-16 08:57:55

每页有几个彗星演员应该可以正常工作。我在一页上最多有 11 个。在其他项目中,我有 4 个。有些人可能认为这有点过头了,但它让我可以拥有较小的角色,承担有限的责任。 Lift 处理让参与者通过一个连接运行到服务器的所有管道,这意味着它不会使用超出所需的资源。

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

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

Several comet actors per page should work fine. The most I've had on one page is 11. In other projects I've had 4. Some might think it is overkill, but it lets me have smaller actors with limited responsibility. Lift handles all the plumbing of getting the actors to run through one connection to the server which means that it won't use more resources than needed.

The code look right, but I would have investigated STREAMMOD.stream_view.add_stream.

I know that this answer comes late, but it might help others.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文