1.组件使用方法
a.添加对组件所在文件夹的引用xmlns:message="messageGroup.*"
b.在页面添加组件
<message:MessageGroupPackage/>
c.flex配置文件
远程调用方法:
remoting-config.xml
里面添加
<destination id="myMessage">
<properties>
<source>com.service.message.MessageBox</source>
</properties>
</destination>
消息推送配置: messaging-config.xml 里面添加<destination id="MessageServer"> <channels> <channel ref="my-streaming-amf" /> </channels> </destination>
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"/> </channel-definition>
d.添加后台需要的类文件
/FlexAppToJava/src/com/service/message/MessageBox.javapackage com.service.message; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; public class MessageBox { // private static List<String> message=new ArrayList<String>(); // public static List<String> allmessage=new ArrayList<String>(); // public static List<String> newmessage=new ArrayList<String>(); // public static Vector<String> newmessage=new Vector<String>(); private static MessagePushServer messagePushServer; //发送新消息 public void sendMessage(String mess){ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time=formatter.format(new Date()); // message.add(time+":\n "+mess); // message.add(0, time+":\n "+mess); System.out.println("收到消息:"+mess); MessageData.getInstance().newmessage.add(time+":\n "+mess); } //获得所有消息 public List<String> getMessage(){ if(messagePushServer==null){ messagePushServer=new MessagePushServer(); } List<String> message=MessageData.getInstance().allmessage; System.out.println("返回消息数:"+message.size()); return message; } //清空所有消息 public void clearMessage(){ List<String> message=MessageData.getInstance().allmessage; message.clear(); System.out.println("消息清空成功"); } }
/FlexAppToJava/src/com/service/message/MessageData.javapackage com.service.message; import java.util.ArrayList; import java.util.List; import java.util.Vector; /** * 数据类 * @author acer */ public class MessageData { private static MessageData messageData; public Vector<String> newmessage=new Vector<String>(); public List<String> allmessage=new ArrayList<String>(); private MessageData(){ } public static MessageData getInstance(){ if(messageData==null){ messageData=new MessageData(); } return messageData; } }
/FlexAppToJava/src/com/service/message/MessagePushServer.javapackage com.service.message; import java.util.List; import java.util.Vector; public class MessagePushServer { private MessageTemplate template; public static boolean running = true; private static DataGenerator thread; public MessagePushServer() { System.out.println("调用"); //初始化方法 if(template==null){ template=new MessageTemplate(); } start();//启动推服务 } public MessagePushServer(Vector<String> newmessage) { System.out.println("调用"); //初始化方法 if(template==null){ template=new MessageTemplate(); } start(newmessage);//启动推服务 } private void start(Vector<String> newmessage) { if (thread == null) { thread = new DataGenerator(this.template,newmessage); thread.start(); } } public void start() { if (thread == null) { thread = new DataGenerator(this.template); thread.start(); } } public void stop() { running = false; thread = null; } /** * */ public static class DataGenerator extends Thread { private MessageTemplate template; private Vector<String> newmessage; private List<String> allmessage; public DataGenerator() { super(); } public DataGenerator(MessageTemplate template) { super(); this.template = template; } public DataGenerator(MessageTemplate template, Vector<String> newmessage) { super(); this.template = template; this.newmessage=newmessage; } public void run() { System.out.println("开始推送消息。。。"); while (running) { try { newmessage=MessageData.getInstance().newmessage; allmessage=MessageData.getInstance().allmessage; //循环需要推送的消息 for(int k=0;k<newmessage.size();k++){ String messageDate=newmessage.firstElement(); template.send(messageDate); System.out.println("推送消息"+messageDate); newmessage.remove(messageDate); allmessage.add(0,messageDate); } } catch (Exception e) { System.out.println("结束推送消息。。。"); running=false; e.printStackTrace(); try { Thread.sleep(1000); } catch (InterruptedException ie) { ie.printStackTrace(); running=false; } } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); running=false; } } } } }
/FlexAppToJava/src/com/service/message/MessageTemplate.java
package com.service.message; import flex.messaging.MessageBroker; import flex.messaging.messages.AsyncMessage; import flex.messaging.util.UUIDUtils; public class MessageTemplate { private String defaultDestination="MessageServer";//订阅号 private String clientId; private MessageBroker msgBroker; public void send(Object body) { send(this.defaultDestination, body); } public void send(String destination, Object body) { AsyncMessage message = new AsyncMessage(); message.setClientId(getmyClientId()); message.setMessageId(UUIDUtils.createUUID()); message.setTimestamp(System.currentTimeMillis()); message.setDestination(destination); message.setBody(body); getMessageBroker().routeMessageToService(message, null); } private String getmyClientId() { if(clientId==null){ clientId=UUIDUtils.createUUID(); } return clientId; } private MessageBroker getMessageBroker() { if(msgBroker==null){ msgBroker = MessageBroker.getMessageBroker(null); } return msgBroker; } }
组件代码/FlexAppToJava/flex_src/messageGroup/MessageGroupPackage.mxml<?xml version="1.0" encoding="utf-8"?> <s:Group 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="group1_creationCompleteHandler(event)" width="400" height="300"> <s:layout> <s:BasicLayout/> </s:layout> <fx:Script> <![CDATA[ import flash.utils.setInterval; import flash.utils.setTimeout; import mx.collections.ArrayCollection; import mx.events.FlexEvent; import mx.messaging.ChannelSet; import mx.messaging.channels.StreamingAMFChannel; import mx.messaging.events.MessageEvent; import mx.rpc.events.ResultEvent; protected function button1_clickHandler(event:MouseEvent):void { var sendText:String=myname.text+"说:"+messageSend.text; messageSend.text=""; messageServer.sendMessage(sendText); } // private var reciveMessage:String; private function sendMessHandler(event:ResultEvent):void{ // Alert.show("发送成功"); // reflashMessage();//刷新消息 } private function reciveMessageHandler(event:ResultEvent):void{ var array:ArrayCollection=event.result as ArrayCollection; var reciveMessage:String=""; for each(var str:String in array){ reciveMessage+=str+"\n"; } messageShow.text=reciveMessage; // Alert.show("接受成功"+array.length); } protected function button2_clickHandler(event:MouseEvent):void { messageServer.clearMessage();//清空消息申请 } private function clearMessage(event:ResultEvent):void{ messageShow.text=""; } /** * 刷新消息 **/ private function reflashMessage():void{ messageServer.getMessage(); } protected function group1_creationCompleteHandler(event:FlexEvent):void { // setInterval(reflashMessage,1000); reflashMessage(); addMessagePush(); } public function addMessagePush():void{ var myStreamingAMF:StreamingAMFChannel=new StreamingAMFChannel(); myStreamingAMF.uri="http://localhost:8088/FlexAppToJava/messagebroker/streamingamf"; var channelSet:ChannelSet=new ChannelSet(); channelSet.addChannel(myStreamingAMF); consumer.channelSet=channelSet; consumer.subscribe(); } public function messageHandler(event:MessageEvent):void { messageShow.text=event.message.body+"\n"+messageShow.text; // textArea.text = event.message.body+textArea.text; trace("server push data to client.............."); } ]]> </fx:Script> <fx:Declarations> <!-- 将非可视元素(例如服务、值对象)放在此处 --> <s:RemoteObject destination="myMessage" id="messageServer" endpoint="http://localhost:8088/FlexAppToJava/messagebroker/streamingamf"> <s:method name="sendMessage" result="sendMessHandler(event)"/> <s:method name="getMessage" result="reciveMessageHandler(event)"/> <s:method name="clearMessage" result="clearMessage(event)"/> </s:RemoteObject> <mx:Consumer id="consumer" destination="MessageServer" message="messageHandler(event)"/> </fx:Declarations> <s:VGroup> <s:TextArea id="messageShow" height="200"/> <s:HGroup> <s:TextInput id="myname" width="60"/> <s:TextInput id="messageSend" width="{messageShow.width-myname.width}"/> </s:HGroup> <s:HGroup> <s:Button label="发送" click="button1_clickHandler(event)" /> <s:Button label="清空" click="button2_clickHandler(event)" /> </s:HGroup> </s:VGroup> </s:Group>
运行后效果