2010年4月9日金曜日

BlazeDS 入門記(Using the Messaging Service)

Messaging Service / Using the Messaging Service

  • 複数のFlexクライアントとBlazeDSサーバの間で publish-subscribe のメッセージングが可能。
  • JMSAdapter により JMS の queue や topic にブリッジ可能。
  • クライアントからのメッセージをサーバ経由で別のクライアントに配送することが可能。
  • サーバからメッセージをクライアントに配送することも可能。
  • メッセージは、ユニークID、BlazeDSヘッダ、カスタムヘッダ、ボディ等で構成される。BlazeDSヘッダの先頭はDSという文字列。
  • クライアントからメッセージを送信するには Producer コンポーネントを使用する。
  • クライアントでメッセージを受信するには Consumer コンポーネントを使用する。
  • Consumer は selector expression が使える。
  • Producer と Consumer は subtopic information を追加可能。
  • queue-based のメッセージングは、JMSAdapter に JMS Queue をバインディングすることにより可能。
  • 以下、BlazeDS Server Architecture の図 
  • チャネルはReal-timeのものを使う。ポーリングでもOK。
  • Message Service は message destinations のリストと、各 destination にサブスクライブしているクライアント情報を保持する。→ これって Session に持つのかな?
  • 標準的なアダプタとして ActionScriptAdapter と JMSAdapter があり、その他のカスタムアダプタを自作することも可能。
  • メッセージング系の設定は services-config.xmlにも書けるけど messaging-config.xml に書くのがオススメ。

Working with Producer components

クライアント側での Producer の書き方についての説明。

  • 自動的にリトライする方法もあるが、複数回送信される可能性があるので、副作用のあるメッセージングは注意すること。
  • 配送できたかよくわからんシチュは2つある。それは、Producer.requestTimeout プロパティの値を超えた場合と、応答が帰ってくる前にチャネルの接続が切れた場合。この場合、ErrorMessage.faultCode が ErrorMessage.MESSAGE_DELIVERY_IN_DOUBT になる。
  • reconnectAttempts は、-1だと無限に再試行して、0だと再試行しない。
  • reconnectInterval は再試行のインターバル。0だと再試行しない。

Working with Consumer components

クライアント側での Consumer の書き方についての説明。

  • Consumer.subscribed プロパティは Flex クライアントが destination に subscribe したときに true になる。
  • Consumer.connected プロパティは Flex クライアントがサーバに接続したときに true になる。
  • resubscribeAttempts は、subscribe に失敗した際に fault イベントを返す前に何度リトライするかを設定する。-1は無限リトライ、0はリトライしない。→ これって、GAEのような負荷分散環境では必須ですね。まぁ、このような環境でメッセージングが使えるのが前提なんですが、調査してないのでわかりまてん。
  • resubscribeInterval は リトライ間隔をミリ秒単位で設定する。0の場合はリトライをしない。
  • AMFChannelのようなリアルタイムでないチャネルに polling-enabled を使用しないで使うこともできる。この場合、クライアント側で Consumer.receive() を自分から呼びに行けばOK。


Using a pair of Producer and Consumer components in an application


メッセージを送受信するクライアントアプリケーションの場合、同一の destination をもつ Producer と Consumer のペアができるという話。


Message filtering

メッセージのフィルタリングの話。
  • Producer は メッセージヘッダや subtopic information に情報を付加できる。Consumer ではこの情報を元にクライテリアベースのフィルタリングができる。
  • Consumer コンポーネントは subscribe するときにフィルタリング用のクライテリアをサーバに送信する。このようにして、実際にフィルタリングをする作業はサーバ側で行う。
  • 注意書きとして、フィルタリング用の情報としてメッセージヘッダと subtopic の両方を同時に使用してはいけないと書かれている。→ なんでだろ?
  • AsyncMessage.headers プロパティにヘッダ情報が格納される。これは連想配列で、キーがヘッダ名で値が文字列か数字となる。
  • JMS もしくは DS という文字列で始まるヘッダ名は予約されているので使用禁止。
  • Consumer の selector プロパティにフィルタリングの条件を記述する。これは SQL92 conditional expression syntax をベースにしている。たとえば selector="prop1 < 4" のような書き方ができる。
  • mx.messaging.MultiTopicConsumer や mx.messaging.MultiTopicProducer を利用すると、複数の topic を単一のイベントハンドラで扱うことができます。
  • JMSを使用する場合は subtopic は利用不可。→ 基本的に常にヘッダだけ使えば間違いないですね。
  • subtopic 名は、destination 名にドット区切りでつける。Consumer 側はワイルドカードが使える。ワイルドカードは1つのトークンに閉じて適用される。"foo.*.baz" は "foo.bar.baz" と"foo.aaa.baz" にマッチするが、"foo.bar.cookie" にはマッチしない。
  • subtopic を有効にするためには、destination の設定で以下のような指定が必要。
<allow-subtopics>true</allow-subtopics>
<subtopic-separator>.</subtopic-separator>

Configuring the Messaging Service

設定の話いろいろ。

いろいろと設定項目があるので、きちんとおさえておきましょう。

0 件のコメント:

コメントを投稿