国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

websocket實時推送統(tǒng)計數(shù)據(jù)給前端頁面

這篇具有很好參考價值的文章主要介紹了websocket實時推送統(tǒng)計數(shù)據(jù)給前端頁面。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

  • 前提須知:websocket基本使用

  • 業(yè)務場景,每秒推送統(tǒng)計數(shù)據(jù)給前端頁面,分別顯示前天,昨天,今天的前十名客戶數(shù)據(jù)

連接觸發(fā)業(yè)務定義

  • @ServerEndpoint("/smsMCustomerStaTop10Ws")定義推送數(shù)據(jù)給到具體的連接標識
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.xyc.monitor.service.SmsMonitorService;
import com.xyc.monitor.service.impl.SmsMonitorServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * Top10客戶發(fā)送量推送
 */
@Component
@ServerEndpoint(value = "/smsMCustomerStaTop10Ws")
public class SmsMCustomerStaTop10Ws {

    private static final Logger LOGGER = LoggerFactory.getLogger(SmsMCustomerStaTop10Ws.class);


    //靜態(tài)變量,用來記錄當前在線連接數(shù)。應該把它設計成線程安全的。
    private static int onlineCount = 0;

    //concurrent包的線程安全Set,用來存放每個客戶端對應的當前對象。
    private static Set<SmsMCustomerStaTop10Ws> webSocketSet = new CopyOnWriteArraySet<SmsMCustomerStaTop10Ws>();

    private static Map<Session,Integer> map = new ConcurrentHashMap<>();

    //與某個客戶端的連接會話,需要通過它來給客戶端發(fā)送數(shù)據(jù)
    private Session session;
    //客戶端傳過來的參數(shù) ,ip:port
    private String parameter;

    private static SmsMonitorService smsMonitorService;

    @Autowired
    public void setSmsMonitorService(SmsMonitorService smsMonitorService) {
        SmsMCustomerStaTop10Ws.smsMonitorService = smsMonitorService;
    }

    /**
     *  連接建立成功調(diào)用的方法
     * @param session
     */
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        webSocketSet.add(this);     //加入set中
        addOnlineCount();           //在線數(shù)加1
        LOGGER.info("SmsMCustomerStaTop10Ws ===> 有新連接加入!當前在線人數(shù)為" + getOnlineCount());
    }

    /**
     * 連接關閉調(diào)用的方法
     */
    @OnClose
    public void onClose() {

        map.remove(this.session);
        //UDPMsgQueueStatusClient.removeUdpClient(parameter);
        webSocketSet.remove(this);  //從set中刪除
        subOnlineCount();           //在線數(shù)減1
        LOGGER.info("SmsMCustomerStaTop10Ws ===> 有一連接關閉!當前在線人數(shù)為" + getOnlineCount());
    }

    /**
     * 收到客戶端消息后調(diào)用的方法
     *
     * @param message 客戶端發(fā)送過來的消息
     *
     * */
    @OnMessage
    public void onMessage(String message, Session session) {
        //關閉前一個udp
        //UDPMsgQueueStatusClient.removeUdpClient(parameter);
        //this.parameter = message;
        JSONArray objects = JSON.parseArray(message);
        //JSONObject jso = JSON.parseObject(message);
        Integer status= objects.getJSONObject(0).getInteger("status");
        //SmsMonitorServiceImpl.statusSCSSo = status;
        map.put(session,status);
        LOGGER.info("SmsMCustomerStaTop10Ws ===> 來自客戶端的消息:" + message);
    }

    /**
     * 發(fā)生錯誤時調(diào)用
     */
    @OnError
    public void onError(Session session, Throwable error) {
        LOGGER.info("SmsMCustomerStaTop10Ws 發(fā)生錯誤");
        LOGGER.error("onError ===> ", error);
    }

    /**
     * 推送觸發(fā)
     */
    private static void pushTrigger() {
        if(SmsMCustomerStaTop10Ws.onlineCount >= 1) {
            if(!SmsMonitorServiceImpl.isPushSCS)
                SmsMonitorServiceImpl.isPushSCS = true;
            smsMonitorService.pushSmsMCustomerStaTop10();

        }
        if(SmsMCustomerStaTop10Ws.onlineCount == 0) {
            SmsMonitorServiceImpl.isPushSCS = false;
        }
    }

    /**
     *  發(fā)送文本類型消息  192.168.3.146:10086
     * @throws IOException
     */
    public static void sendInfo(Integer status,Object obj) throws IOException {
        for (SmsMCustomerStaTop10Ws item : webSocketSet) {
            try {
                Session session = item.session;
                Integer integer = map.get(session);
                if(integer == status){
                    item.session.getBasicRemote().sendText(JSON.toJSONString(obj));
                }else{
                    continue;
                }
            } catch (Exception e) {
                LOGGER.info("SmsMCustomerStaTop10Ws ===> 發(fā)送文本消息錯誤", e);
            }
        }
    }

    public static synchronized int getOnlineCount() {
        return onlineCount;
    }

    public static synchronized void addOnlineCount() {
        SmsMCustomerStaTop10Ws.onlineCount++;
        pushTrigger();
    }

    public static synchronized void subOnlineCount() {
        SmsMCustomerStaTop10Ws.onlineCount--;
        pushTrigger();
    }
}

使用到的業(yè)務方法

  • 以上onOpen()方法最終觸發(fā)的業(yè)務方法smsMonitorService.pushSmsMCustomerStaTop10();

/**
     * 記錄線程數(shù),保證只創(chuàng)建一個線程
     */
    private volatile static int threadCountSCS = 0;
  /**
     * 數(shù)據(jù)推送開關,是否推送數(shù)據(jù)到前端,默認關閉
     */
    public static boolean isPushSCS = false;
      /**
     * 今日1,昨天2,前天3 數(shù)據(jù) 默認今日
     */
     
    private static ImmutableSet<Integer> statusSCS = ImmutableSet.of(1, 2, 3);
    
 @Override
    public void pushSmsMCustomerStaTop10() {
        if (threadCountSCS >= 1)
            return;
            
      threadCountSCS++;
      
        new Thread() {
            public void run() {
              
                Thread.currentThread().setName("pushSmsMCustomerStaTop10-" + threadCountSCS);
                System.out.println("top10客戶發(fā)送量推送服務線程啟動");
                while (isPushSCS) {
                    for (Integer statusSC : statusSCS) {
                        try {
                            List<SmsMCustomerStaVo> smsMCustomerStaTop10 = smsMonitorMapper.findSmsMCustomerStaTop10(statusSC);
                            List<SmsMCustomerStaView> smsMCustomerStaViewList = new ArrayList<>();
                            int i = 1;
                            for (SmsMCustomerStaVo sm : smsMCustomerStaTop10) {
                                SmsMCustomerStaView smsMCustomerStaView = new SmsMCustomerStaView();
                                smsMCustomerStaView.setId(i);
                                smsMCustomerStaView.setShortName(SmsSymbol.customerMap.get(sm.getCustomerNo()).getShortName());
                                smsMCustomerStaView.setCustomerName(SmsSymbol.customerMap.get(sm.getCustomerNo()).getName());
                                smsMCustomerStaView.setSubmitCount(sm.getAllCount());
                                Integer issueCount = sm.getSendSuccessCount() + sm.getSendFailCount() + sm.getSubmitSuccessCount(); //下發(fā)總量 = 總量除開提交失敗
                                smsMCustomerStaView.setIssueCount(issueCount);
                                //成功率(前30分鐘成功率)
                                Double sendSuccessCountRate = 0D;
                                if(sm != null && sm.getAllCountThirty() != null &&  sm.getAllCountThirty() != 0){
                                    sendSuccessCountRate = sm.getSendSuccessCountThirty() / sm.getAllCountThirty().doubleValue();
                                }
                                //未知率
                                Double unknownRateRate = 0D;
                                if(sm != null && sm.getAllCount() != null && sm.getAllCount() != 0){
                                    //sendSuccessCountRate = sm.getSendSuccessCount() / issueCount.doubleValue(); //發(fā)送成功率
                                    unknownRateRate = sm.getSubmitSuccessCount() / sm.getAllCount().doubleValue(); //未知率 = 提交成功 / 提交總量
                                }
                                smsMCustomerStaView.setSuccessRate(sendSuccessCountRate == 0 ?"0%":new DecimalFormat("#0.00").format(sendSuccessCountRate * 100) + "%");
                                smsMCustomerStaView.setUnknownRate(unknownRateRate == 0 ?"0%":new DecimalFormat("#0.00").format(unknownRateRate * 100) + "%");
                                i++;
                                smsMCustomerStaViewList.add(smsMCustomerStaView);
                            }
                            //List<SmsMCustomerStaView> collect = smsMCustomerStaViewList.stream().sorted(Comparator.comparing(SmsMCustomerStaView::getSubmitCount).reversed()).collect(Collectors.toList());
                            SmsMCustomerStaTop10Ws.sendInfo(statusSC,smsMCustomerStaViewList);

                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            log.error("top10客戶發(fā)送量推送服務報錯",e );
                        }
                    }
                    try {
                      Thread.sleep(1000);
                    }catch (Exception e){
                        System.out.println(e);
                    }
                }
                System.out.println("top10客戶發(fā)送量推送服務線程停止");
                threadCountSCS--;
            }
        }.start();
    }

涉及的查詢sql

  • 以上smsMonitorMapper.findSmsMCustomerStaTop10(statusSC);(傳參區(qū)分查 前日/昨日/今日 數(shù)據(jù))
  • oracle數(shù)據(jù)庫查詢語句
<select id="findSmsMCustomerStaTop10" resultMap="SmsMCustomerStaResultMap">
		select t.* from (
		 SELECT SUM(ALL_COUNT) ALL_COUNT,SUM(SUBMIT_SUCCESS_COUNT) SUBMIT_SUCCESS_COUNT,SUM(SUBMIT_FAIL_COUNT) SUBMIT_FAIL_COUNT,
		 SUM(SEND_SUCCESS_COUNT) SEND_SUCCESS_COUNT,SUM(SEND_FAIL_COUNT) SEND_FAIL_COUNT,SUM(ALL_COUNT_THIRTY) ALL_COUNT_THIRTY,
		SUM(SEND_SUCCESS_COUNT_THIRTY) SEND_SUCCESS_COUNT_THIRTY,CUSTOMER_NO
		 FROM SMS_M_CUSTOMER_STA
		 <if test="statusSCS == 1">
			 WHERE STA_DATE_TIME >= trunc(sysdate)
		 </if>
		<if test="statusSCS == 2">
			WHERE STA_DATE_TIME >= trunc(sysdate-1) AND STA_DATE_TIME <![CDATA[ < ]]> trunc(sysdate)
		</if>
		<if test="statusSCS == 3">
			WHERE STA_DATE_TIME >= trunc(sysdate-2) AND STA_DATE_TIME <![CDATA[ < ]]> trunc(sysdate-1)
		</if>
	    GROUP BY CUSTOMER_NO ORDER BY ALL_COUNT DESC)t where rownum &lt;= 20
	</select>

推送數(shù)據(jù)給前端演示圖

前端實現(xiàn)websocket實時推送,實操,websocket,前端,java文章來源地址http://www.zghlxwxcb.cn/news/detail-551371.html

到了這里,關于websocket實時推送統(tǒng)計數(shù)據(jù)給前端頁面的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【實時數(shù)倉】介紹、需求分析、統(tǒng)計架構分析和ods層日志行為數(shù)據(jù)采集

    【實時數(shù)倉】介紹、需求分析、統(tǒng)計架構分析和ods層日志行為數(shù)據(jù)采集

    普通的實時計算 優(yōu)先考慮時效性,所以從數(shù)據(jù)源采集經(jīng)過實時計算直接得到結果。如此做時效性更好,但是弊端是由于計算過程中的中間結果沒有沉淀下來,所以當面對大量實時需求的時候,計算的復用性較差(如B想要使用A的結果),開發(fā)成本隨著需求增加直線上升。 實時

    2023年04月23日
    瀏覽(39)
  • 《尚賢達獵頭網(wǎng)站流量統(tǒng)計模塊》,通過HTTP自定義模塊實時獲取asp.net網(wǎng)站訪問流量,并保存到數(shù)據(jù)庫

    開發(fā)了個網(wǎng)站流量統(tǒng)計模塊,實時獲取asp.net網(wǎng)站訪問流量,并保存到數(shù)據(jù)庫。 一、功能: 通過HTTP自定義模塊實時獲取網(wǎng)站流量 二、支持平臺:windows+IIS 三、安裝方法: 1、將文件www.sunsharer.cn.dll復制到網(wǎng)站bin目錄下; 2、將配置好的sqlstr.txt復制到網(wǎng)站bin目錄下; 3、將數(shù)據(jù)

    2024年01月16日
    瀏覽(24)
  • websocket多實例推送解決方案-數(shù)據(jù)實時展示

    websocket多實例推送解決方案-數(shù)據(jù)實時展示

    需求 需要前端展示實時的訂單數(shù)據(jù)信息。如下圖所示,實時下單實時頁面統(tǒng)計更新展示 ? 思路方案 前端使用websocket 建立通信?? 后端監(jiān)聽數(shù)據(jù)庫的binglog變更,實時得到最新數(shù)據(jù),推送到前端? 現(xiàn)狀及問題 客戶端想實現(xiàn)實時獲取數(shù)據(jù)的變更,使用了websocket+kafkaMq,當數(shù)據(jù)庫變

    2024年02月03日
    瀏覽(26)
  • webSocket實現(xiàn)數(shù)據(jù)的實時推送(附:前后端代碼)

    ? ? ? ? 之前開發(fā)的一個管理系統(tǒng)項目中,首頁是數(shù)據(jù)大屏展示,一開始我是用JS的 setInterval() 方法,設置一個時間,每過時間發(fā)起一次 ajax 請求。雖然也能湊活著用,但總感覺不是最優(yōu)的方法,而且還比較占用資源,所以學習 WebSocke ,以下是本人的一些學習心得及前后端的

    2024年02月02日
    瀏覽(22)
  • WebSocket:實現(xiàn)實時互動、數(shù)據(jù)推送的利器,你了解多少

    WebSocket:實現(xiàn)實時互動、數(shù)據(jù)推送的利器,你了解多少

    WebSocket技術是一種基于TCP協(xié)議的全雙工通信協(xié)議,它允許瀏覽器和服務器之間進行實時、雙向的通信。相比傳統(tǒng)的HTTP請求-響應模式,WebSocket提供了持久連接,可以實時地推送數(shù)據(jù),減少了通信的延遲。 WebSocket的工作原理是通過建立一條持久連接來實現(xiàn)實時通信。首先,瀏覽

    2024年01月18日
    瀏覽(22)
  • 【Spring Boot 實現(xiàn) WebSocket實時數(shù)據(jù)推送-服務端】

    【Spring Boot 實現(xiàn) WebSocket實時數(shù)據(jù)推送-服務端】

    一、WebSocket配置類 二、WebSocket服務端類 三、WebSocket的連接池類 四、啟動Spring Boot服務 五、測試WebSocket連接 WebSocket在線測試工具: http://www.easyswoole.com/wstool.html 測試連接 服務地址:ws://172.18.42.29:14785/endPoint/1 服務啟動的IP:172.18.42.29 服務端口:14785 WS的URl:/endPoint 入?yún)ⅲ? 六

    2023年04月25日
    瀏覽(33)
  • vue和node使用websocket實現(xiàn)數(shù)據(jù)推送,實時聊天

    vue和node使用websocket實現(xiàn)數(shù)據(jù)推送,實時聊天

    需求:node做后端根據(jù)websocket,連接數(shù)據(jù)庫,數(shù)據(jù)庫的字段改變后,前端不用刷新頁面也能更新到數(shù)據(jù),前端也可以發(fā)送消息給后端,后端接受后把前端消息做處理再推送給前端展示 使用node ./app.js運行項目 在需要使用websocket連接的頁面引入 默認如下: id為243 在數(shù)據(jù)庫改為

    2024年02月15日
    瀏覽(30)
  • Vue使用WebSocket實現(xiàn)實時獲取后端推送的數(shù)據(jù)。

    Vue可以使用WebSocket實現(xiàn)實時獲取后端推送的數(shù)據(jù)。 1.在Vue項目中安裝WebSocket庫 可以使用npm或yarn安裝WebSocket庫: 2.創(chuàng)建WebSocket連接 在Vue組件中創(chuàng)建WebSocket連接,連接到后端WebSocket服務器,代碼如下: 上面的代碼中,使用WebSocket連接到后端WebSocket服務器,通過監(jiān)聽onmessage事件,

    2024年02月08日
    瀏覽(26)
  • 多個數(shù)據(jù)webSocket推送太快導致前端渲染卡頓問題優(yōu)化

    作者代碼寫的不怎么樣,諒解!主要思路就是把websocket接收到的數(shù)據(jù)用一個數(shù)組暫存起來,達到一定數(shù)量一起修改統(tǒng)一渲染,可根據(jù)項目數(shù)據(jù)推送數(shù)據(jù)的速度適當調(diào)解數(shù)組大小,然后再加了一個可能一段時間內(nèi)都到不到數(shù)組達標渲染數(shù)量,就使用定時器直接做渲染,防止數(shù)據(jù)

    2024年02月12日
    瀏覽(27)
  • 大數(shù)據(jù)(二)大數(shù)據(jù)行業(yè)相關統(tǒng)計數(shù)據(jù)

    大數(shù)據(jù)(二)大數(shù)據(jù)行業(yè)相關統(tǒng)計數(shù)據(jù)

    目錄 一、大數(shù)據(jù)相關的各種資訊 二、轉載自網(wǎng)絡的大數(shù)據(jù)統(tǒng)計數(shù)據(jù) 2.1、國家大數(shù)據(jù)政策 2.2、產(chǎn)業(yè)結構分析 2.3、應用結構分析 2.4、數(shù)據(jù)中心 2.5、云計算 1. ? ?據(jù)IDC預測,到2025年全球 數(shù)據(jù)產(chǎn)生量將達到180ZB ,其中物聯(lián)網(wǎng)設備將占據(jù)很大一部分。 2. ? ?據(jù)Gartner預測,到2021年

    2024年02月10日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包