Scala 这是在Lift中实现GMail小部件的正确方法吗?

Scala 这是在Lift中实现GMail小部件的正确方法吗?,scala,comet,lift,Scala,Comet,Lift,我正在尝试实现一个类似于iGoogle或Netvibse上的GMail小部件,以练习如何在Lift web框架中使用Comet 目前我所拥有的是以下代码,它很短,工作起来令人惊讶 但我不确定这是实现它的最佳方式。因为从GMail中检索邮件是一项耗时的工作,并且下面的代码只有一个GMail侦听器,这将在从GMail中获取邮件时阻塞 我猜这意味着如果我的网站上有两个用户,例如UserA和UserB 虽然下面的代码是线程安全的,但是如果它们都在使用这个Comet的页面上,UserB仍然必须等到User

我正在尝试实现一个类似于iGoogle或Netvibse上的GMail小部件,以练习如何在Lift web框架中使用Comet

目前我所拥有的是以下代码,它很短,工作起来令人惊讶

但我不确定这是实现它的最佳方式。因为从GMail中检索邮件是一项耗时的工作,并且下面的代码只有一个GMail侦听器,这将在从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>))
    }
}

请记住,参与者一次只能处理一条消息,并且在处理消息时只会消耗资源。你的Gmail是一个单例,所以现在可能是一个瓶颈,但是没有理由不能为每个用户创建Gmail实例。每个实例只会在您的日程安排要求时唤醒并利用一个线程进行Gmail查找。只需确保在收件箱关闭时关闭相应的Gmail。请看net.liftweb.http.CometListener,我认为这会有所帮助。

请记住,参与者一次只能处理一条消息,并且在处理消息时只会消耗资源。你的Gmail是一个单例,所以现在可能是一个瓶颈,但是没有理由不能为每个用户创建Gmail实例。每个实例只会在您的日程安排要求时唤醒并利用一个线程进行Gmail查找。只需确保在收件箱关闭时关闭相应的Gmail。请看net.liftweb.http.CometListener,我认为这应该会有所帮助