Scala Lift:同一页面上的多个 Comet Actor
在一页上有多个彗星演员是个好主意吗?
我目前有一个简单的聊天框(如 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
每页有几个彗星演员应该可以正常工作。我在一页上最多有 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.