在上篇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

(2)啟動Flex頁面
點選訂閱,将背景的結果動态顯示
(3)關閉Servlet中的線程
http://localhost:8080/FlexToJava/HelloServlet?cmd=stop
示範完畢!