2

Lift Web フレームワークで Comet を使用する方法を練習するために、iGoogle または Netvibse のものと同様の GMail ウィジェットを実装しようとしています。

現在、私が持っているのは次のコードで、短くて驚くほど機能します。

しかし、それを実装するためのこの最良の方法についてはわかりません。GMail からメールを取得するのは時間のかかる作業であり、次のコードには GMailListener が 1 つしかないため、GMail からメールを取得するとブロックされます。

これは、私の Web サイトに UserA と UserB のように 2 人のユーザーがいる場合を意味すると思います。

次のコードはスレッド セーフですが、両方ともこの 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>))
    }
}
4

1 に答える 1

4

アクターは一度に 1 つのメッセージしか処理できず、メッセージの処理中にのみリソースを消費することに注意してください。GmailListener はシングルトンであるため、現時点ではボトルネックになる可能性がありますが、ユーザーごとに GmailListener のインスタンスを作成できない理由はありません。各インスタンスは、スケジュール呼び出しが指示されたときにのみ起動し、スレッドを使用して Gmail ルックアップを行います。Inbox がシャットダウンしたときに、対応する GmailListener を必ずシャットダウンしてください。net.liftweb.http.CometListener私がそれを助けると思うものを見てください。

于 2012-08-23T14:54:57.070 に答える