java后台 flex前台例子_flex+blazeds+java后台消息推送(简单示例)

现在有个问题需要大家思考一下,有个已经上线了的项目,有好好几千甚至上万的客户在使用了。现在项目开发商想发布一个通知。在今天下午6点需要重新启动服务器,想让在线的人在在预定的时间内都收到消息,让大家做好相应的准备,大家会怎么做?

1、逐个打电话

2、在前台弄一个定时器,每隔一定的时间刷新一次

3、后台消息主动往前台推送

相信你已经做出选择了。。。呵呵 ,下面讲一个简单的例子,

首先,新建一个web项目,添加开发flex需要的jar包,和blazeds相关文件,然后把web项目转成flex项目(不明白怎么弄没事,过几天会写一篇这样的文章),然后修改一下services-config.xml和messaging-config.xml文件,添加如下代码

services-config.xml

1.  

2.   id="my-streaming-amf"

3.   class="mx.messaging.channels.StreamingAMFChannel">

4.  

5.   url="http://{server.name}:{server.port}/{context.root}/messagebroker/streamingamf"

6.   class="flex.messaging.endpoints.StreamingAMFEndpoint"

7.   />

8.  

9.   0

10.  10

11.  5000

12. 

13. 

14. 

15.  match-on="MSIE"

16.  kickstart-bytes="2048"

17.  max-streaming-connections-per-session="1"

18.  />

19. 

20.  kickstart-bytes="2048"

21.  max-streaming-connections-per-session="1"

22.  />

23. 

24. 

25. 

复制代码

messaging-config.xml

1.  

2.   id="tick-data-feed">

3.  

4.  

5.   true

6.   .

7.  

8.  

9.  

10. 

11.  ref="my-polling-amf" />

12. 

13.  />

14. 

15. 

复制代码

OK,完了之后,我们新建一个servlet作为服务端

1.   package com.serverpush;

2.

3.   import java.io.IOException;

4.   import

5.   javax.servlet.ServletException;

6.   import

7.   javax.servlet.http.HttpServlet;

8.   import

9.   javax.servlet.http.HttpServletRequest;

10.  import

11.  javax.servlet.http.HttpServletResponse;

12.

13.  import

14.  com.model.Tick;

15.

16.  import flex.messaging.MessageBroker;

17.  import

18.  flex.messaging.messages.AsyncMessage;

19.  import

20.  flex.messaging.util.UUIDUtils;

21.

22.  /**

23.  * Servlet implementation class

24.  TickCacheServlet

25.  */

26.  public class TickCacheServlet extendsHttpServlet

27.  {

28.  private static final long serialVersionUID= 1L;

29.  private static

30.  FeedThread thread;

31.

32.  /**

33.  * @see

34.  HttpServlet#HttpServlet()

35.  */

36.  public TickCacheServlet() {

37.  super();

38.  //

39.  TODO Auto-generated constructor stub

40.  }

41.

42.  /**

43.  * @see

44.  HttpServlet#doGet(HttpServletRequestrequest, HttpServletResponse

45.  *

46.  response)

47.  */

48.  protected void doGet(HttpServletRequest

49.  request,

50.  HttpServletResponse response) throwsServletException, IOException

51.  {

52.  //接收前台参数

53.  String cmd =request.getParameter("cmd");

54.  if

55.  (cmd.equals("start")) {

56.  start();

57.  }

58.  if (cmd.equals("stop"))

59.  {

60.  stop();

61.  }

62.  }

63.

64.  public void start() {

65.  if (thread == null)

66.  {

67.  thread = new

68.  FeedThread();

69.  thread.start();

70.  }

71.  System.out.println("start!!");

72.  }

73.

74.  public

75.  void stop() {

76.  thread.running = false;

77.  thread = null;

78.  }

79.

80.  /**

81.  *

82.  @see HttpServlet#doPost(HttpServletRequestrequest, HttpServletResponse

83.  *

84.  response)

85.  */

86.  protected void doPost(HttpServletRequest

87.  request,

88.  HttpServletResponse response) throwsServletException, IOException

89.  {

90.  doGet(request, response);

91.  }

92.  //线程类,每隔多长时间发送一次

93.  public static class

94.  FeedThread extends Thread {

95.  public boolean running = true;

96.  public void

97.  run() {

98.  MessageBroker msgBroker =

99.  MessageBroker.getMessageBroker(null);

100. String clientID =

101. UUIDUtils.createUUID();

102. int i = 0;

103. while (running) {

104. Tick tick = new

105. Tick();

106. tick.setMessageCN("今天下午6点更新程序需重启服务器");

107. tick.setSeqNo(String.valueOf(i));

108. System.out.println(i);

109.

110. AsyncMessage

111. msg = new

112. AsyncMessage();

113. msg.setDestination("tick-data-feed");

114. msg.setHeader("DSSubtopic",

115. "tick");

116. msg.setClientId(clientID);

117. msg.setMessageId(UUIDUtils.createUUID());

118. msg.setTimestamp(System.currentTimeMillis());

119. msg.setBody(tick);

120. msgBroker.routeMessageToService(msg,

121. null);

122. i++;

123. try {

124. Thread.sleep(2000);

125. } catch (InterruptedException

126. e) {

127. }

128. }

129. }

130. }

131. }

复制代码

在新建一个model用来保存消息

1.   package com.model;

2.

3.   public class Tick {

4.   private String

5.   seqNo;

6.   private String messageCN;

7.

8.   public String getMessageCN()

9.   {

10.  return messageCN;

11.  }

12.

13.  public void setMessageCN(String messageCN)

14.  {

15.  this.messageCN = messageCN;

16.  }

17.

18.  public String getSeqNo()

19.  {

20.  return seqNo;

21.  }

22.

23.  public void setSeqNo(String seqNo)

24.  {

25.  this.seqNo = seqNo;

26.  }

27.  }

复制代码

后台就搞定了。下面看前台

新建一个mxml文件和一个VO文件

mxml:

1.   <?xml version="1.0"

2.   encoding="utf-8"?>

3.  

4.   xmlns:fx="http://ns.adobe.com/mxml/2009"

5.   xmlns:s="library://ns.adobe.com/flex/spark"

6.   xmlns:mx="library://ns.adobe.com/flex/mx"

7.   minWidth="955"

8.   minHeight="600">

9.  

10. 

11. 

12.

13. 

14. 

15.  import

16.  mx.controls.Alert;

17.  import mx.messaging.ChannelSet;

18.  import

19.  mx.messaging.Consumer;

20.  import

21.  mx.messaging.events.MessageEvent;

22.

23.  protected function

24.  submsg():void

25.  {

26.  Alert.show("click start");

27.  var consumer:Consumer = new

28.  Consumer();

29.  consumer.destination ="tick-data-feed";

30.  consumer.subtopic =

31.  "tick";

32.  consumer.channelSet = new

33.  ChannelSet(["my-streaming-amf"]);

34.  //添加message的监听,当后台有消息发送时,调用messageHandler

35.

36.  consumer.addEventListener(MessageEvent.MESSAGE,messageHandler);

37.

38.  consumer.subscribe();

39.  }

40.  private function

41.  messageHandler(event:MessageEvent):void

42.  {

43.  var tick:TickVO =

44.  event.message.body as TickVO;

45.  txtTick.text = tick.messageCN+tick.seqNo;

46.

47.  }

48.

49.

50.  ]]>

51. 

52.

53. 

54. 

56. 

57. 

58.  x="32"

59.  y="43"

60.  width="362"

61.  height="302"

62.  layout="absolute"

63.  title="Watch

64.  Tick">

65. 

66.  x="72"

67.  y="43"

68.  text="Label"

69.  id="txtTick"/>

70. 

71.  x="132"

72.  y="71"

73.  label="Button"

74.  click="submsg()"/>

75. 

76. 

复制代码

VO,就是对应后台的model

1.   package

2.   {

3.   //远程到后台的Tick,也就是说他们俩现在是对应的关系了,你在后台给model赋值了,在前台flex中就可以通过VO

4.   //取得model中的值

5.   [RemoteClass(alias="com.model.Tick")]

6.

7.   [Bindable]

8.   public class TickVO

9.   {

10.  private var

11.  _seqNo:String;

12.  private var _messageCN:String;

13.

14.  public function

15.  TickVO()

16.  {

17.

18.  }

19.  public function get seqNo():String

20.  {

21.  return

22.  _seqNo;

23.  }

24.

25.  public function setseqNo(value:String):void

26.  {

27.  _seqNo

28.  = value;

29.  }

30.

31.  public function get messageCN():String

32.  {

33.  return

34.  _messageCN;

35.  }

36.

37.  public function set

38.  messageCN(value:String):void

39.  {

40.  _messageCN =

41.  value;

42.  }

43.

44.

45.  }

46.  }

复制代码

ok,下面开始测试:运行mxml,界面如下

点击button,启动监听。

然后在浏览器中输入:http://localhost:8080/serverPush/TickCacheServlet?cmd=start,表示现在我要发消息了,当你运行了这个之后看看你刚才的那个mxml是不是有变化啦

稍后奉上flex+blazeds+spring+java后台消息推送(这个稍微麻烦点),有些配置不同了

flex+blazeds+java+spring后台消息推送,有界面维护

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java和Android中的注解

转载自 Java和Android中的注解1.引言 从JDK1.5开始&#xff0c;引入了注解类Annotation&#xff0c;Annotation其实是一种接口&#xff0c;可以作用于类、方法、属性等等 &#xff0c;它可以通过反射机制来访问annotation信息&#xff0c;获取所加上注解信息&#xff0c;做相应…

第二章 指南(4.3)添加 View

原文&#xff1a;Adding a view作者&#xff1a;Rick Anderson翻译&#xff1a;魏美娟(初见)校对&#xff1a;赵亮(悲梦)、高嵩(Jack)、娄宇(Lyrics)、许登洋(Seay)、姚阿勇&#xff08;Dr.Yao&#xff09; 本节将修改 HelloWorldController 类&#xff0c;把使用 Razor 视图模…

java多表查询返回数据_spring data jpa如何在多张数据库表中查询返回某些字段值?...

对于多表联查需要使用springdata jpa的Query标注实现&#xff0c;例如最代码的我的私信列表的查询&#xff1a;public static final String POSTREPOSITORY_FINDALLBYTYPEANDGROUPBYUSERID "select id from (select id,target_id,case when user_id?1 and type?2 then …

JAVA反射修改常量,以及其局限

转载自 JAVA反射修改常量&#xff0c;以及其局限问题&#xff0c;以及一个解决方案 今天公司的JAVA项目碰到一个问题&#xff1a;在生成xls文件的时候&#xff0c;如果数据较多&#xff0c;会出现ArrayIndexOutOfBoundsException。Google发现是项中所用的jxl包&#xff08;开源…

java出代码1601_LeetCode 1601. 最多可达成的换楼请求数目

题目描述我们有 n 栋楼&#xff0c;编号从 0 到 n - 1 。每栋楼有若干员工。由于现在是换楼的季节&#xff0c;部分员工想要换一栋楼居住。给你一个数组 requests &#xff0c;其中 requests[i] [fromi, toi] &#xff0c;表示一个员工请求从编号为 fromi 的楼搬到编号为 toi …

asp.net core 中间件详解及项目实战

前言 在上篇文章主要介绍了DotNetCore项目状况&#xff0c;本篇文章是我们在开发自己的项目中实际使用的&#xff0c;比较贴合实际应用&#xff0c;算是对中间件的一个深入使用了&#xff0c;不是简单的Hello World&#xff0c;如果你觉得本篇文章对你有用的话&#xff0c;不妨…

一分钟实现分布式锁

转载自 一分钟实现分布式锁一、缘起 分布式环境下&#xff0c;多台机器上多个进程对一个数据进行操作&#xff0c;如果不做互斥&#xff0c;就有可能出现“余额扣成负数”&#xff0c;或者“商品超卖”的情况&#xff0c;如何实现简易分布式锁&#xff0c;对分布式环境下的临界…

java建立线性表的链式结构_Java实现线性表的链式存储

本文实例为大家分享了Java实现线性表的链式存储&#xff0c;供大家参考&#xff0c;具体内容如下链表&#xff1a;一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。package algorithm.datastructure.linklist;import java.ut…

dotnet core 开发体验之Routing

开始 回顾上一篇文章&#xff1a;dotnet core开发体验之开始MVC 里面体验了一把mvc,然后我们知道了aspnet mvc是靠Routing来驱动起来的&#xff0c;所以感觉需要研究一下Routing是什么鬼。 Routing简单使用体验 首先我们用命令yo aspnet创建一个新的空web项目。&#xff08;Yeo…

线程间协作的两种方式:wait、notify、notifyAll和Condition

转载自 线程间协作的两种方式&#xff1a;wait、notify、notifyAll和Condition在前面我们将了很多关于同步的问题&#xff0c;然而在现实中&#xff0c;需要线程之间的协作。比如说最经典的生产者-消费者模型&#xff1a;当队列满时&#xff0c;生产者需要等待队列有空间才能继…

格密码基础:q-ary格

目录 一. 格密码的重要性 二. 格密码基础 2.1 格点的另一种理解方式 三. q-ary格 3.1 q-ary垂直格 3.2 q-ary格 3.3 二者结合 四. 论文中的q-ary格 4.1 定理1 4.2 定理2 4.3 定理3 一. 格密码的重要性 格密码的基础是研究格点上的困难问题&#xff0c;这种格点使用…

java动脑公开课_java课堂动手动脑

实验任务一&#xff1a;阅读并运行示例PassArray.java.1)源代码&#xff1a;package demo;//PassArray.java//Passing arrays and individual array elements to methodspublic class PassArray {public static void main(String[] args) {int a[] { 1, 2, 3, 4, 5 };String o…

dotnet core开发体验之开始MVC

开始 在上一篇文章&#xff1a;dotnet core多平台开发体验 &#xff0c;体验了一把dotnet core 之后&#xff0c;现在想对之前做的例子进行改造&#xff0c;想看看加上mvc框架是一种什么样的体验&#xff0c;于是我就要开始诞生今天的这篇文章来分享我的感受了。 一、项目改造加…

Java时间处理第三方包:Joda-Time

转载自 Java时间处理第三方包&#xff1a;Joda-TimeJoda-Time provides a quality replacement for the Java date and time classes.Joda-Time is the de facto standard date and time library for Java prior to Java SE 8. Users are now asked to migrate to java.time (…

Visual Studio Code五月版本更新

开源项目、跨平台代码编辑器Visual Studio Code刚发布了其1.2版本&#xff08;虽然说是2016年5月发布&#xff0c;但其实是在6月交付的&#xff09;。和往常一样&#xff0c;这次发布的版本中对于很大一部分功能都进行了改善&#xff0c;其中最值得关注的可能是一种全新整合的终…

关于SimpleDateFormat时间格式化线程安全问题

转载自 关于SimpleDateFormat时间格式化线程安全问题昨天推送的文章《关于创建和销毁对象》一文中&#xff0c;2.1重复利用对象这一小节所举的SimpleDateFormat格式化时间的例子是不合适的&#xff0c;因为多线程场景下&#xff0c;SimpleDateFormat存在线程安全问题。在此&am…

聊聊ASP.NET Core默认提供的这个跨平台的服务器——KestrelServer

跨平台是ASP.NET Core一个显著的特性&#xff0c;而KestrelServer是目前微软推出了唯一一个能够真正跨平台的Server。KestrelServer利用一个名为KestrelEngine的网络引擎实现对请求的监听、接收和响应。KetrelServer之所以具有跨平台的特质&#xff0c;源于KestrelEngine是在一…

pdfbox java.lang.outofmemoryerror_Apache PDFBox 1.8.11 发布,Java 的 PDF 处理类

Apache PDFBox 1.8.11 发布&#xff0c;此版本是个增量 bug 修复版本&#xff0c;包括大量 bug 修复和改进。现已提供下载&#xff1a;主要改进内容&#xff1a;Bug 修复[PDFBOX-962] - All sort of Problems when importing Xfdf files into PDFs ->damaged pdfs and NPEs[…

Java8 Striped64 和 LongAdder

转载自 Java8 Striped64 和 LongAdder 数据 STRIPING 根据维基百科的这段说明&#xff1a;In computer data storage, data striping is the technique of segmenting logically sequential data, such as a file, so that consecutive segments are stored on different phys…

Roslyn项目系统简介

发布15年后&#xff0c;Microsoft终于开始替换Visual Studio中基于COM的C#和Visual Basic项目系统。Microsoft谈及很多有必要放弃目前所用系统的原因&#xff1a; 原生且基于COM单线程并与UI线程绑定难以通过和&#xff08;不同用途的&#xff09;子类型类扩展到聚合之外与Visu…