RabbitMQ使用(一)
快速了解RabbitMQ使用,避免大家在重复的项目进行反复学习,可以灵活自用。
相关配置
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.5.2</version>
</dependency>
spring:
rabbitmq:
host:
port: 5672
username: moer
password: 123456
简单测试
采用RabbitListener注解声明队列、交换机、绑定关系
@Configuration
public class RabbitConfigure {
public final static String SPRING_BOOT_QUEUE="spring-boot-queue";
public final static String SPRING_BOOT_EXCHANGE="spring-boot-exchange";
public final static String SPRING_BOOT_BINDKEY="spring-boot-bindkey";
}
@Component
public class SendMsg {
@Autowired
private AmqpAdmin amqpAdmin;
@Autowired
private AmqpTemplate amqpTemplate;
public void send(String msgContent){
amqpTemplate.convertAndSend(RabbitConfigure.SPRING_BOOT_EXCHANGE,RabbitConfigure.SPRING_BOOT_BINDKEY,msgContent);
}
}
@Component
public class RecevieMsgs {
@RabbitListener(containerFactory = "rabbitListenerContainerFactory",
bindings = @QueueBinding(
value = @Queue(value = RabbitConfigure.SPRING_BOOT_EXCHANGE+"3",durable = "true"),
exchange = @Exchange(value = RabbitConfigure.SPRING_BOOT_EXCHANGE,type = ExchangeTypes.TOPIC),
key =RabbitConfigure.SPRING_BOOT_BINDKEY)
)
public void receive(String content){
System.out.println("receive msg:" + content);
}
}
简单说明一下,这几个参数的意思
参数名 说明 name 定义队列的名称 durable 是否持久化,重启rabbitmq队列是否还存在,默认为true exclusive 是否排他,是否仅保持一个连接,且该连接断线后,此队列会被删除,默认为false autoDelete 是否自动删除,当队列没有消息一段时间后自动删除,默认为false arguments 参数,可以设置队列的最大消息数等
采用bean申明对象,将交换机、队列、绑定关系直接放在configure,更加方便
@RestController
@RequestMapping("/test")
public class RabbitTest {
@Autowired
private RecevieMsgs recevieMsgs;
@Autowired
private SendMsg sendMsg;
@GetMapping("/sendMsg")
public String sendMsg(@RequestParam String content){
sendMsg.send(content);
return "发送成功";
}
}
@Configuration
public class RabbitConfigure2 {
public final static String SPRING_BOOT_QUEUE="spring-boot-queue-2";
public final static String SPRING_BOOT_EXCHANGE="spring-boot-exchange-2";
public final static String SPRING_BOOT_BINDKEY="spring-boot-bindkey-2";
@Bean
Queue queue(){
return new Queue(SPRING_BOOT_QUEUE,false);
}
@Bean
TopicExchange exchange(){
return new TopicExchange(SPRING_BOOT_EXCHANGE);
}
@Bean
Binding binding(Queue queue, TopicExchange exchange){
return BindingBuilder.bind(queue).to(exchange).with(SPRING_BOOT_BINDKEY);
}
}
@Component
public class SendMsg {
@Autowired
private AmqpAdmin amqpAdmin;
@Autowired
private AmqpTemplate amqpTemplate;
public void send(String msgContent){
amqpTemplate.convertAndSend(RabbitConfigure2.SPRING_BOOT_EXCHANGE,RabbitConfigure2.SPRING_BOOT_BINDKEY,msgContent);
}
}
@Component
public class RecevieMsgs2 {
@RabbitListener(queues = RabbitConfigure2.SPRING_BOOT_QUEUE)
public void receive(String content){
System.out.println("receive msg2:" + content);
}
}
测试保持不变
MessageConverter发送对象
我们无论发送和接受消息,消息内容都可以使用Sring,这里我们可以设置MessageConverter设置发送和接受的内容参数是对象。
public class MsgContent1 {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "MsgContent1{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
public class MsgContent2 {
private String id;
private String content;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "MsgContent2{" +
"id='" + id + '\'' +
", content='" + content + '\'' +
'}';
}
}
@Component
public class SendMsg2 {
@Autowired
private AmqpAdmin amqpAdmin;
@Autowired
private AmqpTemplate amqpTemplate;
public void send(MsgContent1 msgContent){
amqpTemplate.convertAndSend(RabbitMsgConvertConfigure.SPRING_BOOT_EXCHANGE,RabbitMsgConvertConfigure.SPRING_BOOT_BINDKEY,msgContent);
}
public void send(MsgContent2 msgContent){
amqpTemplate.convertAndSend(RabbitMsgConvertConfigure.SPRING_BOOT_EXCHANGE,RabbitMsgConvertConfigure.SPRING_BOOT_BINDKEY,msgContent);
}
}
@Component
//@RabbitListener除了可以作用在方法,也可以作用在类上。后者,需要再处理的方法上使用@RabbitHandler
@RabbitListener(queues = RabbitMsgConvertConfigure.SPRING_BOOT_QUEUE)
public class RecevieMsgs3 {
@RabbitHandler
public void receive(MsgContent1 content){
System.out.println("[receive1] receiveMsgContent msg3:" + content);
}
@RabbitHandler
public void receive2(MsgContent2 content){
System.out.println("[receive2] receiveMsgContent msg3:" + content);
}
}

|