java定时任务使用方法之实现环信聊天记录同步并定时删除

定时任务代码:

public class ChatHistoryTimerListener implements ServletContextListener {
 String chatUrl="http://a1.easemob.com/***/********/chatmessages";
 private ChatHistoryService chService;
 private Timer timer=null;
  private static final long PERIOD_DAY = 24 * 60 * 60 * 1000; 
 //private static final long PERIOD_DAY =  1000; 
 @Override
 public void contextDestroyed(ServletContextEvent arg0) {
  
 }

 @Override
 public void contextInitialized(ServletContextEvent event) {
           timer=new Timer();
           WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
           this.chService=(ChatHistoryService)applicationContext.getBean("chService"); 
           Calendar calendar = Calendar.getInstance(); 
           calendar.set(Calendar.HOUR_OF_DAY, 1); //凌晨1点 
           calendar.set(Calendar.MINUTE,0);
           calendar.set(Calendar.SECOND, 0); 
           Date date=calendar.getTime();
           event.getServletContext().log("环信----------------定时器已启动。") ;
           TimerTask task=new TimerTask() {
   @Override
   public void run() {
    String tokenUrl="http://a1.easemob.com/***/*****/token";
        Map<String,String>paramMap=new HashMap<String,String>();
         paramMap.put("grant_type", "client_credentials");
        paramMap.put("client_id", Config.hxclient_id);
      paramMap.put("client_secret", Config.hxclient_secret);
       Map<String, Object>tokenMap=JsonTools.jsonStrToMap(HttpTools.post(tokenUrl,paramMap));
    System.out.println(calendar.get(Calendar.MINUTE));
            List<Map<String,String>>headerList=new ArrayList<Map<String,String>>();
            Map<String,String>header=new HashMap<String, String>();
            Map<String,String>header2=new HashMap<String, String>();
            header.put("headerName", "Authorization");
            header.put("headerValue", "Bearer "+tokenMap.get("access_token").toString());
            header2.put("headerName", "Content-Type");
            header2.put("headerValue", "application/json");
            headerList.add(header);
            boolean isrun=true;
            String pagram="";
            //在此处要判断上次同步完成后的最后一条消息的时间,按照时间同步后面的数据
            //ql=select * where timestamp<1403164734226 and timestamp>1403166586000
            Timestamp time=chService.getNewTimeSynchronous();
            if(ChkTools.isNotNull(time)){
             chatUrl=chatUrl+"?ql=select+*+where+timestamp>"+time.getTime()+"&limit=100"; 
            }else{
             chatUrl=chatUrl+"?limit=100"; 
            }
            while (isrun) {
             String json=HttpTools.getSetHeader(chatUrl+pagram, headerList);
             if(ChkTools.isNull(json)){
              isrun=false;
              break;
             }
             JSONObject o=JSON.parseObject(json);
             if(ChkTools.isNotNull(o.get("cursor"))){
              pagram="&cursor="+o.get("cursor").toString();
             }else{
              isrun=false;
          }
             chService.SynchronousChat(o,event.getServletContext().getRealPath("/"));
             //此处开始执行,业务数据在下面代码稍作分享
           
            try {
      Thread.sleep(10000);
      System.out.println("等待一千毫秒后执行下一次循环");
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
            //删除本地服务器的缓存文件,文件已经保存到七牛
            File file=new File(event.getServletContext().getRealPath("/")+"downtem");
           
           deleteFile(file);
   }
           
            //定时删除三天前的聊天记录
            chService.deleteTimeAgoHistory();
           
  }
 };
         timer.schedule(task, date,PERIOD_DAY) ; 
        event.getServletContext().log("聊天记录--------已经添加任务调度表。" ) ; 
 }
 //使用的spring实现实例化
 public ChatHistoryService getChService() {
  return chService;
 }
 public void setChService(ChatHistoryService chService) {
  this.chService = chService;
 }

  private void deleteFile(File file){
      if(file.isDirectory()){
      File[] files = file.listFiles();
       for(int i=0; i<files.length; i++){
          deleteFile(files[i]);
         }
       }
      file.delete();
      }
}
业务代码

public void SynchronousChat(JSONObject o, String filepath) {

  JSONArray e = (JSONArray) o.get("entities");
  if (e.size() > 0) {
   List<B_Chat_History> list = new ArrayList<B_Chat_History>();
   for (int i = 0; i < e.size(); i++) {
    B_Chat_History bcHistory = new B_Chat_History();
    JSONObject s = e.getJSONObject(i);
    String from = s.getString("from");
    String to = s.getString("to");
    Long timestamp = Long.parseLong(s.getString("timestamp"));
    JSONObject p = (JSONObject) s.get("payload");
    JSONArray bodies = (JSONArray) p.get("bodies");
    JSONObject b = bodies.getJSONObject(0);
    // "msg": "哈哈哈","type":
    // "txt""type": "video",
    // 开始赋值
    bcHistory.setFrom_phone(from);
    bcHistory.setTo_phone(to);
    bcHistory.setFrom_user(getuserName(from));
    bcHistory.setTo_user(getuserName(to));
    
    bcHistory.setTimestamp(new java.sql.Timestamp(timestamp));
    switch (b.getString("type")) {
    case "txt":
     bcHistory.setMsg(b.getString("msg").replace("\n", ""));
     bcHistory.setType("txt");
     bcHistory.setLength(0);
     break;
    case "video":
     bcHistory.setType("video");
     String videokey = "video_" + new Date().getTime() + ".mp4";
     try {
      String file = HttpDownUtil.downloadNet(filepath,
        b.getString("url"), "mp4");
      try {
       QiNiuUplodUtil.upload(file, videokey);
      } catch (IOException e1) {
       e1.printStackTrace();
      }
     } catch (MalformedURLException e1) {
      e1.printStackTrace();
     }
     bcHistory.setUrl(Constant.QINIU_URL_WEB + videokey);
     String thumbkey = "video_" + new Date().getTime() + ".png";
     try {
      String file = HttpDownUtil.downloadNet(filepath,
        b.getString("thumb"), "png");
      try {
       QiNiuUplodUtil.upload(file, thumbkey);
      } catch (IOException e1) {
       e1.printStackTrace();
      }
     } catch (MalformedURLException e1) {
      e1.printStackTrace();
     }
     bcHistory.setThumb(Constant.QINIU_URL_WEB + thumbkey);
     bcHistory.setLength(0);
     break;
    case "img":
     bcHistory.setType("img");
     String imgkey = "img_" + new Date().getTime() + ".png";
     try {
      String file = HttpDownUtil.downloadNet(filepath,
        b.getString("url"), "png");
      try {
       QiNiuUplodUtil.upload(file, imgkey);
      } catch (IOException e1) {
       e1.printStackTrace();
      }
     } catch (MalformedURLException e1) {
      e1.printStackTrace();
     }
     bcHistory.setUrl(Constant.QINIU_URL_WEB + imgkey);
     bcHistory.setLength(0);
     break;
    case "audio":
     bcHistory.setType("audio");
     String audiokey = "audio_" + new Date().getTime() + ".amr";
     try {
      String file = HttpDownUtil.downloadNet(filepath,
        b.getString("url"), "amr");
      try {
       QiNiuUplodUtil.upload(file, audiokey);
      } catch (IOException e1) {
       e1.printStackTrace();
      }
     } catch (MalformedURLException e1) {
      e1.printStackTrace();
     }
     //"length":10,语音时常秒
     bcHistory.setLength(Integer.parseInt(b.getString("length")));
     bcHistory.setUrl(Constant.QINIU_URL_WEB + audiokey);
     break;
    }
    list.add(bcHistory);
   }
   /**
    * 此处使用Springjdbc执行批量保存
    */
   try {
    jt.batchUpdate(
 "insert into b_chat_history (id,from_phone,from_user,to_phone,to_user,type,msg,url,thumb,length,timestamp) value (?,?,?,?,?,?,?,?,?,?,?)",
      new BatchPreparedStatementSetter() {
       public void setValues(PreparedStatement ps, int i)
         throws SQLException {
        ps.setString(1, UUID.randomUUID().toString());// ID的值
        ps.setString(2, list.get(i).getFrom_phone());
        ps.setString(3, list.get(i).getFrom_user());
        ps.setString(4, list.get(i).getTo_phone());
        ps.setString(5, list.get(i).getTo_user());
        ps.setString(6, list.get(i).getType());
        ps.setString(7, list.get(i).getMsg());
        ps.setString(8, list.get(i).getUrl());
        ps.setString(9, list.get(i).getThumb());
        ps.setInt(10,list.get(i).getLength());
        ps.setTimestamp(11, list.get(i).getTimestamp());
       }

       public int getBatchSize() {
        return list.size();
       }
      });
   } catch (Exception e2) {
    System.out.println("可能有数据异常,同步部分数据异常");
    e2.printStackTrace();
   }
  }

 }
OK了,最后实现的结果如下

 

上传到七牛的文件:语音、视频、图片

时间: 2024-11-08 20:04:50

java定时任务使用方法之实现环信聊天记录同步并定时删除的相关文章

java后台导出环信聊天记录

问题描述 请问,java后台如何导出环信的聊天记录? 用下面的方法吗?可为什么用下面的方式拿到的数据只有10条(总数绝对不止10条)?或者使用别的方式导出聊天记录? // 聊天消息 获取7天以内的消息 String currentTimestamp = String.valueOf(**.currentTimeMillis()); String senvenDayAgo = String.valueOf(**.currentTimeMillis() - 7 * 24 * 60 * 60 * 10

环信聊天记录

问题描述 聊天记录是,环信主动推送过来的,还是我给环信发了一个请求,聊天记录可以保存多长时间? 解决方案 聊天记录在环信服务器保存14天,离线消息是7天500条

如何删除环信聊天记录

问题描述 有管理员账号,如何删除聊天记录,记得有说过可以删除的 解决方案 本帖最后由 hblzg123 于 2015-4-24 12:39 编辑 提供导出聊天记录的接口,调用rest接口导出 http://www.easemob.com/docs/re ... ssage解决方案二:你可以用imit导出,根据之前获取数据返回cursor继续获取后面的数据,再分页导出解决方案三:本帖最后由 hblzg123 于 2015-4-24 12:40 编辑 支持导出聊天记录

环信聊天记录备份~php 大家怎么备份的?

问题描述 导出来的聊天记录是个数组 ,大家都是怎么备份的?写入文件里还写入数据库里? 以后要是漫游怎么在ios上获得信息呢?求解答~~~~ 解决方案 https://github.com/easemob/emchat-server-examples/tree/master/emchat-server-php  服务端demo

android-使用环信SDK开发即时通信功能(附源码下载)_Android

最近项目中集成即时聊天功能,挑来拣去,最终选择环信SDK来进行开发,选择环信的主要原因是接口方便.简洁,说明文档清晰易懂.文档有Android.iOS.和后台服务器端,还是非常全的.  环信官网:http://www.easemob.com/ 本篇文章目的主要在于说明环信Demo如何实现即时通信的.我在集成环信SDK到我们自己开发的app之前,研究了一下环信demo的代码,看了两三天的样子,基本搞清楚来龙去脉,但是只是清楚来龙去脉,要说到里面的细节可能得深一步研究,但是这就够了,已经可以把dem

android-使用环信SDK开发即时通信功能(附源码下载)

最近项目中集成即时聊天功能,挑来拣去,最终选择环信SDK来进行开发,选择环信的主要原因是接口方便.简洁,说明文档清晰易懂.文档有Android.iOS.和后台服务器端,还是非常全的. 环信官网:http://www.easemob.com/ 本篇文章目的主要在于说明环信Demo如何实现即时通信的.我在集成环信SDK到我们自己开发的app之前,研究了一下环信demo的代码,看了两三天的样子,基本搞清楚来龙去脉,但是只是清楚来龙去脉,要说到里面的细节可能得深一步研究,但是这就够了,已经可以把demo

iOS 从环信服务器获取的group无法缓存本地

问题描述 因为这边group是通过app服务器向环信服务器发起请求创建的..而group信息要向环信服务器请求.使用了groupManager的3个方法,发现环信本地缓存的group表都是空的..- (NSArray *)getMyGroupsFromServerWithError:(EMError **)pError;- (EMGroup *)searchPublicGroupWithId:(NSString *)aGroupId error:(EMError **)pError;- (EMg

iOS环信添加好友问题

问题描述 IOS 添加好友时,有没有方法进行判断该好友ID是否存在于此环信中,或者有没有方法获得此环信中的所有好友列表 解决方案 /*! *  ~chinese *  从服务器获取所有的好友 * *  同步方法,会阻塞当前线程 * *  @param pError 错误信息 * *  @return 好友列表<NSString> * *  ~english *  Get all the friends from the server * *  Synchronization method wi

IOS 环信数据库的问题?

问题描述 /*! *  从所有的聊天记录中搜索符合条件的记录 * *  @param criteria 搜索条件 * *  @return 搜索结果, 由EMMessage对象组成 */- (NSArray *)searchMessagesWithCriteria:(NSString *)criteria;这个方法能根据环信的组id获取当前组id获取数组吗? 解决方案 这个是根据聊天消息去搜索聊天记录的,不清楚您指的数组ID是什么.解决方案二:就是我加入了一个讨论组,传入讨论组id号,能不能返回