springboot支持webSocket和stomp實現消息訂閱通知示例


先導入支持websocket的jar包,這里用Gradle構建的項目:
dependencies {
    compile('org.springframework.boot:spring-boot-starter-websocket')
}
webSocket的配置文件,實現了WebSocketMessageBrokerConfigurer接口:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        //允許使用socketJs方式訪問,訪問點為webSocket,允許跨域
        //在網頁上我們就可以通過這個鏈接
        //ws://127.0.0.1:2222/webSocket來和服務器的WebSocket連接
        registry.addEndpoint("/webSocket").setAllowedOrigins("*");
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        //基於內存的STOMP消息代理來代替mq的消息代理
        //訂閱Broker名稱,/user代表點對點即發指定用戶,/topic代表發布廣播即群發
        registry.enableSimpleBroker("/user", "/topic");
        //點對點使用的訂閱前綴,不設置的話,默認也是/user/
        registry.setUserDestinationPrefix("/user/");
    }
}

Javascript客戶端代碼:
var stompClient = null;	
//加載完瀏覽器后  調用connect(),打開雙通道
$(function(){	
	//打開雙通道
	connect()
})
//強制關閉瀏覽器  調用websocket.close(),進行正常關閉
    window.onunload = function() {
    	disconnect()
    }
    function connect(){
        var groupId = 1
        var socket = new WebSocket("ws://127.0.0.1:2222/webSocket"); //連接SockJS的endpoint名稱為"webSocket"
        stompClient = Stomp.over(socket);//使用STMOP子協議的WebSocket客戶端
        console.log(stompClient)
        stompClient.connect({},function(frame){//連接WebSocket服務端     
            console.log('Connected:' + frame);
            //通過stompClient.subscribe訂閱/topic/getResponse 目標(destination)發送的消息
            stompClient.subscribe('/user/'+groupId+'/refresh',function(response){
                console.log(response.body);
            });
        });
    }
 
    //關閉雙通道
    function disconnect(){
        if(stompClient != null) {
            stompClient.disconnect();
        }
        console.log("Disconnected");
    }
    function showResponse(message){
        var response = $("#response");
        response.append("<p>"+message.userName+"</p>");
    }

如果鏈接成功,瀏覽器會打印如下信息:

點對點通信:

如果下面的接口被調用,服務器就會主動往所有連接服務器的客戶端訂閱了“/user/+“groupId”+/refresh”的路徑推送消息

/**
     * websocket刷新流程
     * @author metadata
     */
    @GetMapping("refresh/{groupId}")
    public void refresh(@PathVariable Long groupId) {
        simpMessagingTemplate.convertAndSendToUser(groupId.toString(), "/refresh", "refresh");
    }

如果該接口被調用,相應的客戶端會接收到如下消息:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM