websocket stomp與RabbitMQ結合

一、配置application.properties

#rabbitmq
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

二、stomp的config

package com.citydo.checkandbigdataquery.stompmq;


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.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer implements WebSocketMessageBrokerConfigurer {


    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        /**
         * 訂閱來自"/topic"和"/user"的消息,
         * /topic 單聊
         * /all 羣聊
         * 收消息
         */
        registry.enableSimpleBroker("/topic","/all");
        /**
         * 客戶端發送過來的消息,需要以"/app"爲前綴,再經過Broker轉發給響應的Controller
         */
        registry.setApplicationDestinationPrefixes("/app");
        /**
         * 配置消息代理
         * 使用RabbitMQ做爲消息代理,替換默認的Simple Broker
         * 設置目的地前綴
         */
        registry
                .enableStompBrokerRelay("/exchange","/topic","/queue","/amq/queue")
                .setRelayHost("192.168.0.113")
                .setClientLogin("test")
                .setClientPasscode("test")
                .setSystemLogin("test")
                .setSystemPasscode("test")
                .setSystemHeartbeatSendInterval(5000)
                .setSystemHeartbeatReceiveInterval(4000);

        // 第一行,啓動STOMP中繼代理
        registry.enableStompBrokerRelay("/topic", "/queue")
                .setRelayHost("localhost")
                .setRelayPort(61613)
                .setClientLogin("guest")
                .setClientPasscode("guest");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        /**
         * 路徑"/websocket"被註冊爲STOMP端點,對外暴露,客戶端通過該路徑接入WebSocket服務
         */
        registry.addEndpoint("/websocket").setAllowedOrigins("*").withSockJS();
        registry.addEndpoint("/websocket-rabbitmq").setAllowedOrigins("*").withSockJS();
    }


}

三、rabbitmq的配置

package com.citydo.checkandbigdataquery.stompmq;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;

public class RabbitConfigure {


    // 隊列名稱
    public final static String SPRING_BOOT_QUEUE = "spring-boot-queue";
    // 交換機名稱
    public final static String SPRING_BOOT_EXCHANGE = "spring-boot-exchange";
    // 綁定的值
    public static final String SPRING_BOOT_BIND_KEY = "spring-boot-bind-key";



    /**
     * 定義隊列:
     * @return
     */
    @Bean
    Queue queue() {
        return new Queue(SPRING_BOOT_QUEUE, false);
    }

    /**
     * 定義交換機
     * @return
     */
    @Bean
    TopicExchange exchange() {
        return new TopicExchange(SPRING_BOOT_EXCHANGE);
    }

    /**
     * 定義綁定
     * @param queue
     * @param exchange
     * @return
     */
    @Bean
    Binding binding(Queue queue, TopicExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(SPRING_BOOT_BIND_KEY);
    }

}

四、rabbitmq訂閱消息

package com.citydo.checkandbigdataquery.stompmq;

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;


@Component
//@RabbitListener(queues = RabbitConfigure.SPRING_BOOT_QUEUE)
public class ReceiveMsg {


    /**
     * 獲取信息:
     *  queue也可以支持RabbitMQ中對隊列的模糊匹配
     * @param content
     */
    @RabbitListener(queues = RabbitConfigure.SPRING_BOOT_QUEUE)
    public void receive(String content) {
        System.out.println(content);
    }

    /**
     * //@RabbitListener(queues = RabbitConfigure.SPRING_BOOT_QUEUE) 放在類的頭上
     * 獲取信息:
     *  queue也可以支持RabbitMQ中對隊列的模糊匹配
     * @param msgContent
     */
    @RabbitHandler
    public void receiveMsgContent(String msgContent) {
        System.out.println(msgContent);
    }

    /**
     * 轉發
     * @return
     */
    @Bean(name = RabbitConfigure.SPRING_BOOT_QUEUE)
    public Queue queueMessage() {
        return new Queue("topic.message");
    }

}

五、controller測試

package com.citydo.checkandbigdataquery.stompmq;


import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;


/**
 * @program: znkf
 * @description:
 * @author: Mr.Xiong
 * @create: 2019-07-10 14:50
 **/
@Controller
@EnableScheduling //開啓spring定時任務
@Component  //可加可不加
public class ClientWebSocketController {

    @Autowired
    private SimpMessagingTemplate messagingTemplate;


    /**
     *  此接口默認實現只有一個,且是RabbitAdmin,通過源碼發現其內部實現實際是RabbitTemplate。所以AmqpAdmin和AmqpTemplate當前兩者本質是相同的
     */
    @Autowired
    private AmqpAdmin amqpAdmin;

    /**
     * 此接口的默認實現是RabbitTemplate,目前只有一個實現
     */
    @Autowired
    private AmqpTemplate amqpTemplate;


    /**
     * 測試定時推送消息
     * 先與前端進行聯調
     */
    @Scheduled(cron = "1/4 * * * * *")
    public void callback() {
        // 發現消息
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        messagingTemplate.convertAndSend("/all", "定時推送消息時間: " + df.format(new Date()));
    }

    /**
     * 通過rabbitmq進行推送消息
     */
    @Scheduled(cron = "1/4 * * * * *")
    public void sendTest() {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        amqpTemplate.convertAndSend(RabbitConfigure.SPRING_BOOT_EXCHANGE, RabbitConfigure.SPRING_BOOT_BIND_KEY,df.format(new Date()));
    }

}

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