1、生產者
1.1 依賴
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mine</groupId>
<artifactId>rabbitmq-producer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- SpringBoot整合Web組件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Rabbitmq依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
1.2 配置
application.properties
server.port=8000
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.virtual-host=/test
spring.rabbitmq.username=test
spring.rabbitmq.password=test
1.3 代碼
RabbitConfig
package com.mine.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfig {
// direct交換機
public static final String EXCHANGE_DIRECT = "mine.direct";
// 隊列
public static final String QUEUE_EMAIL = "queue_email";
public static final String QUEUE_SMS = "queue_sms";
// routingKey
public static final String ROUTING_KEY_ALL = "all";
public static final String ROUTING_KEY_EMAIL = "email";
public static final String ROUTING_KEY_SMS = "sms";
// fanout交換機
public static final String EXCHANGE_FANOUT = "mine.fanout";
// 隊列
public static final String QUEUE_FANOUT_1 = "queue_fanout_1";
public static final String QUEUE_FANOUT_2 = "queue_fanout_2";
// 新建direct交換機
@Bean
public DirectExchange directExchange() {
return new DirectExchange(EXCHANGE_DIRECT);
}
// 新建郵件隊列
@Bean
public Queue queueEmail() {
return new Queue(QUEUE_EMAIL, true);
}
// 新建短信隊列
@Bean
public Queue queueSms() {
return new Queue(QUEUE_SMS, true);
}
// 綁定郵件隊列
@Bean
public Binding bindingEmail(DirectExchange directExchange, Queue queueEmail) {
return BindingBuilder.bind(queueEmail).to(directExchange).with(ROUTING_KEY_EMAIL);
}
// 綁定短信隊列
@Bean
public Binding bindingSms(DirectExchange directExchange, Queue queueSms) {
return BindingBuilder.bind(queueSms).to(directExchange).with(ROUTING_KEY_SMS);
}
// 綁定短信隊列ALL
@Bean
public Binding bindingSmsAll(DirectExchange directExchange, Queue queueSms) {
return BindingBuilder.bind(queueSms).to(directExchange).with(ROUTING_KEY_ALL);
}
// 綁定郵件隊列ALL
@Bean
public Binding bindingEmailAll(DirectExchange directExchange, Queue queueEmail) {
return BindingBuilder.bind(queueEmail).to(directExchange).with(ROUTING_KEY_ALL);
}
// 新建fanout交換機
@Bean
public FanoutExchange fanoutExchange() {
return new FanoutExchange(EXCHANGE_FANOUT);
}
// 新建fanout隊列1
@Bean
public Queue queueFanout1() {
return new Queue(QUEUE_FANOUT_1, true);
}
// 新建fanout隊列2
@Bean
public Queue queueFanout2() {
return new Queue(QUEUE_FANOUT_2, true);
}
// 綁定fanout隊列1
@Bean
public Binding bindingFanout1(FanoutExchange fanoutExchange, Queue queueFanout1) {
return BindingBuilder.bind(queueFanout1).to(fanoutExchange);
}
// 綁定fanout隊列2
@Bean
public Binding bindingFanout2(FanoutExchange fanoutExchange, Queue queueFanout2) {
return BindingBuilder.bind(queueFanout2).to(fanoutExchange);
}
}
MsgProducer
package com.mine.producer;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.mine.config.RabbitConfig;
import lombok.extern.slf4j.Slf4j;
@Component
@Slf4j
public class MsgProducer {
@Autowired
private AmqpTemplate amqpTemplate;
public void sendSms(String content) {
amqpTemplate.convertAndSend(RabbitConfig.EXCHANGE_DIRECT, RabbitConfig.ROUTING_KEY_SMS, content);
log.info("sendSms success, message content is [" + content + "]");
}
public void sendEmail(String content) {
amqpTemplate.convertAndSend(RabbitConfig.EXCHANGE_DIRECT, RabbitConfig.ROUTING_KEY_EMAIL, content);
log.info("sendEmail success, message content is [" + content + "]");
}
public void sendAll(String content) {
amqpTemplate.convertAndSend(RabbitConfig.EXCHANGE_DIRECT, RabbitConfig.ROUTING_KEY_ALL, content);
log.info("sendAll success, message content is [" + content + "]");
}
public void sendFanout(String content) {
amqpTemplate.convertAndSend(RabbitConfig.EXCHANGE_FANOUT, "", content);
log.info("sendFanout success, message content is [" + content + "]");
}
}
MessageSendController
package com.mine.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.mine.producer.MsgProducer;
@RestController
public class MessageSendController {
@Autowired
private MsgProducer msgProducer;
@RequestMapping("/sendSms")
public String sendSms(String msg) {
msgProducer.sendSms(msg);
return "send ok!";
}
@RequestMapping("/sendEmail")
public String sendEmail(String msg) {
msgProducer.sendEmail(msg);
return "send ok!";
}
@RequestMapping("/sendAll")
public String sendAll(String msg) {
msgProducer.sendAll(msg);
return "send ok!";
}
@RequestMapping("/sendFanout")
public String sendFanout(String msg) {
msgProducer.sendFanout(msg);
return "send ok!";
}
}
AppProducer
package com.mine;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AppProducer {
public static void main(String[] args) {
SpringApplication.run(AppProducer.class, args);
}
}
2、消費者
2.1 依賴
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mine</groupId>
<artifactId>rabbitmq-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- SpringBoot整合Web組件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Rabbitmq依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
2.2 配置
application.properties
server.port=8002
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.virtual-host=/test
spring.rabbitmq.username=test
spring.rabbitmq.password=test
2.3 代碼
EmailConsumer
package com.mine.consumer;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
@Component
@RabbitListener(queues = "queue_email")
@Slf4j
public class EmailConsumer {
@RabbitHandler
public void process(String content) {
log.info("接收到郵件隊列消息:" + content);
}
}
SmsConsumer
package com.mine.consumer;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
@Component
@RabbitListener(queues = "queue_sms")
@Slf4j
public class SmsConsumer {
@RabbitHandler
public void process(String content) {
log.info("接收到短信隊列消息:" + content);
}
}
Fanout1Consumer
package com.mine.consumer;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
@Component
@RabbitListener(queues = "queue_fanout_1")
@Slf4j
public class Fanout1Consumer {
@RabbitHandler
public void process(String content) {
log.info("接收到fanout1隊列消息:" + content);
}
}
Fanout2Consumer
package com.mine.consumer;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
@Component
@RabbitListener(queues = "queue_fanout_2")
@Slf4j
public class Fanout2Consumer {
@RabbitHandler
public void process(String content) {
log.info("接收到fanout2隊列消息:" + content);
}
}
AppConsumer
package com.mine;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AppConsumer {
public static void main(String[] args) {
SpringApplication.run(AppConsumer.class, args);
}
}