SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Scala+Liftによる実践Webアプリケーション開発

AjaxとCometを利用したLiftのアプリケーションを作る

Scala+Liftによる実践Webアプリケーション開発(5)

  • X ポスト
  • このエントリーをはてなブックマークに追加

Cometとは

 Cometは、サーバで発生したイベントをリアルタイムでブラウザに通知するプッシュ型の技術です。通常はJavaScriptによってサーバーとコネクションを継続させることで実現します。

 Cometを利用することで、通常のWebアプリケーションでは難しい、チャットのようにリアルタイムで通知が必要なアプリケーションを実現することが可能です。

LiftにおけるComet

 Liftでは、ScalaのActorライブラリとjQueryを利用して、Cometアプリケーションの作成をサポートする機能が備わっています。

 ScalaのActorライブラリは、オブジェクト間のメッセージのやりとりを非同期に行うことができるようになっています。

 Actor同士は、相互にメッセージを送信しあって、非同期処理を協調して実行するのです。

 Cometを利用する場合は、CometActorを継承したSnippetを用意します。このCometActorを継承したSnippet自体が、一つのActorになっており、CometActorにメッセージが送られると、あらかじめCometで接続されているブラウザにレスポンスを返す、というのがLiftにおけるCometの仕組みです。

Twitterのクローンのようなアプリケーションを改良する

 では、前回まで作成していたTwitterのクローンのようなアプリケーションに、Cometを利用してメッセージが投稿されたらすぐにブラウザに反映されるような画面を追加してみましょう。

 今回は、2つのActorを用意します。

 一つは、CometActorを継承し、ブラウザとCometで接続し、メッセージを受け取ってブラウザにその内容を返すSnippetです。

 もう一つは、データベースに登録されたメッセージを受け取って、もう一つのCometActorを継承したSnippetに、そのメッセージを配信するActorです。

 構成は、以下の図のようになります。

図3:ActorとCometを利用した構成
図3:ActorとCometを利用した構成

 今まで作成してきた投稿画面のSnippet(Twit.scala)では、データベースにメッセージを保存した後に、そのメッセージをTwitServerというActorに送るようにします。

 TwitServerは、受け取ったメッセージをCometActorを継承したSnippetに一斉に配信することで、各Snippetは非同期にブラウザにメッセージを表示させることができるようになります。

メッセージを配信するTwitServer

 では、まずはメッセージを配信するTwitServerを作成します。

 プロジェクトディレクトリ以下の 「src/main/scala/demo/twitterclone/comet/」ディレクトリに、「TwitServer.scala」というファイル名で新しいファイルを作成します。内容は、以下のリスト5の通りです。

[リスト5]TwitServer.scala
package demo.twitterclone.comet

import _root_.scala.actors.Actor
import Actor._
import _root_.net.liftweb._
import http._
import _root_.demo.twitterclone.model._

/**
  * メッセージを配信するTwitServer
  * ScalaのActorを継承し、Liftで用意されている
  * ListenerManagerトレイトを継承することで、
  * 登録されている他のActorにメッセージを配信できる。
  */
object TwitServer extends Actor with ListenerManager  { // *1

  // 投稿されたメッセージ(配信されるとクリアされる)
  private var msgs: List[Message] = Nil

  // 登録されている他のActorに配信するメッセージ
  protected def createUpdate = Messages(msgs)

  // メッセージを受信した際の処理
  override def highPriority = { // *2
    case m: Message =>
      msgs ::= m
      // 他のActorにメッセージを配信する
      updateListeners()
      msgs = Nil
  }
  this.start // *3
}

case class Messages(msgs: List[Message]) // *4

 TwitServerクラスは、ScalaのActorを継承します。さらに、Liftで用意されているListenerManagerトレイトを継承することで、登録されている他のActorにメッセージを配信できます(*1)。

 このActorがメッセージを受信した際の処理は、highPriority関数に実装されています(*2)。

 highPriority関数は、継承元のListenerManagerトレイトが持つ関数をオーバーライドすることで、メッセージをActorが受信すると自動的に呼び出されます。

 ここでは、前回作成したモデルであるMessageモデルを受信し、このクラスがもつmsgsフィールドに受信したMessageモデルオブジェクトを追加して、ListenerManagerトレイトが持つupdateListner関数で、受信したMessageモデルオブジェクトをそのまま他のActorに配信しています。

 *3は、このTwitSeverがメッセージの受信を開始する処理です。

 *4のcaseクラスは、他のActorに配信するためのメッセージオブジェクトになっています。内容は、MessageモデルオブジェクトのListを持っています。このListの内容が、Cometで非同期に表示させる内容になる形です。

次のページ

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Scala+Liftによる実践Webアプリケーション開発連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 尾崎 智仁(オザキ トモヒト)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4887 2010/03/15 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング