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

来源:互联网 发布:e4a数据库怎么破解 编辑:程序博客网 时间:2024/05/19 06:48
之前写过一篇文章: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(), DateUtil.YMDHMS_PATTERN));
  17.                 Date d = systemService.getDateFromDataBase();
  18.                 if(paramMessage.getStartDate().compareTo(d) < 0 || paramMessage.getEndDate().compareTo(d) < 0){
  19.                         throw new ServiceException("推送日期不能早于当前日期");
  20.                 }
  21.                 if(paramMessage.getStartDate().compareTo(paramMessage.getEndDate()) > 0){
  22.                         throw new ServiceException("推送起始日期不能晚于推送结束日期");
  23.                 }
  24.                 /** 保存到数据库 */
  25.                 Long messageId = systemService.savePushMessage(paramMessage);
  26.                 /** 添加到集合中 */
  27.                 GlobalNames.MESSAGE_LIST.add(paramMessage);
  28.                 
  29.                 /** 集合重新排序 降序
  30.                 Comparator<PushMessage> comparator = new Comparator<PushMessage>(){
  31.                          @Override
  32.                       public int compare(PushMessage o1, PushMessage o2) {
  33.                         return o1.getStartDate().compareTo(o2.getStartDate());
  34.                       }
  35.                 };
  36.                 Collections.sort(GlobalNames.MESSAGE_LIST, comparator); */
  37.                 /** 
  38.                  * 如果GlobalNames.MESSAGE_LIST没有消息,此时新增消息的时候就得推送,否则只是把消息添加到GlobalNames.MESSAGE_LIST并排序
  39.                  * */
  40.                 if(GlobalNames.MESSAGE_LIST.size() == 1){
  41.                         PushMessageUtil.startPush(systemService);
  42.                 }
  43.                 return messageId.toString();
  44.         }
复制代码
下面看一下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.                                         // TODO Auto-generated catch block
  12.                                         e.printStackTrace();
  13.                                 }
  14.                         }
  15.                         /** 
  16.                          * 下面一段代码在一种情况下会报错,即系统刚启动还没有任何人登录,
  17.                          * 此时系统flex框架部分还未初始化,获取到msgBroker为空
  18.                          *  */
  19.                         msgBroker = MessageBroker.getMessageBroker("_messageBroker");
  20.                         clientID = UUIDUtils.createUUID();
  21.                         t.scheduleAtFixedRate(new TimerTask() {
  22.                                 @Override
  23.                                 public void run() {
  24.                                         // TODO Auto-generated method stub
  25.                                         if(msgBroker == null){
  26.                                                 msgBroker = MessageBroker.getMessageBroker("_messageBroker");
  27.                                         }
  28.                                         PushMessage message;
  29.                                         dbDate.setMinutes(dbDate.getMinutes()+1);
  30.                                         /** 每隔1分钟轮询一次 */
  31.                                         /** 注意下面的循环不能用foreach,否则报java.util.ConcurrentModificationException*/
  32. //                                        for(PushMessage message : GlobalNames.MESSAGE_LIST){
  33.                                         for(int i=0;i<GlobalNames.MESSAGE_LIST.size();i++){
  34.                                                 String dateStr = DateUtil.format(dbDate, DateUtil.YMDHMS_PATTERN);
  35.                                                 message = GlobalNames.MESSAGE_LIST.get(i);
  36.                                                 if((message.getStartDate().getMinutes()-dbDate.getMinutes()) % message.getInterval() == 0){
  37.                                                         pMessage = message;
  38.                                                         start();
  39.                                                 }
  40.                                                 
  41.                                                 //是否等于结束时间
  42.                                                 if(message.getEndDateCN().substring(0, message.getEndDateCN().lastIndexOf(":")).equals(dateStr.substring(0, dateStr.lastIndexOf(":")))){
  43.                                                         GlobalNames.MESSAGE_LIST.remove(message);
  44.                                                         System.out.println("大小:"+GlobalNames.MESSAGE_LIST.size());
  45.                                                         stopMessage = message;
  46.                                                         stop();
  47.                                                         if(GlobalNames.MESSAGE_LIST.size() == 0){
  48.                                                                 t.cancel();
  49.                                                                 t = null;
  50.                                                                 break;
  51.                                                         }
  52.                                                 }
  53.                                         }
  54.                                 }
  55.                         }, 1000*60, 1000*60);
  56.                 }
  57.         }
  58.         
  59.         /**
  60.          * 开始推送
  61.          * @author: IT氧吧
  62.          * @createDate: 2011-5-20
  63.          * @modifiedBy: IT氧吧
  64.          * @modifiedDate:2011-5-20
  65.          */
  66.         private static void start() {
  67.                 AsyncMessage msg = new AsyncMessage();
  68.                 msg.setDestination("tick-data-feed");
  69.                 msg.setHeader("DSSubtopic", "tick");
  70.                 msg.setClientId(clientID);
  71.                 msg.setMessageId(UUIDUtils.createUUID());
  72.                 msg.setTimestamp(System.currentTimeMillis());
  73.                 msg.setBody(pMessage);
  74.                 if(msgBroker != null){
  75.                         msgBroker.routeMessageToService(msg, null);
  76.                         System.out.println("start!!");
  77.                 }
  78.         }

  79.         /**
  80.          * 停止推送
  81.          * @author: IT氧吧
  82.          * @createDate: 2011-5-20
  83.          * @modifiedBy:IT氧吧
  84.          * @modifiedDate:2011-5-20
  85.          */
  86.         private static void stop() {
  87.                 System.out.println(stopMessage.getContent()+"  已经推送完成");
  88.         }
复制代码
不解释,应该都能看懂,该有的注释也都有
前台还是一样,该添加的监听还是得添加,只是多了个,如果有多个消息同时推送时,已经推送过的消息将不会显示
  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.                                 }
  17.                         }   
复制代码
下面上几张效果图
新增消息页面
QQ截图未命名.gif 
2011-6-6 16:42:53 上传
下载附件 (6.92 KB)

弹出提示页面
QQ截图未命名.gif