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

(2)启动Flex页面

点击订阅,将后台的结果动态显示

(3)关闭Servlet中的线程

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

演示完毕!



时间: 2024-10-10 04:18:56

Java+Flex+Blaze推送的相关文章

Java实现iOS推送(利用javapns1.6)

import java.util.HashMap; import java.util.Iterator; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import javapns.back.PushNotificationManager; import javapns.back.SSLConnectionHelper; import javapns.data.Device; impor

AndroidStudio离线打包MUI集成JPush极光推送并在java后端管理推送

1.AndroidStudio离线打包MUI 如何离线打包请参看上篇随笔<AndroidStudio离线打包MUI> 2.集成极光推送 官方文档:https://docs.jiguang.cn/jpush/client/Android/android_guide/ 建议采用 jcenter 自动集成 的方式,手动集成对新手来说容易出错 使用jcenter自动集成的开发者,不需要在项目中添加jar和so,jcenter会自动完成依赖:在AndroidManifest.xml中不需要添加任何JPu

WebSocket实现Java后台消息推送

1.什么是WebSocket WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端. 2.实现原理 在实现websocket连线过程中,需要通过浏览器发出websocket连线请求,然后服务器发出回应,这个过程通常称为“握手” .在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道.两者之间就直接可以数据互相传送. 3.优点 在以前的消息推送

java 融云推送

注:工具类1 public class RongCloudMethodUtil { /** * 获取token * * @param userId * @param name * @param portraitUri */ public static String getToken(String userId, String name, String portraitUri) { String getToken = "https://api.cn.rong.io/user/getToken.js

对接第三方平台JAVA接口问题推送和解决

前言 本节所讲为实际项目中与第三方对接出现的问题最后还是靠老大解决了问题以此作为备忘录,本篇分为三小节,一小节解析Java加密接口数据,二小节解析XML文件需注意问题,最后一节则是请求Java Soap协议接口.因为第三方平台都是采用JAVA语言,所以这种情况应该对大家有所帮助. DES加密/解密Java接口 关于Java中序列化为XML文件就不搞了,我们首先需要讲解的是关于加密问题,由于是第三方是采用的DES加密,所以我们只讲解DES,有很多人可能有疑问了,这不过时了么且不安全,不必纠结,这个

Java Dwr3实现消息推送步骤详解

DWR包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据.另外一方面一个JavaScript库可以帮助网站开发人员轻松地利用获取的数据来动态改变网页的内容,DWR采取了一个类似AJAX的新方法来动态生成基于JAVA类的JavaScript代码.这样WEB开发人员就可以在JavaScript里使用Java代码,就像它们是浏览器的本地代码(客户端代码)一样:但是Java代码运行在WEB服务器端而且可以自由访问WEB 服务器的资源.出于安全的理

极光推送-java消息推送app

1.极光开发者文档:https://docs.jiguang.cn//jpush/client/Android/android_sdk/ 2.简介:JPush是手机端消息推送的免费第三方云平台.手机客户端侧,App 需要集成 JPush SDK,JPush SDK 创建到 JPush Cloud 的长连接,为 App 提供永远在线的能力.服务器端部分,开发者调用 JPush REST API 来进行推送 3.java后台服务器实现极光推送的两种实现方式:https://www.cnblogs.c

atitit.web 推送实现方案集合

atitit.web 推送实现方案集合 1. 俩中模式 Push/Pull 1 2. 须要实现的特性 2 2.1. 推送消息广播. 2 2.2. 推送定向消息. 2 2.3. 提供连接上线前.上线.下线前.下线.发送消息等多种可处理事件. 2 2.4. 消息缓存机制.确保长轮询工作模式下不丢失消息. 2 2.5. client正常下线,服务端可马上感知. 2 2.6. client异常停止工作,服务端可定时检查并感知. 2 2.7. 以注冊通道应用的方式.让开发人员对框架功能进行扩展.实现自己的

用websocket实现后台推送消息

1前台实现 1 connect:function() { 2 var webSocketIP = window.CRM_CONFIG.WebSocketIP; 3 var target = 'ws://'+webSocketIP+'/websocket'; 4 if ('WebSocket' in window) { 5 ws = new WebSocket(target); 6 } else if ('MozWebSocket' in window) { 7 ws = new MozWebSo