本文章适合对blazdes和spring都有所了解的人
1. 实现环境
Web服务器:tomcat6.x
依赖库包:org.springframework.flex-1.0.3.RELEASE.jar,spring的库包(3.0.0.m2版本),
blazds的库包
2. 配置文件
2.1 配置文件结构
2.2 Web.xml
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>SpringDispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-name>SpringDispatcher</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>
2.3 Flex文件夹下配置文件
需要修改的是,如果我们选择的是通道是my-polling-amf,
对应的配置文件内容如下,主意endpoint的url元素的值,如果我们修改web.xml中DispatcherServlet的映射路径,如将
<servlet-name>SpringDispatcher</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>
修改为
<servlet-name>SpringDispatcher</servlet-name>
<url-pattern>/spring/*</url-pattern>
</servlet-mapping>
则endpoint的url修改如下
http://{server.name}:{server.port}/{context.root}/spring/messagebroker/amfpolling
<channel-definitionid="my-polling-amf"class="mx.messaging.channels.AMFChannel">
<endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amfpolling"class="flex.messaging.endpoints.AMFEndpoint"/>
<properties>
<polling-enabled>true</polling-enabled>
<polling-interval-seconds>4</polling-interval-seconds>
</properties>
</channel-definition>
当web服务器不是tomcat时,注意修改serverice-config.xml中<security>的内容
2.4 Spring的中的相关配置
<?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" default-autowire="byName">
<flex:message-broker>
<flex:message-service default-adapter-id="actionscript"default-channels="my-polling-amf"/>
</flex:message-broker>
<flex:message-destination id="topicDestination"
channels="my-polling-amf"
allow-subtopics="true"
subscription-timeout-minutes="3"
subtopic-separator="."/>
<bean id="myConfigProcess"class="com.creaway.util.MessageServiceProcessor"></bean>
</beans>
其中com.creaway.util.MessageServiceProcessor实现代码如下
package com.creaway.util;
importorg.springframework.flex.config.MessageBrokerConfigProcessor;
import flex.messaging.MessageBroker;
/**
* @author zhl
* @qq 40303490
* @date 2013-4-19
*/
public class MessageServiceProcessor implements MessageBrokerConfigProcessor {
@Override
public MessageBroker processAfterStartup(MessageBroker broker){
broker.getServices();
return broker;
}
@Override
public MessageBroker processBeforeStartup(MessageBroker broker){
// TODO Auto-generatedmethod stub
return broker;
}
}
2.5 发布消息的java代码
if(broker==null)
{
broker = MessageBroker.getMessageBroker("_messageBroker");
}
try
{
if(broker!=null)
{
Object messageBody = "messagebody obj";
if(messageBody==null)
{
log.error("主题 "+topic+" 产生消息失败!");
}
else
{
AsyncMessage msg = new AsyncMessage();
msg.setMessageId(UUIDUtils.createUUID());
msg.setDestination(destination);
msg.setHeader(AsyncMessage.SUBTOPIC_HEADER_NAME, topic);
msg.setBody(messageBody);
broker.routeMessageToService(msg, null);
}
}
}
catch(Exception e)
{
e.printStackTrace();
log.error(e.toString());
}
消息发布由MessageBroker的routeMessageToService方法来实现,通过静态方法MessageBroker.getMessageBroker("_messageBroker")获取实例,如果在配置元素<flex:message- broker >中没有指定broker的id名称,默认为_messageBroker
<flex:message-destination id="topicDestination"/>
和 msg.setDestination(destination)中的值一致;
msg.setHeader(AsyncMessage.SUBTOPIC_HEADER_NAME, topic)中的topic和flex前端代码中的订阅主题一致