发表于： 2013-01-15 作者：darrenzhu 来源：转载 浏览：
Are you out of luck when you use NIO-based channels/endpoints? Not really. You still have access to FlexClient object on the server, and FlexClient object has a list of sessions it is associated with. For example, if your Flex application uses a Servlet-based channel (let’s call this my-amf in short) and a NIO-based channel (my-rtmp in short), FlexClient will have 2 sessions in its list of sessions: One Servlet-based session (i.e. HttpFlexSession) for my-amf and one NIO-based session (i.e. RTMPFlexSession) for my-rtmp. Whenever you set an attribute on RTMPFlexSession, you can access the HttpFlexSession and set it there too. This way, not only all sessions associated with Flex client get the attribute, but a JSP in the same page would get the attribute in its HttpSession.
One important point. If you don’t care about sharing session data outside Flex (with a JSP for example), it’s good to know that FlexClient (the object that represents the SWF on the server) also has get/set/remove attribute methods. By setting/retrieving attributes on the FlexClient, you avoid the complexities of dealing with multiple sessions.
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 LiveCycle Data Services ES 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 LiveCycle Data Services ES server generates. An ActionScript singleton class, mx.messaging.FlexClient, is also created for the Flex application to access its unique FlexClient 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 LiveCycle Data Services ES 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.
The FlexSession object
A FlexSession object represents the connection between the Flex application and the LiveCycle Data Services ES 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 you use an RTMP channel in the Flex application, the FlexSession on the LiveCycle Data Services ES server is scoped to the underlying RTMP connection from the single SWF file. The server is immediately notified when the underlying SWF file is disconnected because RTMP provides a duplex socket connection between the SWF file and the LiveCycle Data Services ES server. RTMP connections are created for individual SWF files, so when the connection is closed, the associated FlexSession is invalidated.
If an HTTP-based channel, such as AMFChannel or HTTPChannel, is used in the Flex application, the FlexSession on the LiveCycle Data Services ES 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. If the channel connects to an NIO-based endpoint, the underlying HTTP session supports the FlexSession API, but it is disjointed from the application server HttpSession object.
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 LiveCycle Data Services ES server. If the Flex application uses an HTTPChannel and an RTMPChannel, two FlexSessions are created; one represents the HTTP session and the other represents the RTMP session.
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 LiveCycle Data Services ES 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.
Event listeners for FlexClient, MessageClient, and FlexSession
The LiveCycle Data Services ES server provides the following set of event listener interfaces that allow you to execute custom business logic as FlexClient, FlexSession, and MessageClient instances are created and destroyed and as their state changes:
FlexClientListener supports listening for life cycle events for FlexClient instances.
FlexClientAttributeListener supports notification when attributes are added, replaced, or removed from FlexClient instances.
FlexClientBindingListener supports notification when the implementing class is bound or unbound as an attribute to a FlexClient instance.
FlexSessionListener supports listening for life cycle events for FlexSession instances.
FlexSessionAttributeListener supports notification when attributes are added, replaced, or removed from FlexSession instances.
FlexSessionBindingListener supports notification when the implementing class is bound or unbound as an attribute to a FlexSession instance.
MessageClientListener supports listening for life cycle events for MessageClient instances representing Consumer subscriptions.
For more information about these classes, see the Javadoc API documentation.
Log categories for FlexClient, MessageClient, and FlexSession classes
The following server-side log categories can be used to track creation, destruction, and other relevant information for FlexClient, MessageClient, and FlexSession: