Ver código fonte

1.重连
———— by qlm

qlm 4 anos atrás
pai
commit
02fed42d6c

+ 26 - 0
src/main/java/com/xc/utils/task/websocket/pingpongTask.java

@@ -0,0 +1,26 @@
+package com.xc.utils.task.websocket;
+
+import com.xc.utils.websocket.WsClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+
+@Component
+public class pingpongTask {
+    private static final Logger log = LoggerFactory.getLogger(pingpongTask.class);
+
+
+
+
+        /*
+        检测是否在线
+         */
+    @Scheduled(cron = "0/30 * * * * ? ")
+    public void sendPing() {
+        WsClient.getThis().sendWsPing();
+    }
+
+}
+

+ 95 - 52
src/main/java/com/xc/utils/websocket/WsClient.java

@@ -14,6 +14,7 @@ import java.math.BigDecimal;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.UUID;
 
 public class WsClient extends WebSocketClient {
 
@@ -48,32 +49,70 @@ public class WsClient extends WebSocketClient {
 
     @Override
     public void onClose(int arg0, String arg1, boolean arg2) {
-        if(arg0==1006||arg0==1001){
-            Thread thread=new Thread(new Runnable() {
-                @Override
-                public void run() {
-                    try {
-                        boolean b = false ;
-                        while(!b){
-                            try {
-                                String url = PropertiesUtil.getProperty("ws.url");
-                                WsClient myClient = new WsClient(new URI(url));
-                                myClient.connect();
-                                Thread.sleep(5000);
-                                if(myClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)){
-                                    b = true;
-                                    System.out.println("订阅成功555");
-                                }
-                            } catch (Exception e) {
-                                e.printStackTrace();
-                            }
+//        if(arg0==1006||arg0==1001){
+//            Thread thread=new Thread(new Runnable() {
+//                @Override
+//                public void run() {
+//                    try {
+//                        boolean b = false ;
+//                        while(!b){
+//                            try {
+//                                String url = PropertiesUtil.getProperty("ws.url");
+//                                WsClient myClient = new WsClient(new URI(url));
+//                                myClient.connect();
+//                                Thread.sleep(5000);
+//                                if(myClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)){
+//                                    b = true;
+//                                    System.out.println("订阅成功555");
+//                                }
+//                            } catch (Exception e) {
+//                                e.printStackTrace();
+//                            }
+//                        }
+//                    }catch (Exception e){
+//                        e.printStackTrace();
+//                    }
+//                }
+//            });
+//            thread.start();
+//        }
+    }
+
+    static String sping = "1" ;
+    static boolean is = false;
+    public void sendWsPing(){
+        sping = UUID.randomUUID().toString().replace("-","");
+        is = false;
+        if(!instance.getReadyState().equals(WebSocket.READYSTATE.OPEN)){ // 如果客户端检测到 不在线那么主动连接
+            try {
+                String url = PropertiesUtil.getProperty("ws.url");
+                WsClient myClient = new WsClient(new URI(url));
+                myClient.connect();
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+        }else {
+            instance.send("ping:"+sping);
+            //5秒内还没返回 或返回的不是传过去的ping 则 重连一次
+            int i = 0 ;
+            while(!is){
+                try {
+                    i++;
+                    Thread.sleep(1000);
+                    if(i==5){
+                        String url = PropertiesUtil.getProperty("ws.url");
+                        WsClient myClient = new WsClient(new URI(url));
+                        myClient.connect();
+                        if(myClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)){
+                            is = true;
+                            System.out.println("订阅成功555");
                         }
-                    }catch (Exception e){
-                        e.printStackTrace();
+                        break;
                     }
+                } catch (Exception e) {
+                    e.printStackTrace();
                 }
-            });
-            thread.start();
+            }
         }
     }
 
@@ -95,36 +134,40 @@ public class WsClient extends WebSocketClient {
                 if(StringUtils.isNotBlank(arg0)){
                     if(arg0.contains("testws")){
                         System.out.println(arg0);
+                    }else if(arg0.equals("pong:"+sping)) {
+                        is = true ;
+                    }else {
+                        // 存储信息至redis
+                        JSONObject parse = (JSONObject) JSONObject.parse(arg0);
+                        StockVO stockVO = new StockVO();
+                        stockVO.setId(parse.getInteger("id"));
+                        stockVO.setName(parse.getString("name"));
+                        stockVO.setCode(parse.getString("code"));
+                        stockVO.setSpell(parse.getString("spell"));
+                        stockVO.setGid(parse.getString("gid")+"_bb");
+                        stockVO.setNowPrice(parse.get("nowPrice")+"");
+                        stockVO.setHcrate(new BigDecimal(parse.get("hcrate")+""));
+                        stockVO.setToday_max(parse.get("today_max")+"");
+                        stockVO.setToday_min(parse.get("today_min")+"");
+                        stockVO.setBusiness_balance(parse.get("business_balance")+"");
+                        stockVO.setBusiness_amount(parse.get("business_amount")+"");
+                        stockVO.setPreclose_px(parse.get("preclose")+"");
+                        stockVO.setOpen_px(parse.get("open")+"");
+                        stockVO.setTransState(parse.getInteger("transState"));
+                        stockVO.setDepositAmt(parse.getInteger("depositAmt"));
+                        stockVO.setMinImg(parse.getString("minImg"));
+                        stockVO.setDayImg(parse.getString("dayImg"));
+                        stockVO.setWeekImg(parse.getString("weekImg"));
+                        stockVO.setMonthImg(parse.getString("monthImg"));
+                        stockVO.setChange(parse.get("change")+"");
+                        List<StockVO> stockVOList = new ArrayList<>();
+                        stockVOList.add(stockVO);
+                        initStockListServiceBiz.updateListInfo(stockVOList);
+                        initStockListServiceBiz.updateInfo(stockVO);
+                        // 处理数据 并 推送给 客户
+//                        new WebSocketController().sendSysMsg("all",arg0);
                     }
-                    // 存储信息至redis
-                    JSONObject parse = (JSONObject) JSONObject.parse(arg0);
-                    StockVO stockVO = new StockVO();
-                    stockVO.setId(parse.getInteger("id"));
-                    stockVO.setName(parse.getString("name"));
-                    stockVO.setCode(parse.getString("code"));
-                    stockVO.setSpell(parse.getString("spell"));
-                    stockVO.setGid(parse.getString("gid")+"_bb");
-                    stockVO.setNowPrice(parse.get("nowPrice")+"");
-                    stockVO.setHcrate(new BigDecimal(parse.get("hcrate")+""));
-                    stockVO.setToday_max(parse.get("today_max")+"");
-                    stockVO.setToday_min(parse.get("today_min")+"");
-                    stockVO.setBusiness_balance(parse.get("business_balance")+"");
-                    stockVO.setBusiness_amount(parse.get("business_amount")+"");
-                    stockVO.setPreclose_px(parse.get("preclose")+"");
-                    stockVO.setOpen_px(parse.get("open")+"");
-                    stockVO.setTransState(parse.getInteger("transState"));
-                    stockVO.setDepositAmt(parse.getInteger("depositAmt"));
-                    stockVO.setMinImg(parse.getString("minImg"));
-                    stockVO.setDayImg(parse.getString("dayImg"));
-                    stockVO.setWeekImg(parse.getString("weekImg"));
-                    stockVO.setMonthImg(parse.getString("monthImg"));
-                    stockVO.setChange(parse.get("change")+"");
-                    List<StockVO> stockVOList = new ArrayList<>();
-                    stockVOList.add(stockVO);
-                    initStockListServiceBiz.updateListInfo(stockVOList);
-                    initStockListServiceBiz.updateInfo(stockVO);
-                    // 处理数据 并 推送给 客户
-                    new WebSocketController().sendSysMsg("all",arg0);
+
                 }
 
         }catch (Exception e){