RabbitMQ發送接收消息(隊列式+主題式)(springboot)

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);
    }
    

}

 

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