一,需要引入的依賴
<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);
}
}