2010年4月7日水曜日

BlazeDS 入門記(FlexClient, MessageClient, and FlexSession objects)

BlazeDS architecture / Managing session data / FlexClient, MessageClient, and FlexSession objects

The FlexClient object

Every Flex application, written in MXML or ActionScript, is eventually compiled into a SWF file. When the SWF file connects to the BlazeDS server, a flex.messaging.client.FlexClient object is created to represent that SWF file on the server. SWF files and FlexClient instances have a one-to-one mapping. In this mapping, every FlexClient instance has a unique identifier named id, which the BlazeDS server generates. An ActionScript singleton class, mx.messaging.FlexClient, is also created for the Flex application to access its unique FlexClient id.

FlexClient のインスタンスは SWF ファイルに対応するらしいです。

と言われてもよく分からないので、同一ブラウザで2つのタブを開いてアクセスしてみました。

アクセスされた側で FlexContext.getFlexClient().getId() を表示するようにしたところ、ブラウザ毎ではなく、クライアント毎に異なるIDが振られることが確認できました。


The MessageClient object

If a Flex application contains a Consumer component (flex.messaging.Consumer), the server creates a corresponding flex.messaging.MessageClient instance that represents the subscription state of the Consumer component. Every MessageClient has a unique identifier named clientId. The BlazeDS server can automatically generate the clientId value, but the Flex application can also set the value in the Consumer.clientId property before calling the Consumer.subscribe() method.

Consumer 毎に個別にユニークな ID が自動的に振られるが、自前で振ることも可能という話。


The FlexSession object

A FlexSession object represents the connection between the Flex application and the BlazeDS server. Its life cycle depends on the underlying protocol, which is determined by the channels and endpoints used on the client and server, respectively.

If an HTTP-based channel, such as AMFChannel or HTTPChannel, is used in the Flex application, the FlexSession on the BlazeDS server is scoped to the browser and wraps an HTTP session. If the HTTP-based channel connects to a servlet-based endpoint, the underlying HTTP session is a J2EE HttpSession object.

FlexSession は Flex アプリケーションと BlazeDS 間のコネクションをあらわし、channel と endpoint によって決定されるプロトコルによってライフサイクルが変わるという話。

AMFChannel や HTTPChannel のような HTTP ベースの channel の場合、FlexSession は HTTP Session のラップになるらしい。

HttpSession と本当に同じ振る舞いをするか、一応確認してみることにしよう。

ということで、同一ブラウザで2つのタブや別ウィンドウを開いてアクセスする実験をしてみました。

アクセスされた側で FlexContext.getFlexSession().getId() を表示するようにしたところ、同一ブラウザでは同一の ID が表示されました。

別ブラウザではどうなるかということで、IE と FF で試してみたところ、別ブラウザでは異なる ID となりました。

予想通り、HttpSession と同じ振る舞いになりました。めでたし。


The relationship between FlexClient, MessageClient, and FlexSession classes

A FlexClient object can have one or more FlexSession instances associated with it depending on the channels that the Flex application uses. For example, if the Flex application uses one HTTPChannel, one FlexSession represents the HTTP session created for that HTTPChannel on the BlazeDS server.

A FlexSession can also have one or more FlexClients associated with it. For example, when a SWF file that uses an HTTPChannel is opened in two tabs, two FlexClient instances are created in the BlazeDS server (one for each SWF file), but there is only one FlexSession because two tabs share the same underlying HTTP session.

In terms of hierarchy, FlexClient and FlexSession are peers whereas there is a parent-child relationship between FlexClient/FlexSession and MessageClient. A MessageClient is created for every Consumer component in the Flex application. A Consumer must be contained in a single SWF file and it must subscribe over a single channel. Therefore, each MessageClient is associated with exactly one FlexClient and one FlexSession.

If either the FlexClient or the FlexSession is invalidated on the server, it invalidates the MessageClient. This behavior matches the behavior on the client. If you close the SWF file, the client subscription state is invalidated. If you disconnect the channel or it loses connectivity, the Consumer component is unsubscribed.

FlexSession、FlexClient、MessageClient のインスタンスの関係が、FlexSession 1:* FlexClient 1-* MessageClient という話。


Event listeners for FlexClient, MessageClient, and FlexSession

いろいろとリスナーがあるとよという話。

ひとまず、FlexClientListener と FlexSessionListener について実験してみました。

FlexClient.addClientCreatedListener(new FlexClientListener() {
 public void clientDestroyed(FlexClient flexClient) {
  System.out.println("clientDestroyed : " + flexClient.getId());
 }

 public void clientCreated(FlexClient flexClient) {
  System.out.println("clientDestroyed : " + flexClient.getId());
 }
});
FlexSession.addSessionCreatedListener(new FlexSessionListener() {
 public void sessionDestroyed(FlexSession flexSession) {
  System.out.println("sessionDestroyed : " + flexSession.getId());
 }
 public void sessionCreated(FlexSession flexSession) {
  System.out.println("sessionCreated : " + flexSession.getId());
 }
});

上記のような形でリスナーを登録後、新規にアクセスしてみると、下記のようなメッセージが表示されました。

clientCreated : 4590A4C9-5A1E-5D26-BE7F-21101AD66C98
sessionCreated : ngskddnnb17q

clientDestroyed と sessionDestroyed がどのタイミングで呼び出されるのかは、振る舞いを追う限りはよく分かりませんでした。後でソースを見てみようと思います。


Log categories for FlexClient, MessageClient, and FlexSession classes

FlexClient, MessageClient, FlexSession のログカテゴリは以下という話。
  • Client.FlexClient
  • Client.MessageClient
  • Endpoint.FlexSession

0 件のコメント:

コメントを投稿