加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:04:11 所属栏目:百科 来源:网络整理
导读:之前写过一篇文章: 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

    ?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读