• 两个系统相互交互,一个抛接口,一个接数据


    一、服务器向外抛数据:

    1.向外发数据:

    我这个是在代码里做了一个定时发送,(我这个是2分钟发一次)

    //同步手机和微信数据信息
        @Scheduled(cron = "0 0/2 * * * ?")
        public void SyncWechatData() throws Exception {
            //获取本机的InetAddress实例  
            InetAddress address = InetAddress.getLocalHost();
            //获取IP
            String local = address.getHostAddress();
            String server = FinalData.server;
            if(StringUtil.isNotEmpty(server)){
                if(server.equals(local)){
                    
                    //这里是写方法的
                    Map<String, Object> json = WechatPhoneService.DataTransmit();
                    WechatAddressService.SendPostInJosn(json);
                    
                    System.out.println("同步手机和微信数据信息结束:" + sdf.format(new Date()));
                    
                }
            }
        }

    2.释放一个接口(在spring-mvc.xml文件中)

    <value>PhoneController/wchatJosn.do</value>

    3.在数据库中取数据,放在map集合中

     1 /**
     2      * 同步手机和微信数据信息到办公平台(封装)
     3      */
     4     public Map<String, Object> DataTransmit(){
     5         List<PhoneEntity> phones = systemService.findByQueryString(" from PhoneEntity where transfer = '0'");
     6         List<InfoEntity> wechatInfos = systemService.findByQueryString(" from InfoEntity where transfer = '0'");
     7         List<PhoneWxEntity> phoneWxs = systemService.findByQueryString(" from PhoneWxEntity where transfer = '0'");
     8         Map<String, Object> map = new HashMap<String, Object>();
     9         //手机表id串
    10         String phoneids = "";
    11         int i =1;
    12         if (phones.size() > 0) {
    13             List<PhoneEntity> phones1 = new ArrayList<tPhoneEntity>();
    14             //只取1000条数据
    15             for (PhoneEntity phone : phones) {
    16                 //把取到的数据放在list集合中
    17                 phones1.add(phone);
    18                 if (i > 1000) {
    19                     break;
    20                 }
    21                 i++;
    22             }
    23             map.put("phone", phones1);
    24             for (PhoneEntity phone : phones) {
    25                 if (StringUtils.isNotEmpty(phoneids)) {
    26                     phoneids = phoneids + ",'" + phone.getId() + "'";
    27                 }else {
    28                     phoneids = "'" + phone.getId() + "'";
    29                 }
    30             }
    31         }
    32         //微信表id串
    33         String infoids = "";
    34         if (wechatInfos.size() > 0) {
    35             i = 1;
    36             List<InfoEntity> wechatInfos1 = new ArrayList<InfoEntity>();
    37             //只取1000条数据
    38             for (InfoEntity wechatInfo : wechatInfos) {
    39                 //把取到的数据放在list集合中
    40                 wechatInfos1.add(wechatInfo);
    41                 if (i > 1000) {
    42                     break;
    43                 }
    44                 i++;
    45             }
    46             map.put("wechatInfo", wechatInfos1);
    47             for (InfoEntity wechatInfo : wechatInfos) {
    48                 if (StringUtils.isNotEmpty(infoids)) {
    49                     infoids = infoids + ",'" + wechatInfo.getId() + "'";
    50                 }else {
    51                     infoids = "'" + wechatInfo.getId() + "'";
    52                 }
    53             }
    54         }
    55         //手机微信关系表id串
    56         String phoneWxids = "";
    57         if (phoneWxs.size() > 0) {
    58             i = 1;
    59             List<PhoneWxEntity> phoneWxs1 = new ArrayList<PhoneWxEntity>();
    60             //只取1000条数据
    61             for (PhoneWxEntity phoneWx : phoneWxs) {
    62                 //把取到的数据放在list集合中
    63                 phoneWxs1.add(phoneWx);
    64                 if (i > 1000) {
    65                     break;
    66                 }
    67                 i++;
    68             }
    69             map.put("phoneWx", phoneWxs1);
    70             for (PhoneWxEntity phoneWx : phoneWxs) {
    71                 if (StringUtils.isNotEmpty(phoneWxids)) {
    72                     phoneWxids = phoneWxids + ",'" + phoneWx.getId() + "'";
    73                 } else {
    74                     phoneWxids = "'" + phoneWx.getId() + "'";
    75                 }
    76             }
    77         }
    78         JSONArray arry=JSONArray.fromObject(map);
    79         String str = arry.toString();
    80         Map<String, Object> maps = new HashMap<String, Object>();
    81         maps.put("json", str);
    82         maps.put("phoneids", phoneids);
    83         maps.put("infoids", infoids);
    84         maps.put("phoneWxids", phoneWxids);
    85         return maps;
    86     }

    4.把返回的map集合中json串取出来发送到另一个服务器上,map集合中剩下的拼接好的id串等返回一个ok值后,在相应的表中把发送过的数据改为已发送状态(这里边要注意:当数据可中的数据添加、修改时要把状态改为为发送状态)

    /**
         * 把传过来的数据用接口发送出去,把拼接的id等返回ok后把发送的数据标记为已发送状态
         */
        @Override
        public void SendPostInJosn(Map<String, Object> map){
            String url1 = "域名/服务器名称/控制层/方法名.do";
            String json = map.get("json").toString();//json串
            String phoneids = map.get("phoneids").toString();//电话表id串
            String infoids = map.get("infoids").toString();//微信表id串
            String phoneWxids = map.get("phoneWxids").toString();//手机微信关系表id串
            String result="";
            PrintWriter out = null;  
            BufferedReader in = null; 
            URL url=null;
             try {
                 url = new URL(url1);
                 URLConnection connect = url.openConnection();
                 connect.setRequestProperty("content-type","application/x-www-form-urlencoded;charset=utf-8");
                 connect.setRequestProperty("method","POST");
                 byte[] bytes= json.getBytes("utf-8") ;
                 connect.setDoOutput(true);  
                 connect.setDoInput(true);  
                 
                 out = new PrintWriter(connect.getOutputStream());  
                 // 发送请求参数  
                 out.print("datas="+json);
                 out.flush();  
                 //数据交互返回值200/400/500...
                 CloseableHttpClient httpClient = HttpClients.createDefault();
                 HttpPost post = new HttpPost(url1);
                 CloseableHttpResponse response = null;
                 StringEntity entitys = new StringEntity(json);
                 post.setEntity(entitys);
                 response = httpClient.execute(post);
                 System.out.println(response.getStatusLine().getStatusCode());
                 // 定义BufferedReader输入流来读取URL的响应  
                 if (response != null && response.getStatusLine().getStatusCode() == 200) {
                     in = new BufferedReader(new InputStreamReader(connect.getInputStream()));
                     String line = "";  
                     while ((line = in.readLine()) != null) {  
                         result +=  line;  
                         if ("ok".equals(result)) {
                              PhoneService.updateTransferData(phoneids,infoids,phoneWxids);
                        }
                     }   
                }else {
                    System.out.println("数据交互出错,请检查办公平台服务是否开启?出错原因报:"+response.getStatusLine().getStatusCode());
                }
             } catch (Exception e) {
                 System.out.println("数据交互出错,请检查办公平台服务是否开启???");
                 e.printStackTrace();
             }
        }

    5.把拼接好的id串在数据库中检索出对应的数据再把数据改为已发送状态

    /**
         * 把电话表、微信表、手机与微信关系表中的是否传送字段改为“1”;(否:0;是:1)
         */
        @Override
        public void updateTransferData(String phoneids, String infoids, String phoneWxids) {
            //修改电话表中的字段是否传送
            if (StringUtils.isNotEmpty(phoneids)) {
                String sql1 = "update phone set transfer = '1' where id in ("+phoneids+")";
                systemService.updateBySqlString(sql1);
            }
            //修改微信表中的字段是否传送
            if (StringUtils.isNotEmpty(infoids)) {
                String sql2 = "update info set transfer = '1' where id in ("+infoids+")";
                systemService.updateBySqlString(sql2);
            }
            //修改手机与微信关系表中的字段是否传送
            if (StringUtils.isNotEmpty(phoneWxids)) {
                String sql3 = "update phone_wx set transfer = '1' where id in ("+phoneWxids+")";
                systemService.updateBySqlString(sql3);
            }
        }

    二、服务器接收数据

    1.接受接口所传过来的数据(个人认为这个接收方法就像是在一个实体中的方法调用)

     1 /**
     2      * 接收方法传过来的json串
     3      * @param request
     4      * @param response
     5      * @throws Exception 
     6      */
     7     @RequestMapping(value = "/wchatJosn")
     8     public void wchatJosn(HttpServletRequest request, HttpServletResponse response) throws Exception{
     9         String result = "";
    10         boolean isPost = request.getMethod().toLowerCase().equals("post");
    11         String json = request.getParameter("datas");
    12         
    13         PrintWriter wirte = null;
    14         wirte = response.getWriter();
    15         response.setCharacterEncoding("UTF-8");
    16         response.setContentType("text/html;charset=UTF-8");
    17         if (isPost) {
    18             //应答接口,包括注册、接收数据等 使用post协议
    19             result = PhoneService.wchatJosnAddress(json);
    20             wirte.print(result);
    21         }else{
    22             wirte.print("");
    23         }
    24         wirte.flush();            
    25         wirte.close();
    26     }

    2.把json串解析  然后根据不同的表数据再把不同的数据放在自己对应的数据库中(这个是一个批处理的数据存储和修改的方法)

      1 /**
      2       * 把传过来的数据放到数据库中
      3       * 正确时返回“ok”
      4       * @throws ClassNotFoundException 
      5       */
      6     @Override
      7     public String wchatJosnAddress(String json) throws Exception {
      8         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      9         String str = "";
     10         int i = 0;
     11         //手机表
     12         String phones = "";
     13         //微信表
     14         String wechatInfos = "";
     15         //手机微信表关系表
     16         String phoneWxs = "";
     17         if (StringUtils.isNotEmpty(json)) {
     18             json = json.substring(1,json.length()-1);
     19         }
     20         JSONObject objects=JSONObject.fromObject(json);
     21         JSONArray array1 = null;
     22         JSONArray array2 = null;
     23         JSONArray array3 = null;
     24         if (null != objects) {
             //判断json传过来的数据中是否在map中有这个键值对
    25 if (StringUtils.isNotEmpty(objects.optString("phone"))) { 26 array1 = objects.getJSONArray("phone"); 27 phones = array1.toString(); 28 } 29 if (StringUtils.isNotEmpty(objects.optString("wechatInfo"))) { 30 array2 = objects.getJSONArray("wechatInfo"); 31 wechatInfos = array2.toString(); 32 } 33 if (StringUtils.isNotEmpty(objects.optString("phoneWx"))) { 34 array3 = objects.getJSONArray("phoneWx"); 35 phoneWxs = array3.toString(); 36 } 37 } 38 //数据库配置 这个是我之前自己封装好的在页面中直接修改服务器id 39 String[] add = DatabaseaddressController.getDatabasePassworld().split(","); 40 Connection conn; 41 Class.forName("com.mysql.jdbc.Driver"); 42 String pwd = ""; 43 if (add.length<=2) { 44 pwd = ""; 45 }else{ 46 pwd = add[2]; 47 } 48 49 conn = DriverManager.getConnection(add[0], add[1], pwd); 50 conn.setAutoCommit(false); 51 // 保存当前自动提交模式 52 boolean autoCommit = conn.getAutoCommit(); 53 // 关闭自动提交 54 conn.setAutoCommit(false); 55 Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); 56 //声明变量手机唯一标识拼接字符串用于sql语句 57 String imeis = ""; 58 Map<String, PhoneEntity> maps = new HashMap<String, WechatPhoneEntity>(); 59 if (StringUtil.isNotEmpty(phones)) { 60 JSONArray arrays = JSONArray.fromObject(phones); 61 System.out.println("手机数据存储开始执行操作!!!!"); 62 for (Object array : arrays) { 63 JSONObject object=JSONObject.fromObject(array); 64 PhoneEntity phone = (PhoneEntity)JSONObject.toBean(object,PhoneEntity.class); 65 String imei = phone.getImei(); 66 if (StringUtils.isNumeric(imeis)) { 67 imeis = imeis + ",'" + imei + "'"; 68 }else { 69 imeis = "'" + imei + "'"; 70 } 71 //把手机表用手机唯一标识作为键放在map集合中 72 maps.put(imei, phone); 73 } 74 } 75 76 //把微信表数据存储在数据库 (这个方法就不写了 其实就是一个数据存储到数据库中的方法 和下边这个一样) 77 // boolean tu = getWechatInfos(wechatInfos); 78 if (tu) { 79 //把微信表数据存储在数据库 80 // boolean tus = getWechatInfoWxs(phoneWxs); 81 if (tus) { 82 if (StringUtil.isNotEmpty(phones)) { 83 String hql = " from PhoneEntity where imei in("+imeis+")"; 84 List<PhoneEntity> Phones1 = systemService.findByQueryString(hql); 85 if (Phones1.size() >0) { 86 for (PhoneEntity Phone : Phones1) { 87 String imei1 = Phone.getImei(); 88 //在maps集合中把手机实体表数据取出 89 PhoneEntity phone2 = maps.get(Phone.getImei()); 90 if (null != phone2) { 91 stmt.addBatch("update phone set create_date = '"+sdf.format(phone2.getCreateDate())+"',imei = '"+phone2.getImei()+"'" 92 + ",type = '"+phone2.getType()+"',status = '"+phone2.getStatus()+"',is_root = '"+phone2.getIsRoot()+"'" 93 + ",soft_version = '"+phone2.getSoftVersion()+"',is_info_plugin = '"+phone2.getIsInfoPlugin()+"',phone_os = '"+phone2.getPhoneOs()+"'" 94 + ",brand = '"+phone2.getBrand()+"',only_num = '"+phone2.getOnlyNum()+"' where id = '"+Phone.getId()+"'"); 95 96 if (i % 1000 == 0 || i == Phones1.size()) { 97 try { 98 stmt.executeBatch(); 99 stmt.clearBatch(); 100 conn.commit(); 101 } catch (Exception e) { 102 conn.close(); 103 e.printStackTrace(); 104 } 105 } 106 i = i + 1; 107 } 108 //删除掉maps集合中已经把数据放在数据库手机表中的数据 109 maps.remove(imei1); 110 } 111 } 112 if (maps.size() > 0) { 113 i = 1; 114 //把maps集合循环遍历 115 for (String key : maps.keySet()) { 116 Entity phone = maps.get(key); 117 if (null != phone) { 118 stmt.addBatch("insert into phone set id = '"+phone.getId()+"',create_date = '"+sdf.format(phone.getCreateDate())+"',imei = '"+phone.getImei()+"'" 119 + ",person_id = null,person_name = null,dept_id = null" 120 + ",dept_name = null,type = '"+phone.getType()+"',status = '"+phone.getStatus()+"',is_root = '"+phone.getIsRoot()+"'" 121 + ",soft_version = '"+phone.getSoftVersion()+"',is_info_plugin = '"+phone.getIsInfoPlugin()+"',phone_os = '"+phone.getPhoneOs()+"'" 122 + ",brand = '"+phone.getBrand()+"',only_num = '"+phone.getOnlyNum()+"'"); 123 if (i % 1000 == 0 || i == maps.size()) { 124 try { 125 stmt.executeBatch(); 126 stmt.clearBatch(); 127 conn.commit(); 128 } catch (Exception e) { 129 conn.close(); 130 e.printStackTrace(); 131 } 132 } 133 } 134 i = i + 1; 135 } 136 } 137 conn.close(); 138 //成功返回ok 139 str = "ok"; 140 }else { 141 str = "ok"; 142 } 143 }else { 144 System.out.println("数据存储结束执行失败???"); 145 } 146 }else { 147 System.out.println("数据存储结束执行失败???"); 148 } 149 System.out.println("数据存储结束执行操作!!!!"); 150 return str; 151 }
  • 相关阅读:
    控件右键菜单的实现以及选中后勾选
    DataGridView控件使用
    return,continue,break的区别
    break和continue的区别 循环终止办法
    事件
    跨线程改变控件属性 线程调用带参数方法
    XML配置文件相关
    抽象类及与接口的区别
    字典
    Oracle学习第一天
  • 原文地址:https://www.cnblogs.com/zmmfeng/p/10132042.html
Copyright © 2020-2023  润新知