LiveCycle Data Services ES architecture
LiveCycle Data Services ES client architecture
Flex components
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 里有相关配置
<!-- 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 文件里
<!-- 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 )的消息格式。
<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:
services 是Flex组件消息的目标 。而destinations 可以看成是一个service的实例 。例如一个RemoteObject同RemotingService通信:在RemoteObject中,你必须指定一个destination的id属性,就是你要引用的方法的地址。Flex客户端组件和LCDS的services之间的映射如下:
可以分别在如下文件中配置:
Adapters and assemblers
适配器(Adapters )或者装配器(assemblers )是消息处理链中(message processing chain)的最后一环 。当消息到达正确的destination后,会传递给一个adapter,让它来完成最后的请求 。一些adapters使用assemblers 来进一步打散处理进程(break down the processing)。例如,一个DataDestination可以使用JavaAdapter, 而JavaAdapter使用HibernateAssembler来同Hibernate进行通信。
destinations和adapters/assemblers之间的映射如下:
About configuration files
我们可以在services-config.xml中配置LCDS,其中services-config.xml的路径在web.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>
<param-value>/WEB-INF/flex/services-config.xml</param-value>
在services-config.xml文件里有对Remoting Service, Proxy Service, Message Service, and Data Management Service四个文件的引用:
<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>
Configuration elements
services:
default-channels:给所有的services设置application-level 的缺省channels
service-include:指定定义service的XML文件的路径
属性:file-path:service路径
service:可以在service-include中指定的文件中定义
properties:service的属性,例如proxy-config.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>
adapters:定义各个service所使用的adapters
adapter-definition:
属性:id
属性:class:Java类全名
属性:default:是否为缺省的adapter
default-channels:给该service定义缺省的channels
channel:
属性:ref:所引用的channel的名字,参考remoting-config.xml配置
<default-channels> <channel ref="my-amf"/> </default-channels>
destination:
adapter:包含一个service adapter的引用
properties:remoting-config.xml示例
<destination id="roleService"> <properties> <source>com.adobe.ptp.service.RoleService</source> </properties> </destination>
channels:messaging-config.xml示例
<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:示例如下:
<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