springcloud整合rabbitmq

一,需要引入的依賴

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
     <groupId>org.springframework.amqp</groupId>
     <artifactId>spring-rabbit-test</artifactId>
     <scope>test</scope>
</dependency>
<dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <scope>test</scope>
</dependency>

application.yml

spring:
  application:
    # 服務名稱 - 服務之間使用名稱進行通訊
    name: test-rabbit
  rabbitmq:
    host: 192.168.*.*  #rabbit服務器的ip地址
    port: 5672
    username: ems
    password: 123
    virtual-host: /ems  #虛擬主機

 

二、使用單元測試做爲發送消息的生產者

package com.yangli.blogtool.test;

import com.yangli.blogtool.RabbitApplication;
import javafx.application.Application;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @Author: 
 * @Despriction:
 * @Package: com.yangli.blogtool.test
 * @Date:Created in 2020/3/27 15:04
 * @Modify By:
 */

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = RabbitApplication.class)
public class RabbitMqTest {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 模式一:helloword
     */
    @Test
    public void helloword() {
        //convertAndSend 轉換併發送消息
        /**
         * 參數1:隊列名稱 如果沒有消費者消費該隊列的消息,該隊列是不會被新建到rabbit中的
         * 參數2:需要發送的消息  spring會將其轉成 byte[] 格式的
         */
        rabbitTemplate.convertAndSend("hello", "hello word 模式");
    }

    /**
     * 模式二:work Queue
     * 工作列隊默認是均衡發佈消息
     * 如果需要實現能者多勞需要實現額外的配置
     */
    @Test
    public void workQueue() {
        for (int i = 1; i <= 10; i++) {
            /**
             * 參數1:隊列名稱 如果沒有消費者消費該隊列的消息,該隊列是不會被新建到rabbit中的
             * 參數2:需要發送的消息  spring會將其轉成 byte[] 格式的
             */
            rabbitTemplate.convertAndSend("work", "work queue 模式[" + i + "]");
        }
    }

    /**
     * 模式三:Publish/Subscribe fanout 訂閱/發佈 廣播模式
     */
    @Test
    public void fanout() {
        /**
         * 參數1:交換機名稱 如果沒有消費者消費該交換機的消息,該交換機是不會被新建到rabbit中的
         * 參數2:路由,訂閱/發佈 廣播模式 是不需要路由的,此處可以用空代替
         * 參數3:需要發送的消息  spring會將其轉成 byte[] 格式的
         */
        rabbitTemplate.convertAndSend("logs_fanout","","Publish/Subscribe fanout 訂閱/發佈 廣播模式");
    }

    /**
     * 模式四:routing 之 direct 直連模式
     */
    @Test
    public void direct() {
        /**
         * 參數1:交換機名稱 如果沒有消費者消費該交換機的消息,該交換機是不會被新建到rabbit中的
         * 參數2:路由,routing 之 direct 直連模式
         * 參數3:需要發送的消息  spring會將其轉成 byte[] 格式的
         */
        rabbitTemplate.convertAndSend("logs_direct","error","routing 之 direct 直連模式");
    }

    /**
     * 模式五:routing 之 topic 主題模式
     */
    @Test
    public void topic() {
        /**
         * 參數1:交換機名稱 如果沒有消費者消費該交換機的消息,該交換機是不會被新建到rabbit中的
         * 參數2:路由,routing 之 topic 主題模式, 多個單詞之間可以用 . 分隔開
         * 參數3:需要發送的消息  spring會將其轉成 byte[] 格式的
         */
        rabbitTemplate.convertAndSend("logs_topic","public.user.get","routing 之 topic 主題模式");
    }

}

3.hello word 模式的消費者

package com.yangli.blogtool.rabbit;

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

/**
 * @Author: 
 * @Despriction:
 * @Package: com.yangli.blogtool.rabbit
 * @Date:Created in 2020/3/27 15:49
 * @Modify By:
 */
@Component
/**
 * queuesToDeclare:聲明隊列
 * 隊列註解 @Queue 屬性的含義-- value:隊列名稱; durable:是否持久化; autoDelete:是否自動刪除; exclusive:是否獨佔隊列
 */
@RabbitListener(queuesToDeclare = @Queue(value = "hello",durable = "false",autoDelete = "true",exclusive = "false"))
public class HelloConsumer {

    @RabbitHandler
    public void getMsg(String message) {
        System.err.println("消費:" + message);
    }

}

 4.Work Queue 模式消費者

package com.yangli.blogtool.rabbit;

import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * @Author: 
 * @Despriction:
 * @Package: com.yangli.blogtool.rabbit
 * @Date:Created in 2020/3/27 16:20
 * @Modify By:
 */
@Component
public class WorkQueueConsumer {

    @RabbitListener(queuesToDeclare = @Queue(value = "work",durable = "false",autoDelete = "true",exclusive = "false"))
    public void getWorkMsg1 (String message) {
        System.err.println("消費者1:" + message);
    }

    @RabbitListener(queuesToDeclare = @Queue(value = "work",durable = "false",autoDelete = "true",exclusive = "false"))
    public void getWorkMsg2 (String message) {
        System.err.println("消費者2:" + message);
    }
}

5.Publish/Subscribe fanout 訂閱/發佈 廣播模式

package com.yangli.blogtool.rabbit;

import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * @Author: 
 * @Despriction:
 * @Package: com.yangli.blogtool.rabbit
 * @Date:Created in 2020/3/27 16:35
 * @Modify By:
 */
@Component
public class FanoutConsumer {

    //@Queue不包含屬性的情況下,表示聲明一個臨時對列以減少內存的消耗
    @RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "logs_fanout",type = "fanout"))})
    public void getMsg1(String message) {
        System.err.println("消費者1:" + message);
    }

    //@Queue不包含屬性的情況下,表示聲明一個臨時對列以減少內存的消耗
    @RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "logs_fanout",type = "fanout"))})
    public void getMsg2(String message) {
        System.err.println("消費者2:" + message);
    }
}

6.routing 之 direct 直連模式 的消費者

package com.yangli.blogtool.rabbit;

import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * @Author: 
 * @Despriction:
 * @Package: com.yangli.blogtool.rabbit
 * @Date:Created in 2020/3/27 16:47
 * @Modify By:
 */
@Component
public class DirectConsumer {

    //@Queue不包含屬性的情況下,表示聲明一個臨時對列以減少內存的消耗
    @RabbitListener(bindings = {
            @QueueBinding(value = @Queue,exchange = @Exchange(value = "logs_direct",type = "direct"),key = {"info","error","warning"})
    })
    public void getMsg1 (String message) {
        System.err.println("消費者1:" + message);
    }

    //@Queue不包含屬性的情況下,表示聲明一個臨時對列以減少內存的消耗
    @RabbitListener(bindings = {
            @QueueBinding(value = @Queue,exchange = @Exchange(value = "logs_direct",type = "direct"),key = {"info"})
    })
    public void getMsg2 (String message) {
        System.err.println("消費者2:" + message);
    }
}

 6.routing 之 topic 主題模式 的消費者

package com.yangli.blogtool.rabbit;

import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * @Author: 
 * @Despriction:
 * @Package: com.yangli.blogtool.rabbit
 * @Date:Created in 2020/3/27 16:59
 * @Modify By:
 */
@Component
public class TopicComsumer {

    //@Queue不包含屬性的情況下,表示聲明一個臨時對列以減少內存的消耗
    @RabbitListener(bindings = {
            @QueueBinding(value = @Queue,exchange = @Exchange(value = "logs_topic",type = "topic"),key = {"public.*"})
    })
    public void getMsg1 (String message) {
        System.err.println("消費者1:" + message);
    }

    //@Queue不包含屬性的情況下,表示聲明一個臨時對列以減少內存的消耗
    @RabbitListener(bindings = {
            @QueueBinding(value = @Queue,exchange = @Exchange(value = "logs_topic",type = "topic"),key = {"public.#"})
    })
    public void getMsg2 (String message) {
        System.err.println("消費者2:" + message);
    }

    //@Queue不包含屬性的情況下,表示聲明一個臨時對列以減少內存的消耗
    @RabbitListener(bindings = {
            @QueueBinding(value = @Queue,exchange = @Exchange(value = "logs_topic",type = "topic"),key = {"public.user.*"})
    })
    public void getMsg3 (String message) {
        System.err.println("消費者3:" + message);
    }

}

 

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