SpringBoot2实现访问RabbitMQ镜像集群
SpringBoot2实现访问RabbitMQ镜像集群
本文主要记录基于SpringBoot2实现对RabbitMQ镜像集群的访问,直接访问RabbitMQ的服务器基本一致,只需要修改配置文件。
RabbitMQ集群简要说明
-
TCP代理负载均衡的地址和监听端口端口
192.168.132.143:5672 -
MQ节点一
192.168.132.137:5672 -
MQ节点二
192.168.132.139:5672
代码片段
Maven依赖:pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ictpaas</groupId>
<artifactId>rabbitmq-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rabbitmq-test</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- RabbitMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置文件:application.properties
# rabbitmq
# rabbitmq服务器地址
# 镜像集群模式填写TCP代理的地址和监听的端口
# 非集群模式下,填写MQ服务器的地址和端口
spring.rabbitmq.addresses=192.168.132.143:5672
# rabbitmq的用户名和密码
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
# rabbitmq服务器的虚拟主机名,可以在后台管理系统上查看和新建
spring.rabbitmq.virtual-host=/test
# 连接超时
spring.rabbitmq.connection-timeout=15000
# rabbitmq-producer
# 允许ConfirmCallback
spring.rabbitmq.publisher-confirms=true
# 允许ReturnCallback
spring.rabbitmq.publisher-returns=true
spring.rabbitmq.template.mandatory=true
# rabbitmq-consumer
# 并发数
spring.rabbitmq.listener.simple.concurrency=1
# 最大并发数
spring.rabbitmq.listener.simple.max-concurrency=5
# 签收模式,手动
spring.rabbitmq.listener.simple.acknowledge-mode=manual
# 限流, 避免同时处理大量消息导致服务器 down 机, 根据线程数来决定
spring.rabbitmq.listener.simple.prefetch=1
生产者:RabbitmqProducerService.java
生产者需要主动调用。
package com.ictpaas.rabbitmqtest.service;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
@Service
public class RabbitmqProducerService {
@Resource
private RabbitTemplate rabbitTemplate;
RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {
@Override
public void confirm(CorrelationData correlationData, boolean isAck, String cause) {
System.out.println(correlationData);
System.out.println("ack: " + isAck);
if (!isAck) {
System.err.println(cause);
}
}
};
RabbitTemplate.ReturnCallback returnCallback = new RabbitTemplate.ReturnCallback() {
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
System.out.println("code: " + replyCode + ", text: " + replyText);
System.out.println("exchange: " + exchange + ", routingKey: " + routingKey);
System.out.println(message);
}
};
public void sendMsg(String msg) {
CorrelationData cd = new CorrelationData("id" + new Date().getTime());
rabbitTemplate.setConfirmCallback(confirmCallback);
rabbitTemplate.setReturnCallback(returnCallback);
rabbitTemplate.convertAndSend("test-exchange", "routingkey-test", msg, cd);
}
}
消费者:RabbitmqConsumerService.java
消费者端是监听器,不需要主动调用,程序运行起来以后会自动监听绑定的RabbitMQ队列。
package com.ictpaas.rabbitmqtest.service;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.Map;
@Service
public class RabbitmqConsumerService {
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "test-queue", durable = "true"),
exchange = @Exchange(value = "test-exchange", durable = "true", type = "topic"),
key = "routingkey-test"
)
)
@RabbitHandler
public void testConsumer(@Payload String msg, Channel channel, @Headers Map<String, Object> headers) {
System.out.println(msg);
Long tag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);
try {
// false表示不批量接收,只接收当前消息
channel.basicAck(tag, false);
} catch (IOException e) {
e.printStackTrace();
}
}
}
启动类:RabbitmqTestApplication.java
package com.ictpaas.rabbitmqtest;
import com.ictpaas.rabbitmqtest.service.RabbitmqProducerService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@SpringBootApplication
@RestController
public class RabbitmqTestApplication {
@Resource
private RabbitmqProducerService rabbitmqProducerService;
public static void main(String[] args) {
SpringApplication.run(RabbitmqTestApplication.class, args);
}
@GetMapping("/rabbitmq/{msg}")
public String test(@PathVariable(name = "msg") String msg) {
// 调用生产者,发布消息
rabbitmqProducerService.sendMsg(msg);
return "SUCCESS";
}
}