我正在尝试实施类似于iGoogle或Netvibse上的GMail小部件,以练习如何在Lift Web框架中使用Comet。
目前我所拥有的是以下代码,它的简短而且效果惊人。
但我不确定这是实现它的最好方法。因为从GMail检索邮件是一项非常耗时的工作,并且以下代码只有一个GMailListener,它会在从GMail收到邮件时阻止。
我想这意味着我的网站上有两个用户,例如UserA和UserB。
虽然下面的代码是线程安全的,但如果它们都在使用这个Comet的页面上,UserB仍然需要等到处理UserA的邮件才能获得自己的结果,对吗?
避免阻止的最佳方法是什么?
import net.liftweb.actor.LiftActor
import net.liftweb.util.Schedule
import net.liftweb.util.Helpers._
import net.liftweb.http.CometActor
import net.liftweb.http.js.JsCmds.SetHtml
import net.liftweb.http.js.jquery.JqJsCmds._
case class FetchGMail(userID: Int, sender: CometActor)
case class NewStuffs(mails: List[Stuff])
object GMailListener extends LiftActor
{
def getMails(userID: Int) = {
// Get Mails from GMail
}
def messageHandler = {
case FetchGMail(userID, sender) =>
println("Get FetchMail request")
sender ! NewStuffs(getMails(userID))
Schedule.schedule(this, FetchGMail(userID, sender), 5 minutes)
}
}
class Inbox extends CometActor with JSImplicit
{
def render = <div>Empty Inbox</div>
GMailListener ! FetchGMail(1, this)
override def lowPriority = {
case NewStuffs(mails) =>
println("get new mails")
partialUpdate(AppendHtml("mails", <div>{mails}</div>))
}
}
答案 0 :(得分:4)
请记住,一个actor一次只能处理一条消息,只会在处理消息时消耗资源。您的GmailListener是单身人士,因此它现在可能成为瓶颈,但您无法为每个用户创建GmailListener实例。每个实例只会在您的计划调用指令时唤醒并利用线程执行Gmail查找。只需确保在收件箱关闭时关闭相应的GmailListener。看看net.liftweb.http.CometListener
,我认为应该对此有所帮助。