LCDS

[url] http://sjkgxf7191.iteye.com/blog/515723[/url]
LiveCycle Data Services ES architecture




LiveCycle Data Services ES client architecture




Flex components

RemoteObject
HTTPService
WebService
Producer
Consumer
DataService
Channels and channel sets

Flex组件通过channel跟LCDS进行通信。一个channel set 包含是一个channel 的集合 。在该集合中越靠前的channel具有越高的连接优先级 。Flex组件会通过优先级依次连接服务器端直到通信成功。channels会同LCDS服务器上的相应的endpoints进行通信。



Flex客户端可以使用一些不同类型的channel,例如AMFChannel ,HTTPChannel 和RTMPChannel 。很多因素决定了channel的选择,例如你的应用程序的类型。如果你的系统只能允许HTTP协议的话,可以使用AMFChannel或者HTTPChannel,但不能使用RTMPChannel因为它使用RTMP协议。如果需求说明只能使用非二进制数据传播,那就只能用HTTPChannel了。



Messages

所有Flex客户端组件和LCDS服务器端的通信都以消息的形式被执行。Flex组件使用许多类型的消息同LCDS进行通信。但是所有的消息都具有ActionScript的实现形式和Java的实现形式因为这些消息不管在客户端还是服务器端都被序列化 (serialized)和反序列化 (deserialized)。



对象序列化 (Serializable)是指将对象转换为字节序列 的过程,而反序列化则是根据字节序列恢复对象的过程,以便于在网络中传递对象 。http://zhupan.iteye.com/blog/26447



像AcknowledgeMessage 和CommandMessage 这种类型的消息主要用于在Flex组件和LCDS服务器端两边进行互相传递的。还有一些消息是专门用于Flex端或Server端的。例如,Producer组件发送一个消息给订阅者Consumer组件,你可以创建一个AsyncMessage 类型的消息,然后传递给Producer组件的send()方法。



也有别的情况,你都不需要构造和传递消息。例如,你只需要在Flex端使用RemoteObject组件来调用一个远程方法。RemoteObject组件创建了一个封装了RemoteObject调用的RemotingMessage 。然后从服务器端接收一个AcknowledgeMessage。AcknowledgeMessage被封装在Flex程序的ResultEvent对象中。



有时候你必须创建一个消息发送到服务器端。例如,你可以创建一个AsyncMessage并且传递给一个Producer,通过Producer发送消息。



LCDS有两种发送/接收信息的模式:“请求/应答(request/reply) ”模式和“发布/订阅(publish/subscribe) ”模式。RemoteObject,HTTPService和WebService使用的是前者;Producer和Consumer使用的后者。



LiveCycle Data Services ES server architecture

LCDS是一套J2EEweb应用程序 的组合,是一个可扩展性很高的网络socket服务器(network socket server) 。Flex客户端向channel发出的请求会被路由到LCDS中的一个端点(endpoint) 。该请求会经历一个Java对象链 ,分别是MessageBroker object ,a service object ,a destination object ,最后是an adapter object 。adapter 会在本地完成这个请求服务 ,或者通过后台系统,或者通过远程服务器完成,例如JMS(Java Message Service)。




Endpoints

LCDS有两种类型的endpoints:servlet-based endpoints 和NIO-based endpoints 。后者 代表Java New Input/Output 。前者 内置于J2EE servlet container ,所以servlet会为endpoints处理I/O和HTTP会话(sessions)。MessageBrokerServlet 引导Servlet-based endpoints,在web.xml 里有相关配置

Xml代码 
<!-- MessageBroker Servlet --> 
<servlet> 
    <servlet-name>MessageBrokerServlet</servlet-name> 
    <display-name>MessageBrokerServlet</display-name> 
    <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class> 
        <init-param> 
            <param-name>services.configuration.file</param-name> 
            <param-value>/WEB-INF/flex/services-config.xml</param-value> 
        </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<!-- MessageBroker Servlet -->
<servlet>
<servlet-name>MessageBrokerServlet</servlet-name>
<display-name>MessageBrokerServlet</display-name>
<servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
<init-param>
<param-name>services.configuration.file</param-name>
<param-value>/WEB-INF/flex/services-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> 另外,LCDS里还有HTTP session 属性并且绑定了侦听,也在web.xml 文件里

Xml代码 
<!-- Http Flex Session attribute and binding listener support --> 
<listener> 
    <listener-class>flex.messaging.HttpFlexSession</listener-class> 
</listener> 

<!-- Http Flex Session attribute and binding listener support -->
<listener>
    <listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>

NIO-based endpoints可以提供更为显著的可扩展性 因为它们没有被限制为一个连接一个线程 (one thread per connection )并且每个 线程可以处理多个I/Os 。



Flex客户端通过channels 同LCDS的endpoints 进行通信。在客户端的channels和服务器端的endpoints之间有一个映射 。而且这两者必须使用相匹配的消息格式 (message format)。下面代码说明了该映射和同类型(AMF )的消息格式。

Xml代码 
<channel-definition id="my-amf-poll" class="mx.messaging.channels.AMFChannel"> 
    <endpoint 
        url="http://{server.name}:{server.port}/{context.root}/messagebroker/amfpoll" 
        class="flex.messaging.endpoints.AMFEndpoint"/> 
    <properties> 
        <polling-enabled>true</polling-enabled> 
        <polling-interval-seconds>1</polling-interval-seconds> 
    </properties> 
</channel-definition> 

<channel-definition id="my-amf-poll" class="mx.messaging.channels.AMFChannel">
<endpoint
url="http://{server.name}:{server.port}/{context.root}/messagebroker/amfpoll"
class="flex.messaging.endpoints.AMFEndpoint"/>
<properties>
<polling-enabled>true</polling-enabled>
<polling-interval-seconds>1</polling-interval-seconds>
</properties>
</channel-definition> 
MessageBroker

MessageBroker负责路由消息到服务器端,它是LCDS的核心 (at the core of)。在endpoint开始处理请求的时候,endpoint 会从请求中提取出消息 并传给MessageBroker ,MessageBroker查询 消息的目的地 (message's destination)然后传递给对应的service 。如果目的地因为安全原因而被限制的话,MessageBroker会在传递消息过程中运行认证和授权程序(authentication and authorization checks)。




Services and destinations

消息处理链 (the message processing chain )下面就是Services和destinations。

共有四种services和对应的destinations:

RemotingService 和 RemotingDestination
HTPProxyService 和 HTTPProxyDestination
MessageService 和 MessageDestination
DataService 和 DataDestination

services 是Flex组件消息的目标 。而destinations 可以看成是一个service的实例 。例如一个RemoteObject同RemotingService通信:在RemoteObject中,你必须指定一个destination的id属性,就是你要引用的方法的地址。Flex客户端组件和LCDS的services之间的映射如下:

HTTPService and WebService communicate with HTTPProxyService/HTTPProxyDestination
RemoteObject communicates with RemotingService/RemotingDestination
Producer and Consumer communicate with MessageService/MessageDestination
DataService communicates with DataService/DataDestination
可以分别在如下文件中配置:

RemotingService configured in the remoting-config.xml file
HTTPProxyService configured in the proxy-config.xml file
MessageService configured in the messaging-config.xml file
DataService configured in the data-management-config.xml file
Adapters and assemblers

适配器(Adapters )或者装配器(assemblers )是消息处理链中(message processing chain)的最后一环 。当消息到达正确的destination后,会传递给一个adapter,让它来完成最后的请求 。一些adapters使用assemblers 来进一步打散处理进程(break down the processing)。例如,一个DataDestination可以使用JavaAdapter, 而JavaAdapter使用HibernateAssembler来同Hibernate进行通信。



destinations和adapters/assemblers之间的映射如下:

RemotingDestination uses JavaAdapter
HTTPProxyDestination uses HTTPProxyAdapter or SOAPAdapter
MessageDestination uses ActionScriptAdapter or JMSAdapter
DataDestination uses ASObjectAdapter or JavaAdapter
JavaAdapter uses HibernateAssembler , SQLAssembler , or a custom assembler
About configuration files

我们可以在services-config.xml中配置LCDS,其中services-config.xml的路径在web.xml文件中配置:

Xml代码 
<!-- MessageBroker Servlet --> 
<servlet> 
    <servlet-name>MessageBrokerServlet</servlet-name> 
    <display-name>MessageBrokerServlet</display-name> 
    <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class> 
    <init-param> 
        <param-name>services.configuration.file</param-name> 
        <param-value>/WEB-INF/flex/services-config.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<!-- MessageBroker Servlet -->
<servlet>
<servlet-name>MessageBrokerServlet</servlet-name>
<display-name>MessageBrokerServlet</display-name>
<servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
<init-param>
<param-name>services.configuration.file</param-name>
<param-value>/WEB-INF/flex/services-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet><param-value>/WEB-INF/flex/services-config.xml</param-value>



在services-config.xml文件里有对Remoting Service, Proxy Service, Message Service, and Data Management Service四个文件的引用:

Xml代码 
<services> 
    <service-include file-path="remoting-config.xml" /> 
    <service-include file-path="proxy-config.xml" /> 
    <service-include file-path="messaging-config.xml" /> 
    <service-include file-path="data-management-config.xml" /> 
</services> 

<services>
    <service-include file-path="remoting-config.xml" />
    <service-include file-path="proxy-config.xml" />
    <service-include file-path="messaging-config.xml" />
    <service-include file-path="data-management-config.xml" />
</services>

services-config.xml文件里面还包括一些安全限制定义、channel定义和日志设置。
remoting-config.xml文件:为remote objects定义Remoting Service destinations
proxy-config.xml文件:为web services和HTTP services (REST services)定义Proxy Service destinations
messaging-config.xml文件:为publish subscribe messaging定义Messaging Service destinations
data-management-config.xml文件:定义Data Management Service destinations
Configuration elements

services:

default-channels:给所有的services设置application-level 的缺省channels

service-include:指定定义service的XML文件的路径

属性:file-path:service路径

service:可以在service-include中指定的文件中定义

properties:service的属性,例如proxy-config.xml中的定义

Xml代码 
<properties> 
    <connection-manager> 
        <max-total-connections>100</max-total-connections> 
        <default-max-connections-per-host>2</default-max-connections-per-host> 
    </connection-manager> 
    <allow-lax-ssl>true</allow-lax-ssl> 
</properties> 

<properties>
    <connection-manager>
        <max-total-connections>100</max-total-connections>
        <default-max-connections-per-host>2</default-max-connections-per-host>
    </connection-manager>
    <allow-lax-ssl>true</allow-lax-ssl>
</properties>

adapters:定义各个service所使用的adapters

adapter-definition:

属性:id

属性:class:Java类全名

属性:default:是否为缺省的adapter

default-channels:给该service定义缺省的channels

channel:

属性:ref:所引用的channel的名字,参考remoting-config.xml配置

Xml代码 
<default-channels> 
    <channel ref="my-amf"/> 
</default-channels> 

<default-channels>
    <channel ref="my-amf"/>
</default-channels>

destination:

adapter:包含一个service adapter的引用

properties:remoting-config.xml示例

Xml代码 
<destination id="roleService">   
    <properties> 
        <source>com.adobe.ptp.service.RoleService</source>   
    </properties>   
</destination> 

<destination id="roleService">
    <properties>
    <source>com.adobe.ptp.service.RoleService</source>
    </properties>
</destination> 
channels:messaging-config.xml示例

Xml代码 
<destination id="RandomDataPush"> 
    <channels> 
        <channel ref="my-streaming-amf"/> 
    </channels> 
    <adapter ref="RandomDataPushAdapter"/> 
</destination> 

<destination id="RandomDataPush">
    <channels>
        <channel ref="my-streaming-amf"/>
    </channels>
    <adapter ref="RandomDataPushAdapter"/>
</destination> 
security:

security-constraint:

属性:ref

属性:id

login-command:

属性:ref

security:

security-constraint:

login-command:

属性:class

属性:server

属性:per-client-authentication

channels:示例如下:

Xml代码 
<channel-definition id="my-nio-amf" class="mx.messaging.channels.AMFChannel"> 
    <endpoint url="http://{server.name}:2881/nioamf" class="flex.messaging.endpoints.NIOAMFEndpoint"/> 
    <server ref="my-nio-server"/> 
    <properties> 
        <polling-enabled>false</polling-enabled> 
    </properties> 
</channel-definition> 

<channel-definition id="my-nio-amf" class="mx.messaging.channels.AMFChannel">
    <endpoint url="http://{server.name}:2881/nioamf" class="flex.messaging.endpoints.NIOAMFEndpoint"/>
    <server ref="my-nio-server"/>
    <properties>
        <polling-enabled>false</polling-enabled>
    </properties>
</channel-definition> 
channel-definition:

属性:id

属性:class

endpoint:

属性:url

属性:class

properties:

logging:

target:

属性:class

属性:level

你可能感兴趣的:(Flex)