一、配置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()));
}
}