zoukankan      html  css  js  c++  java
  • flex+spring3.0+blazds 数据推送整理版

    最近有个项目要使用adobe Air 做客户端,需要用到推送功能,网上找不了少资料,很纠结。基本上没调试成功,即使跑起来了。AIR也接收不到数据,

    花了一上午,调试了网上给的配置。算是修轮子吧。

    blazds官方给了4个配置文件,我只用了3个。(proxy-config.xml被我删了,注意同时删掉services-config.xml 中的<service-include file-path="proxy-config.xml" />)

    messaging-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <service id="message-service" 
        class="flex.messaging.services.MessageService">
    
        <adapters>
            <adapter-definition id="actionscript" class="flex.messaging.services.messaging.adapters.ActionScriptAdapter" default="true" />
            <!-- <adapter-definition id="jms" class="flex.messaging.services.messaging.adapters.JMSAdapter"/> -->
        </adapters>
    
        <default-channels>
            <channel ref="my-polling-amf"/>
            <channel ref="my-streaming-amf" />
        </default-channels>
    </service>

    remoting-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!-- 定义服务,并设置参数 -->
    
    <service id="remoting-service"
    
        class="flex.messaging.services.RemotingService">
    
        <!-- 定义Adapter,将请求转换为java的对象 -->
    
        <adapters>
    
            <adapter-definition id="java-object"
    
            class="flex.messaging.services.remoting.adapters.JavaAdapter"
    
            default="true"/>
    
        </adapters>
    
     
    
        <!-- 服务的默认通道,这个通道是在service-config.xml中定义的 -->
    
        <default-channels>
    
            <channel ref="my-amf"/>
    
        </default-channels>
    
    </service>

    services-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <services-config>
    
        <services>
            <service-include file-path="remoting-config.xml" />
            <service-include file-path="messaging-config.xml" />
        </services>
    
        <security/>
    
        <channels>
            <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"/>
            </channel-definition>
            
            <channel-definition id="my-streaming-amf"  class="mx.messaging.channels.StreamingAMFChannel">  
            <endpoint  url="http://{server.name}:{server.port}/{context.root}/messagebroker/streamingamf"  class="flex.messaging.endpoints.StreamingAMFEndpoint" >
            </endpoint>
            <properties>  
                  <idle-timeout-minutes>0</idle-timeout-minutes>  
                <max-streaming-clients>100</max-streaming-clients>  
                <server-to-client-heartbeat-millis>1000</server-to-client-heartbeat-millis>  
              </properties>
            </channel-definition>
            
             <channel-definition id="my-secure-amf" class="mx.messaging.channels.SecureAMFChannel">
                <endpoint url="https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure" class="flex.messaging.endpoints.SecureAMFEndpoint"/>
                <properties>
                    <add-no-cache-headers>false</add-no-cache-headers>
                </properties>
            </channel-definition>
    
            <channel-definition id="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>
            
        </channels>
    
        <logging>
            <target class="flex.messaging.log.ConsoleTarget" level="Info">
                <properties>
                    <prefix>[BlazeDS] </prefix>
                    <includeDate>false</includeDate>
                    <includeTime>false</includeTime>
                    <includeLevel>false</includeLevel>
                    <includeCategory>false</includeCategory>
                </properties>
                <filters>
                    <pattern>Endpoint.*</pattern>
                    <pattern>Service.*</pattern>
                    <pattern>Configuration</pattern>
                </filters>
            </target>
        </logging>
    
        <system/>
    
    </services-config>

    web.xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app>
    
        <display-name>Spring and Flex</display-name>
        <description>Spring and Flex</description>
    
        <servlet>
            <servlet-name>dispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
     
        <servlet>
            <servlet-name>RDSDispatchServlet</servlet-name>
            <display-name>RDSDispatchServlet</display-name>
            <servlet-class>flex.rds.server.servlet.FrontEndServlet</servlet-class>
            <init-param>
                <param-name>useAppserverSecurity</param-name>
                <param-value>false</param-value>
            </init-param>
            <init-param>
                <param-name>messageBrokerId</param-name>
                <param-value>_messageBroker</param-value>
            </init-param>       
                    
            <load-on-startup>2</load-on-startup>
        </servlet>
    
        <servlet-mapping id="RDS_DISPATCH_MAPPING">
            <servlet-name>RDSDispatchServlet</servlet-name>
            <url-pattern>/CFIDE/main/ide.cfm</url-pattern>
        </servlet-mapping>
    
        <servlet-mapping>
            <servlet-name>dispatcherServlet</servlet-name>
            <url-pattern>/messagebroker/*</url-pattern>
        </servlet-mapping>
        
    
     
       <welcome-file-list>
             <welcome-file>index.jsp</welcome-file>
     </welcome-file-list>
    
    
    </web-app>

    spring 配置

    dispatcherServlet-servlet.xml

    <?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"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/flex 
            http://www.springframework.org/schema/flex/spring-flex-1.0.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    
         
         <flex:message-destination id="simple-feed" /> 
        <flex:message-broker>
            <flex:remoting-service default-channels="my-amf"/>
            <flex:message-service default-channels="my-streaming-amf" />
        </flex:message-broker>
    
        <bean id="simpleFeedStarter" class="包路径.SimpleFeed" init-method="start">
            <constructor-arg ref="defaultMessageTemplate" />
        </bean>
    
        <bean id="defaultMessageTemplate" class="org.springframework.flex.messaging.MessageTemplate" />
        <context:annotation-config />
        <context:component-scan base-package="com" />
        
    </beans>

    SimpleFeed类

    import java.util.Random;
    
    import org.springframework.flex.messaging.MessageTemplate;
    
    public class SimpleFeed {
    
        private static FeedThread thread;
    
        private final MessageTemplate template;
    
        public SimpleFeed(MessageTemplate template) {
            this.template = template;
        }
    
        public void start() {
            if (thread == null) {
                thread = new FeedThread(this.template);
                thread.start();
            }
        }
    
        public void stop() {
            thread.running = false;
            thread = null;
        }
    
        public static class FeedThread extends Thread {
    
            public boolean running = false;
    
            private final MessageTemplate template;
    
            public FeedThread(MessageTemplate template) {
                this.template = template;
            }
    
            @Override
            public void run() {
                this.running = true;
                Random random = new Random();
                double initialValue = 35;
                double currentValue = 35;
                double maxChange = initialValue * 0.005;
    
                while (this.running) {
                    double change = maxChange - random.nextDouble() * maxChange * 2;
                    double newValue = currentValue + change;
    
                    if (currentValue < initialValue + initialValue * 0.15 && currentValue > initialValue - initialValue * 0.15) {
                        currentValue = newValue;
                    } else {
                        currentValue -= change;
                    }
    
                    this.template.send("simple-feed", new Double(currentValue));
    
                    System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxx" + currentValue);
    
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                    }
    
                }
            }
        }
    
    }

    SpringPush.mxml

    <?xml version="1.0" encoding="utf-8"?>
    <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
          xmlns:s="library://ns.adobe.com/flex/spark" 
          xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="windowedapplication1_creationCompleteHandler(event)">
     
     <fx:Script>
      <![CDATA[
       import mx.controls.Alert;
       import mx.events.FlexEvent;
       import mx.messaging.events.ChannelFaultEvent;
       import mx.messaging.events.MessageEvent;
       import mx.messaging.events.MessageFaultEvent;
       import mx.messaging.messages.IMessage;
       
       private function messageHandler(message:IMessage):void
       {
        Alert.show("sss");
        pushedValue.text = "sss:"+ message.body; 
       }
       
       protected function consumer_faultHandler(event:MessageFaultEvent):void
       {
        Alert.show("MessageFaultEvent:"+event.message.faultString);
        
       }
       
       protected function consumer_channelFaultHandler(event:ChannelFaultEvent):void
       {
        Alert.show("服务端链接关闭");
        
       }
       
       protected function consumer_messageHandler(event:MessageEvent):void
       {
        pushedValue.text = "sss:"+ event.message.clientId;
        
       }
       
       protected function windowedapplication1_creationCompleteHandler(event:FlexEvent):void
       {
        consumer.subscribe();
        
       }
       
      ]]>
     </fx:Script>
     
     <fx:Declarations>
      <s:ChannelSet id="cs">
       <s:StreamingAMFChannel url="http://localhost:8080/flex/messagebroker/streamingamf"/>
      </s:ChannelSet>
      <s:Consumer id="consumer" destination="simple-feed" channelSet="{cs}" 
         message="consumer_messageHandler(event)" fault="consumer_faultHandler(event)" channelFault="consumer_channelFaultHandler(event)"/>
     </fx:Declarations>
     
     <s:TextInput id="pushedValue" width="250" verticalCenter="0" horizontalCenter="0"/>
     
     <s:Button label="Subscribe" click="consumer.subscribe()" enabled="{!consumer.subscribed}" verticalCenter="30" horizontalCenter="-50"/>
     <s:Button label="Unsubscribe" click="consumer.unsubscribe()" enabled="{consumer.subscribed}" verticalCenter="30" horizontalCenter="50"/>
     
    </s:WindowedApplication>

     相关依赖jar下载地址

    https://files.cnblogs.com/montya/lib.part1.rar

    https://files.cnblogs.com/montya/lib.part2.rar
    https://files.cnblogs.com/montya/lib.part3.rar
    https://files.cnblogs.com/montya/lib.part4.rar

  • 相关阅读:
    关于IIS的IUSER和IWAM帐户
    sql server 提取汉字/数字/字母的方法
    SQlserver创建函数实现只取某个字段的数字部分
    SQL中 EXCEPT、INTERSECT用法
    SQL中EXCEPT和Not in的区别?
    生成本月日历
    SQL打印全年日历
    SQL语句添加删除修改字段[sql server 2000/2005]
    SQL数据是否存在(是否有数据)判断,表,存储过程是否存在
    SQL时间相关
  • 原文地址:https://www.cnblogs.com/montya/p/2547638.html
Copyright © 2011-2022 走看看