天天看點

Java+Flex+Blaze推送

在上篇Flex+Java+Blazeds 建立了項目的基礎上,實作Flex訂閱,Java發送消息的推送功能。

一、運作環境:Flex4.6+Jdk1.7+Blazedz某版本+Tomcat6

此處注意,使用的伺服器是Tomcat6,如果使用Tomcat7還存在問題,不能實作推送,在網上查過此問題,有人說換Blazeds4版本可以實作,嘗試過沒有實作,尚待解決。

二、代碼

1、Java端

(1)建立類Person,用于前背景傳輸資料

package com.java;
public class Person {
	private int age;
	private String name;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}	
}
           

(2)建立Servlet——HelloServlet.java,用于調用發送資訊的線程

package com.java;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import flex.messaging.MessageBroker;
import flex.messaging.messages.AsyncMessage;
import flex.messaging.util.UUIDUtils;

public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 6331466335470329744L;
	// 線程
	private static FeedThread thread;

	public HelloServlet() {
		super();
	}

	public void destroy() {
		super.destroy();
	}

	public void init() throws ServletException {
		super.init();
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String cmd = request.getParameter("cmd");
		if (cmd.equals("start")) {
			start();
		}
		if (cmd.equals("stop")) {
			stop();
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		super.doPost(request, response);
	}

	// 啟動監聽
	public void start() {
		if (thread == null) {
			thread = new FeedThread();
			thread.start();
		}
		System.out.println("start!!!");
	}

	// 停止監聽
	public void stop() {
		thread.running = false;
		thread = null;
	}

	// 循環發送消息程序
	public static class FeedThread extends Thread {
		public boolean running = true;
		public void run() {
			// 總是無法擷取msgBroker,web.xml需要有MessageBrokerServlet的配置資訊
			MessageBroker msgBroker = MessageBroker.getMessageBroker(null);
			String clientID = UUIDUtils.createUUID();
			int i = 0;
			while (running) {
				Person person = new Person();
				person.setAge(i);
				person.setName(String.valueOf(i));
				System.out.println(i);
				AsyncMessage msg = new AsyncMessage();
				msg.setDestination("person-data-feed");
				msg.setHeader(AsyncMessage.SUBTOPIC_HEADER_NAME, "person");
				msg.setClientId(clientID);
				msg.setMessageId(UUIDUtils.createUUID());
				msg.setTimestamp(System.currentTimeMillis());
				msg.setBody(person);
				msgBroker.routeMessageToService(msg, null);
				i++;
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {

				}
			}
		}
	}
	
}
           

2、Flex端

(1)建立PersonClient.mxml應用程式,用于訂閱消息

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
	
	<fx:Script>
		<![CDATA[
			import mx.controls.Alert;
			import mx.messaging.ChannelSet;
			import mx.messaging.Consumer;
			import mx.messaging.channels.StreamingAMFChannel;
			import mx.messaging.events.MessageEvent;
			
			import vo.Person;
			protected function button1_clickHandler(event:MouseEvent):void
			{
				var consumer:Consumer=new Consumer();		
				consumer.destination="person-data-feed";		
				consumer.subtopic="person";
				consumer.addEventListener(MessageEvent.MESSAGE,messageHandler);		
				var url:String ="http://localhost:8080/FlexToJava/";		
				var myStreamingAMF:StreamingAMFChannel =  new StreamingAMFChannel(url+"my-streaming-amf",url+"messagebroker/streamingamf"); 
				
				var channelSet:ChannelSet = new ChannelSet();
				channelSet.addChannel(myStreamingAMF);
				consumer.channelSet= channelSet;	
				//consumer.channelSet = newChannelSet(["my-streaming-amf"]); 		
				consumer.subscribe();  //開始接收		
				Alert.show("消費者初始化完畢!");   		
			}
			
			protected function messageHandler(event:MessageEvent):void
			{
				var person:Person=event.message.body as Person;
				this.lb_age.text=person.age.toString();
				this.lb_name.text=person.name;
			}
			
		]]>
	</fx:Script>
	
	<fx:Declarations>
		<!-- 将非可視元素(例如服務、值對象)放在此處 -->
	</fx:Declarations>
	<s:Label id="lb_age" x="113" y="61" text="Label"/>
	<s:Label id="lb_name" x="113" y="81" text="标簽"/>
	<s:Button x="164" y="54" label="訂閱" click="button1_clickHandler(event)"/>
</s:Application>
           

(2)建立Person.as,用于接收背景Person對象

package vo
{
	import mx.rpc.remoting.RemoteObject;
	[RemoteClass(alias="com.java.Person")]  //用于和java背景類轉換alias為java類的命名空間,否則不能轉換
	[Bindable]
	public class Person
	{
		public function Person()
		{
		}
		public var age:int;
		public var name:String;
	}
}
           

3、配置檔案

(1)WebRoot\WEB-INF\flex\messaging-config.xml

增加如下一段代碼

<destination id="person-data-feed">
        <properties>
            <server>
            	<allow-subtopics>true</allow-subtopics>
                <subtopic-separator>.</subtopic-separator>
            </server>
        </properties>
        <channels>
            <channel ref="my-polling-amf" />
            <channel ref="my-streaming-amf" />
        </channels>
    </destination>
           

(2)WebRoot\WEB-INF\flex\services-config.xml

增加如下一段代碼

<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>5000</server-to-client-heartbeat-millis>  
	            <user-agent-settings>    
					<user-agent match-on="MSIE" kickstart-bytes="2048" max-streaming-connections-per-session="8"/>    
					<user-agent match-on="Firefox" kickstart-bytes="2048" max-streaming-connections-per-session="8"/>    
			    </user-agent-settings>  
	         </properties>
</channel-definition>
           

(3)WebRoot\WEB-INF\web.xml

建立Servlet的時候可能會已有,如沒有,增加如下一段代碼

<servlet>
		<description>This is the description of my J2EE component
		</description>
		<display-name>This is the display name of my J2EE component
		</display-name>
		<servlet-name>HelloServlet</servlet-name>
		<servlet-class>com.java.HelloServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>HelloServlet</servlet-name>
		<url-pattern>/HelloServlet</url-pattern>
	</servlet-mapping>
           

4、運作

(1)啟動Servlet中的線程

http://localhost:8080/FlexToJava/HelloServlet?cmd=start

Java+Flex+Blaze推送

(2)啟動Flex頁面

Java+Flex+Blaze推送

點選訂閱,将背景的結果動态顯示

Java+Flex+Blaze推送

(3)關閉Servlet中的線程

http://localhost:8080/FlexToJava/HelloServlet?cmd=stop

Java+Flex+Blaze推送

示範完畢!