微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

之前写过一篇文章 flex+blazeds+java后台消息推送(简单示例)   ,现在要写的是这个的升级版,改动还是挺多的,在上面的基础上增加了spring配置,还有界面的维护。后台基本上全变了。呵呵 。。。下面看实现过程
大体的思路是:服务器启动时,查询数据库获取为推送的消息,存储到内存中,定义了一个全局变量MESSAGE_LIST,集合类型。以后的每次维护,包括(增、删、改),都同时维护两份,及数据库和内存,保证两者的一致。当一条消息推送完成,即从MESSAGE_LIST中删除
首先,添加spring的配置,在web-application-config.xml文件添加
  1. <flex:message-broker id="_messagebroker">  
  2.         <flex:message-service  
  3.             default-channels="my-streaming-amf,my-polling-amf"/>  
  4.         </flex:message-broker>
  5.         <flex:message-destination id="tick-data-Feed" channels="my-streaming-amf,my-polling-amf" allow-subtopics="true" subtopic-separator="."/>
复制代码
添加之前时:
  1. <flex:message-broker />
主要是为了在后台获取message-broker,services-config.xml的配置还是一样,不变。
然后,后台java类
  1.         /**
  2.          * 新增消息
  3.          * @param paramMessage
  4.          * @return
  5.          * @throws ServiceException
  6.          * @throws sqlException
  7.          * @author: IT氧吧
  8.          * @createDate: 2011-5-17
  9.          * @modifiedBy:IT氧吧
  10.          * @modifiedDate:2011-5-17
  11.          */
  12.         public String savePushMessage(PushMessage paramMessage)
  13.                         throws ServiceException,sqlException {
  14.                 
  15.                 paramMessage.setStartDate(DateUtil.parseDate(paramMessage.getStartDateCN(),DateUtil.YMDHMS_PATTERN));
  16.                 paramMessage.setEndDate(DateUtil.parseDate(paramMessage.getEndDateCN(),serif; font-size:12px; line-height:1.8em">                 Date d = systemService.getDateFromDataBase();
  17.                 if(paramMessage.getStartDate().compareto(d) < 0 || paramMessage.getEndDate().compareto(d) < 0){
  18.                         throw new ServiceException("推送日期不能早于当前日期");
  19.                 }
  20.                 if(paramMessage.getStartDate().compareto(paramMessage.getEndDate()) > 0){
  21.                         throw new ServiceException("推送起始日期不能晚于推送结束日期");
  22.                 /** 保存到数据库 */
  23.                 Long messageId = systemService.savePushMessage(paramMessage);
  24.                 /** 添加到集合中 */
  25.                 GlobalNames.MESSAGE_LIST.add(paramMessage);
  26.                 /** 集合重新排序 降序
  27.                 Comparator<PushMessage> comparator = new Comparator<PushMessage>(){
  28.                          @Override
  29.                       public int compare(PushMessage o1,PushMessage o2) {
  30.                         return o1.getStartDate().compareto(o2.getStartDate());
  31.                       }
  32.                 };
  33.                 Collections.sort(GlobalNames.MESSAGE_LIST,comparator); */
  34.                 /** 
  35.                  * 如果GlobalNames.MESSAGE_LIST没有消息,此时新增消息的时候就得推送,否则只是把消息添加到GlobalNames.MESSAGE_LIST并排序
  36.                  * */
  37.                 if(GlobalNames.MESSAGE_LIST.size() == 1){
  38.                         PushMessageUtil.startPush(systemService);
  39.                 return messageId.toString();
  40.         }
下面看一下PushMessageUtil
  1.         public static void startPush(SystemService systemService){
  2.                 if(GlobalNames.MESSAGE_LIST.size() > 0){
  3.                         if(t == null){
  4.                                 t = new Timer();
  5.                                 try {
  6.                                         dbDate = systemService.getDateFromDataBase();
  7.                                 } catch (ServiceException e) {
  8.                                         // Todo Auto-generated catch block
  9.                                         e.printstacktrace();
  10.                                 } catch (sqlException e) {
  11.                                 }
  12.                         }
  13.                         /** 
  14.                          * 下面一段代码在一种情况下会报错,即系统刚启动还没有任何人登录
  15.                          * 此时系统flex框架部分还未初始化,获取到msgbroker为空
  16.                          *  */
  17.                         msgbroker = Messagebroker.getMessagebroker("_messagebroker");
  18.                         clientID = UUIDUtils.createUUID();
  19.                         t.scheduleAtFixedrate(new TimerTask() {
  20.                                 @Override
  21.                                 public void run() {
  22.                                         // Todo Auto-generated method stub
  23.                                         if(msgbroker == null){
  24.                                                 msgbroker = Messagebroker.getMessagebroker("_messagebroker");
  25.                                         }
  26.                                         PushMessage message;
  27.                                         dbDate.setMinutes(dbDate.getMinutes()+1);
  28.                                         /** 每隔1分钟轮询一次 */
  29.                                         /** 注意下面的循环不能用foreach,否则报java.util.ConcurrentModificationException*/
  30. //                                        for(PushMessage message : GlobalNames.MESSAGE_LIST){
  31.                                         for(int i=0;i<GlobalNames.MESSAGE_LIST.size();i++){
  32.                                                 String dateStr = DateUtil.format(dbDate,DateUtil.YMDHMS_PATTERN);
  33.                                                 message = GlobalNames.MESSAGE_LIST.get(i);
  34.                                                 if((message.getStartDate().getMinutes()-dbDate.getMinutes()) % message.getInterval() == 0){
  35.                                                         pMessage = message;
  36.                                                         start();
  37.                                                 }
  38.                                                 
  39.                                                 //是否等于结束时间
  40.                                                 if(message.getEndDateCN().substring(0,message.getEndDateCN().lastIndexOf(":")).equals(dateStr.substring(0,dateStr.lastIndexOf(":")))){
  41.                                                         GlobalNames.MESSAGE_LIST.remove(message);
  42.                                                         System.out.println("大小:"+GlobalNames.MESSAGE_LIST.size());
  43.                                                         stopMessage = message;
  44.                                                         stop();
  45.                                                         if(GlobalNames.MESSAGE_LIST.size() == 0){
  46.                                                                 t.cancel();
  47.                                                                 t = null;
  48.                                                                 break;
  49.                                                         }
  50.                         },1000*60,1000*60);
  51.         }
  52.         
  53.          * 开始推送
  54.          * @createDate: 2011-5-20
  55.          * @modifiedBy: IT氧吧
  56.          * @modifiedDate:2011-5-20
  57.         private static void start() {
  58.                 Asyncmessage msg = new Asyncmessage();
  59.                 msg.setDestination("tick-data-Feed");
  60.                 msg.setHeader("DSSubtopic","tick");
  61.                 msg.setClientId(clientID);
  62.                 msg.setMessageId(UUIDUtils.createUUID());
  63.                 msg.setTimestamp(System.currentTimeMillis());
  64.                 msg.setBody(pMessage);
  65.                 if(msgbroker != null){
  66.                         msgbroker.routeMessagetoService(msg,null);
  67.                         System.out.println("start!!");

  68.          * 停止推送
  69.         private static void stop() {
  70.                 System.out.println(stopMessage.getContent()+"  已经推送完成");
  71. 不解释,应该都能看懂,该有的注释也都有
    前台还是一样,该添加的监听还是得添加,只是多了个,如果有多个消息同时推送时,已经推送过的消息将不会显示
    1. private var msgList:ArrayCollection = new ArrayCollection();
    2.                         private function messageHandler(event:MessageEvent):void    
    3.                         {   
    4.                                 var pmsg:ServerPushMessageVO = event.message.body as ServerPushMessageVO; 
    5.                                 /**
    6.                                  * 返回指示视图是否包含指定对象的信息。与 IViewCursor.findxxx 方法不同,
    7.                                  * 此搜索仅在找到完全与参数匹配的项目时才会成功。如果视图中包含已应用到该视图的滤镜,
    8.                                  * 则即使基本集合确实包含该项目,此方法也会返回 false。 
    9.                                  * */
    10.                                 if(!msgList.contains(pmsg.id))
    11.                                 {
    12.                                         var showTipMessageG:ShowTipMessageG = new ShowTipMessageG();
    13.                                         msgList.addItem(pmsg.id);
    14.                                         showTipMessageG.serverPushMessageVO = pmsg;
    15.                                         PopUpEffect.show(showTipMessageG,this,true);
    16.                         }   
    下面上几张效果
    新增消息页面

    QQ截图未命名.gif

     
    2011-6-6 16:42:53 上传
    下载附件 (6.92 KB)

    弹出提示页面

    QQ截图未命名.gif

     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐