RabbitMQ發送接收消息(隊列式+主題式)(springboot)
maven依賴與配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
1.隊列式
1.1創建隊列
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
/**
* 創建隊列
*/
@SpringBootConfiguration
public class CreateQueue {
@Bean
public Queue que(){
return new Queue("myque");
}
//exchange 和 bingding可以沒有
@Bean
public DirectExchange exc(){
return new DirectExchange("myexc");
}
@Bean
public Binding bind(){
return BindingBuilder.bind(que()).to(exc()).with("mykey");
}
//創建隊列 myque2和auqe,測試接收消息並回饋
//@Bean
public Queue que2(){
return new Queue("myque2");
}
//@Bean
public Queue que3(){
return new Queue("aque");
}
}
1.2發送消息
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 發送消息
*/
@Component
public class Sender {
@Autowired
RabbitTemplate rt;
public void send(){
/*
* convertAndSend(String routingKey, final Object object)
* 方法參數爲routingKey,但是參數只有我queueName時才能成功
*/
//!!!隊列名稱,消息內容
rt.convertAndSend("myque", " hello World myque"); //成功
rt.convertAndSend("myexc", " hello World myexc"); //失敗
rt.convertAndSend("mykey", " hello World mykey"); // 失敗
rt.convertAndSend("myque2", " hello World 2");
}
}
1.3接收消息
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Component;
/**
* 接收消息
*/
@Component
public class Receiver {
@RabbitListener(queues = "myque")
public void rece(String message){
System.out.println("接收:"+message);
}
/**
* 接收消息並返回內容
*/
//@RabbitListener(queues = "myque2")
//@SendTo("aque") //返回信息
public String receAndReturn(String message){
System.out.println("接收2:"+message);
return "aaaaaa";
}
/**
* 接收回饋的信息
*/
@RabbitListener(queues = "aque")
public void getBack(String message){
System.out.println("返回的消息:"+message);
}
}
2.主題式
2.1創建隊列
/**
* 路由與隊列綁定關係枚舉
*/
public enum STEQEnum {
/** 訂閱者 1 */
CONSUMER1("topic_exchange","topic_queue1","tp.#"),
/** 訂閱者 2 */
CONSUMER2("topic_exchange","topic_queue2","tp.a.*");
/** 路由名稱 */
private String exchange;
/** 隊列 */
private String queue;
/** 路由鍵 */
private String routingKey;
STEQEnum(String exchange, String queue, String routingKey){
this.exchange = exchange;
this.queue = queue;
this.routingKey = routingKey;
}
public String getExchange() {
return exchange;
}
public void setExchange(String exchange) {
this.exchange = exchange;
}
public String getQueue() {
return queue;
}
public void setQueue(String queue) {
this.queue = queue;
}
public String getRoutingKey() {
return routingKey;
}
public void setRoutingKey(String routingKey) {
this.routingKey = routingKey;
}
}
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.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
/**
* 創建路由、隊列,並綁定
*/
@SpringBootConfiguration
public class TopicConfig {
@Bean
public TopicExchange exc(){
return new TopicExchange(STEQEnum.CONSUMER1.getExchange());
}
@Bean
public Queue queue1(){
return new Queue(STEQEnum.CONSUMER1.getQueue());
}
@Bean
public Queue queue2(){
return new Queue(STEQEnum.CONSUMER2.getQueue());
}
@Bean
public Binding bind1(){
return BindingBuilder.bind(queue1()).to(exc()).with(STEQEnum.CONSUMER1.getRoutingKey());
}
@Bean
public Binding bind2(){
return BindingBuilder.bind(queue2()).to(exc()).with(STEQEnum.CONSUMER2.getRoutingKey());
}
}
2.2 發佈消息
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 發佈消息
*/
@Component
public class Publisher {
@Autowired
RabbitTemplate rt;
public void doPub(){
String exchange = STEQEnum.CONSUMER1.getExchange();
rt.convertAndSend(exchange, "tp.a.b", " 公衆號消息 ");
}
}
2.3 訂閱者接收消息
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* 訂閱者
*/
@Component
public class Subscribe {
//訂閱者 1
@RabbitListener(queues = "topic_queue1")
public void receiver( String message){
System.out.println("1:"+message);
}
//訂閱者 1
@RabbitListener(queues = "topic_queue2")
public void receiver2( String message){
System.out.println("2:"+message);
}
}