您的位置:首页 > 编程语言 > Java开发

Spring flex 搭建服务 之 架构原理(BlazeDS)和服务配置方法 (第一章)

2011-11-04 11:14 501 查看
下面的内容是Spring BlazeDS 和flex的原理性问题,如果您实在搞不懂,也并不影响你使用Spring和flex架构,只是有时你可能不了解那些配置文档说的是什么意思而已。

Flex要想与Spring进行配合使用,需要一个附加的组件BlazeDS。BlazeDS可以将Flex前端的通信内容(amf 格式 Action Message format,一种flex定义的通信规则)转换为java的相关类和对象。

请求处理的简单流程是,flex客户端向服务器发送Request请求,服务器根据Web.xml中的映射,找到Spring配置文档中与flex相关的配置,这个配置就是MessageBroker,MessageBroker是Spring容器根据flex的services-config.xml文件生成的,在services-config.xml中指定了消息通道,Spring将请求交给这个通道(一般是默认通道),通道根据Remoting-config.xml中配置的remoting-service和Adapter将flex的amf转换为java的实例信息。如果需要安全或者消息订阅(jms)还需要提供messaging-config.xml和prox-config.xml配置文件。

所以目录结构大概应该是这样的:





在Spring中使用BlazeDS

1. 简介

结合使用Spring和BlazeDS必须对MessageBroker进行配置。从flex客户端发来的Http 消息(messages)通过Spring的DispatcherServlet(在web.xml中配置)传递给Spring管理的MessageBroker(在Spring的配置文档中指明)。如果使用Spring管理的MessageBroker就不必配置BlazeDS的MessageBrokerServlet(在web.xml文档中指明)了。

Flex通过AMF通道的形式进行通信的,所谓的AMF通道就是指一种编码形式。MessageBroker可以将Flex格式的请求转换成具体的java的调用,并将反馈回的内容(response)编码成Flex能够识别的对象(amf)。

2. 在Spring中配置DispatchServlet

Spring的分发器(DispatchServlet)需要在Web.xml中进行配置,在Web容器启动的时候会创建Spring的上下文环境(Context即WebApplicationContext)。配置如下:

<?xml version="1.0" encoding="UTF-8"?>

<!--
The front controller of this Spring Web application, responsible for handling all application requests -->

<servlet>

<servlet-name>Spring
MVC Dispatcher Servlet</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<!-- 配置Spring的DispatcherServlet
-->

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/config/web-application-config.xml</param-value>

<!-- 指明了Spring的配置文件的位置 -->

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

3. 在Spring中的配置MessageBroker

在Spring的WebApplicationContext中包含了简单的MessageBroker命名空间相关的信息,对Spring的配置文档中添加相应的schema
location才能使用。下面给出一个典型的配置。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:flex="http://www.springframework.org/schema/flex"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/flex http://www.springframework.org/schema/flex/spring-flex-1.0.xsd">
...

</beans>

在后面的有关Spring配置文档中都会省略命名空间的声明信息,你需要在你的工程中,根据实际情况添加相应的命名空间。

现在,需要在Spring的WebApplicationContext中配置MessageBrokerFactoryBean,引导MessageBroker的初始化。同时,MessageBrokerHandlerAdapter和相应的HandlerMapping(一般情况下采用默认的SimpleUrlHandlerMapping)将传入的请求(Request)传递给Spring管理的MessageBroker。

在Spring的bean定义文件中(一般就是Spring的配置文件)使用message-broker标签完成MessageBroker的注册。如下:

<flex:message-broker/>

通过上述的message-broker标签进行的配置,Spring会生成相应的MessageBroker和相关的支撑结构。这些支撑结构是通过默认的配置文件生成的。可以通过使用message-broker标签中的相关属性重新指定这些支撑结构。例如,在默认情况下,BlazeDS的配置文档为/WEB-INF/flex/services-config.xml,可以通过message-broker的services-config-path属性进行重新指定。MessageBrokerFactoryBean使用的是Spring
ResourceLoader的默认目录,所以可以使用Spring
resource的路径来指导BlazeDS的配置文件位置。例如下面配置:

<flex:message-broker services-config-path="classpath*:services-config.xml"/>

当然还有另外一种Spring风格的MessageBrokerFactoryBean的定义方式,如下:

<!--
Bootstraps and exposes the BlazeDS MessageBroker -->

<bean id="_messageBroker"class="org.springframework.flex.core.MessageBrokerFactoryBean" >

<property name="servicesConfigPath" value="classpath*:services-config.xml" />

</bean>

注意,上例中为MessageBrokerFactoryBean指定了客户调用的id,实际这个id是没有实际意义的,因为客户或者后续程序根本用不到这个id。除非在你的WebApplicationContext中存在多于一个的MessageBroker。

4. 为MessageBroker映射请求(Requests)

为了使相应的Requests提交给Spring管理的MessageBroker处理,需要在配置文档的三个部分进行映射。

1. 在Web.xml中提供DispatchServlet的映射

2. 在Spring的配置文档中(WebApplicationContext)提供HandlerMapping。

3. 在BlazeDS的配置文档中(services-config.xml)提供Channel(通道)的定义。

最简单的情况是,Spring的客户端仅有Flex构成,这时只需要映射/messagebroker作为请求的顶级路径即可。Web.xml中配置如下:

<!--
Map all /messagbroker requests to the DispatcherServlet for handling -->

<servlet-mapping>

<servlet-name>Spring
MVC Dispatcher Servlet</servlet-name>

<url-pattern>/messagebroker/*</url-pattern>

</servlet-mapping>

当在Spring的配置文档中使用message-broker标签时,Spring会创建一个SimpleUrlHandlerMapping对象,在默认情况下这个对象使用/*对提交给Spring的所有请求进行处理。这种默认的方式可以通过映射重写的方式进行修改。可以使用message-broker的disable-default-Mapping属性。然后根据具体情况配置相应的HandlerMapping和HandlerAdapter。如下:

<!--
Maps request paths at /* to the BlazeDS MessageBroker -->

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

<property name="mappings">

<value>

/*=_messageBroker

</value>

</property>

</bean>

<!--
Dispatches requests mapped to a MessageBroker -->

<bean class="org.springframework.flex.servlet.MessageBrokerHandlerAdapter"/>

在BlazeDS的配置文件services-config.xml中定义的通道必须与相应的映射相对应。

<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">

<endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf"

class="flex.messaging.endpoints.AMFEndpoint"/>

<properties>

<polling-enabled>false</polling-enabled>

</properties>

</channel-definition>

4. Flex和其它形式的客户端同时使用Spring

在某些情况下,一个服务程序可能使用多于一种类型的客户端(比如Struts和flex,下面举例为flex和Spring自身的mvc)。

最简单的方法是生成多个DispatcherServlet。例如下面的web.xml配置:

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>

/WEB-INF/spring/*-context.xml

<!-- 加载所有的DispatcherServlet的配置文件 -->

</param-value>

</context-param>

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

<!-- 定义一个Spring的WebLoader监听器 -->

</listener>

<servlet>

<servlet-name>flex</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<!-- 为flex类型的客户端定义一个DispatcherServlet,并且映射/messagebroker开始的请求 -->

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>flex</servlet-name>

<!-- 映射flex类型客户端的请求 -->

<url-pattern>/messagebroker/*</url-pattern>

</servlet-mapping>

<servlet>

<servlet-name>spring-mvc</servlet-name>

<!-- 定义Spring
MVC类型的客户端的DispatcherServlet,并映射以/spring开始的请求 -->

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>spring-mvc</servlet-name>

<!-- 映射Spring
MVC客户端的请求 -->

<url-pattern>/spring/*</url-pattern>

</servlet-mapping>

通过一组文件指定(这组文件以-context.xml为后缀,并且包含在/WEB-INF/spring/目录下)。Flex相关的设置将会放在(按照惯例)/WEB-INF/flex-Servlet.xml文件中,与Spring
MVC相关的controllers的相关配置将被放在/WEB-INF/spring-mvc-servlet.xml文件中。这样配置的好处是可以分离关注点,并且可以使用Spring2.5+标记的controllers使用它们的默认配置。

5. 将Spring
Beans暴露给远程的flex

使用Spring管理的MessageBroker,Spring
Beans可以很容易的直接被远程flex客户端调用。MessageBroker透明的处理Flex
AMF数据和java数据间的串行化和反串行化。

6. 配置远程服务

BlazeDS远程服务配置通常在Remoting-config.xml文件中进行配置。Remoting-config.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>

<service id="remoting-service"

class="flex.messaging.services.RemotingService">

<adapters>

<adapter-definition id="java-object"

<!-- 这个适配器将flex的amf转换成java对象 -->

class="flex.messaging.services.remoting.adapters.JavaAdapter"

default="true"/>

</adapters>

<default-channels>

<channel ref="my-amf"/>

</default-channels>

</service>

7. 通过标记将Spring定义的Beans暴露给远程

@RemotingDestionation指明通道,一般不需要特殊指定

@RemotingInclude和@RemotiongExclude分别指出远程可见和不可见方法。

例如:

import org.springframework.flex.remoting.RemotingInclude;

import org.springframework.stereotype.Service;

@Service("productService")

@RemotingDestination(channels={"my-amf","my-secure-amf"})

public class ProductServiceImpl implements ProductService {

@RemotingInclude

public Product read(String
id) {

...

}

@RemotingExclude

public Product create(Product product){

...

}

@RemotingInclude

public Product update(Product product){

...

}

@RemotingExclude

public void delete(Product product)
{

...

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: