Springboot 2.1.5 + Websocket 集成交互式頁面響應

先上效果圖,頁面與後端交互:

http://localhost:8088/index

第一步:開始上核心代碼

package com.xing.websocket.web.config;

/**
 * @Class AppConfig
 * @Author 作者姓名:劉興
 * @Version 1.0
 * @Date 創建時間:2020-03-21 11:48
 * @Copyright Copyright by Liuxing
 * @Direction 類說明
 */
public class AppConfig {

    /**
     * 被訂閱的頻道-消息
     */
    public static final String SUBSCRIBE = "/topic/message";

    /**
     * 被訂閱的頻道-價格波動
     */
    public static final String SUBSCRIBE_MARKET = "/topic/market";

    /**
     * stomp節點
     */
    public static final String ENDPOINT = "/webSocketServer";
    /**
     * 消息代理
     */
    public static final String BROKER = "/topic";

}
package com.xing.websocket.web.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;

/**
 * @title websocket配置
 * @author yc 2018年5月21日
 */
@Configuration
//表示開啓使用STOMP協議來傳輸基於代理的消息,Broker就是代理的意思。
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    /**
     * @title 用來配置消息代理,由於我們是實現推送功能,這裏的消息代理是/topic
     * @author yc 2018年5月21日
     */
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        // 訂閱Broker名稱
        registry.enableSimpleBroker(AppConfig.BROKER  );
        // 全局使用的消息前綴(客戶端訂閱路徑上會體現出來)
        registry.setApplicationDestinationPrefixes("/app");
        // 點對點使用的訂閱前綴(客戶端訂閱路徑上會體現出來),不設置的話,默認也是/user/
        //registry.setUserDestinationPrefix("/user/");
    }


    /**
     * @title 表示註冊STOMP協議的節點,並指定映射的URL。
     * @author yc 2018年5月21日
     */
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {

        // 允許使用socketJs方式訪問,訪問點爲webSocketServer,允許跨域
        // 在網頁上我們就可以通過這個鏈接
        // http://localhost:8080/webSocketServer
        // 來和服務器的WebSocket連接
        registry.addEndpoint(AppConfig.ENDPOINT )
                .addInterceptors(new HttpSessionHandshakeInterceptor() )
                .setAllowedOrigins("*")
                .withSockJS();
    }

}

package com.xing.websocket.util.websocket;

import com.xing.websocket.web.var.SystemVarConstants;
import com.xing.websocket.web.config.AppConfig;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @Class WebSocketBasicUtils
 * @Author 作者姓名:劉興
 * @Version 1.0
 * @Date 創建時間:2020-04-02 14:33
 * @Copyright Copyright by Liuxing
 * @Direction 類說明
 */
public class WebSocketBasicUtils {

    public final static Logger logger = LoggerFactory.getLogger( WebSocketBasicUtils.class );

    public static void sendMessageToTopic( String subScribeType , String message ){
        //廣播開始發威
        if( SystemVarConstants.simpMessagingTemplate != null && StringUtils.isNotBlank( subScribeType )){
            switch ( subScribeType ){
                case AppConfig.SUBSCRIBE: {
                    //消息廣播給所有註冊到 AppConfig.SUBSCRIBE 的客戶端
                    SystemVarConstants.simpMessagingTemplate.convertAndSend( AppConfig.SUBSCRIBE , message ) ;
                }
                case AppConfig.SUBSCRIBE_MARKET: {
                    SystemVarConstants.simpMessagingTemplate.convertAndSend( AppConfig.SUBSCRIBE_MARKET , message ) ;
                }
            }
        }else{
            logger.error( "..... SystemVarConstants.simpMessagingTemplate is null ....." );
        };
    }

}
package com.xing.websocket.util.websocket;

import com.xing.websocket.web.config.AppConfig;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.MessageFormat;
import java.util.Formatter;

/**
 * @Class WebSocketMarketUtils
 * @Author 作者姓名:劉興
 * @Version 1.0
 * @Date 創建時間:2020-03-24 10:14
 * @Copyright Copyright by Liuxing
 * @Direction 類說明
 */
public class WebSocketMarketUtils extends WebSocketBasicUtils {

    private static Logger logger = LoggerFactory.getLogger( WebSocketMarketUtils.class ) ;

    private final static String INFO = "INFO" ;
    private final static String WARN = "WARN" ;
    private final static String ERROR = "ERROR" ;

    /****
     * 給綁定到:AppConfig.SUBSCRIBE_SPIDER_MARKET 的鏈接發送數據
     * @param message
     */
    public static void sendSpiderMessage( String message ){
        if(  StringUtils.isNotBlank( message )) {
            logger.info(message);
            if(  StringUtils.isNotBlank( message )) {
                sendMessageToTopic( AppConfig.SUBSCRIBE_MARKET , message );
            }
        }
    }

    /***
     * 模擬slf4j打印日誌的方式傳入值
     * @param message
     * @param data
     */
    private static void sendMessage( String message , String level , Object... data ){
        if(StringUtils.isNotBlank( message ) && data != null ) {
            //message = message.replace("{}" , "%s") ;
            message = MessageFormat.format(message, data);
            if( WARN.equals( level ) ){
                message = new StringBuilder("<span style='color:orangered;'>").append( message ).append( "</span>" ).toString()  ;
            }else if( ERROR.equals( level ) ){
                message = new StringBuilder("<span style='color:chocolate;'>").append( message ).append( "</span>" ).toString()  ;
            }
            sendSpiderMessage( message )  ;
        }else{
            logger.error( "..... paramter is null ....." );
        };
    }

    /***
     * 模擬slf4j打印-ERROR-日誌的方式傳入值
     * @param message
     * @param data
     */
    public static void sendErrorSpiderMessage( String message , Object... data ){
        sendMessage( message , ERROR , data ) ;
    }

    /***
     * 模擬slf4j打印-ERROR-日誌的方式傳入值
     * @param message
     * @param data
     */
    public static void sendWarnSpiderMessage( String message , Object... data ){
        sendMessage( message , WARN , data ) ;
    }

    /***
     * 模擬slf4j打印-INFO-日誌的方式傳入值
     * @param message
     * @param data
     */
    public static void sendSpiderMessage( String message , Object... data ){
        sendMessage( message , INFO , data ) ;
    }




}
package com.xing.websocket.web.runner;

import com.xing.websocket.web.var.SystemVarConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Component;

/**
 * @Class SpiderCommandLineRunner
 * @Author 作者姓名:劉興
 * @Version 1.0
 * @Date 創建時間:2020-03-24 09:33
 * @Copyright Copyright by Liuxing
 * @Direction 類說明       系統初始化啓動時會進入
 * 實現了 CommandLineRunner 接口的 Component 會在所有 Spring Beans 初始化完成之後, 在 SpringApplication.run() 執行之前完成
 */
@Component
public class SpiderCommandLineRunner implements CommandLineRunner {

    private Logger logger =  LoggerFactory.getLogger(SpiderCommandLineRunner.class);

    @Autowired
    private SimpMessagingTemplate simpMessagingTemplate ;

    @Override
    public void run(String... args) throws Exception {
        logger.info("...init resources by implements CommandLineRunner...");
        SystemVarConstants.simpMessagingTemplate = simpMessagingTemplate ;
        logger.info(" 初始化系統 WebSocket 消息模板: SystemVarConstants.simpMessagingTemplate ....");
    }

}
package com.xing.websocket.web.var;

import org.springframework.messaging.simp.SimpMessagingTemplate;

/**
 * @Class SystemVarConstants
 * @Author 作者姓名:劉興
 * @Version 1.0
 * @Date 創建時間:2020/2/17 13:14
 * @Copyright Copyright by
 * @Direction 類說明
 */
public class SystemVarConstants {

    public static SimpMessagingTemplate simpMessagingTemplate ;     // 簡單的消息推送模板

}

具體邏輯我就不說了,請直接上碼雲取吧!

碼雲地址:https://gitee.com/diandeng/springboot-model

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章