gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:13:55 25 4
gpt4 key购买 nike

我正在尝试实现一个类似于 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>))
}
}

最佳答案

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

关于scala - 这是在 Lift 中实现 GMail 小部件的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12088196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com