RabbitMQ
RabbitMQ服务端的安装
操作系统:CentOS7,使用docker容器安装
# 拉取镜像
docker pull rabbitmq:management
# 创建容器
docker run -e RABBIT_DEFAULT_USER=root -e RABBIT_DEFAULT_PASS=root --name rabbitmq_mg -p 15672:15672 -p 5672:5672 -d rabbitmq:management
# 访问管理页面
# http://10.10.0.100:15672
# root:root(如果登录失败,则选择guest:guest)
AMQP的Java客户端编程
AMQP:Advanced Message Queuing Protocol,即高级消息队列协议
(1)新建maven项目
pom文件引入amqp的依赖
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.9.0</version>
</dependency>
(2)发布消息
PublisherTest.java
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("10.10.0.100");
factory.setPort(5672);
factory.setVirtualHost("/");
factory.setUsername("guest");
factory.setPassword("guest");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String message = scanner.next();
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println("[x]发送'" + message + "'");
}
channel.close();
connection.close();
(3)消费消息
ConsumerTest.java
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("10.10.0.100");
factory.setPort(5672);
factory.setVirtualHost("/");
factory.setUsername("guest");
factory.setPassword("guest");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.basicConsume(QUEUE_NAME, true, new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws
IOException {
//处理消息
String message = new String(body);
System.out.println(" [x] Received '" + message + "'");
}
});
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
Spring AMQP的Java客户端编程
0.环境准备
(1)新建Spring boot项目
一个父工程springamqp,2个子工程publisher、consumer
(2)pom文件引入spring AMQP的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
(3)在application.yml中配置RabbitMQ
spring:
rabbitmq:
host: 10.10.0.100
port: 5672
username: guest
password: guest
virtual-host: /
listener:
simple:
prefetch: 1
1.Hello Word (简单的消息队列)
(1)发送
@Test
public void publishSimpleQueue(){
String QUEUE_NAME="simple-queue";
String message="hello,spring AMQP";
rabbitTemplate.convertAndSend(QUEUE_NAME,message);
}
(2)接收
@Component
public class RabbitMqListener {
@RabbitListener(queues = "simple-queue")
public void Listensimple(String message) throws InterruptedException {
System.out.println("接收消息:'" + message + "'");
}
2.Work Queues
(1)发送
@Test
public void publishWorkQueue() throws InterruptedException {
String message="hello";
String QUEUE_NAME="work-queue";
for (int i = 1; i <=50 ; i++) {
rabbitTemplate.convertAndSend(QUEUE_NAME,message+i);
Thread.sleep(20);
}
}
(2)接收
@RabbitListener(queues = "work-queue")
public void ListenMessage1(String message) throws InterruptedException {
System.out.println("消费者1:'" + message + "'");
Thread.sleep( 20);
}
@RabbitListener(queues = "work-queue")
public void ListenMessage2(String message) throws InterruptedException {
System.out.println("消费者2:'" + message + "'");
Thread.sleep(200);
}
3.publish-subscribe fanout exchange
(1)声明
声明交换机、队列及其绑定
FanoutConfig.java
@Configuration
public class FanoutConfig {
@Bean
public FanoutExchange fanoutExchange(){
return new FanoutExchange("fanout-exchange");
}
@Bean
public Queue fanoutQueue1(){
return new Queue("fanout-queue1");
}
@Bean
public Binding bindingQueue1(Queue fanoutQueue1, FanoutExchange fanoutExchange){
return BindingBuilder
.bind(fanoutQueue1)
.to(fanoutExchange);
}
@Bean
public Queue fanoutQueue2(){
return new Queue("fanout-queue2");
}
@Bean
public Binding bindingQueue2(Queue fanoutQueue2, FanoutExchange fanoutExchange){
return BindingBuilder
.bind(fanoutQueue2)
.to(fanoutExchange);
}
(2)发送
/**
* publish-subscribe fanout exchange 广播类型
*/
@Test
void publishFanoutQueue() {
String fanoutExchange = "fanout-exchange";
String message = "hello,everyone!";
rabbitTemplate.convertAndSend(fanoutExchange,"", message);
}
(3)接收
@Component
public class RabbitMqListener {
@RabbitListener(queues = "fanout-queue1")
public void ListenFanoutQueue1(String message) throws InterruptedException {
System.out.println("queue1:'" + message + "'");
}
@RabbitListener(queues = "fanout-queue2")
public void ListenFanoutQueue2(String message) throws InterruptedException {
System.out.println("queue2:'" + message + "'");
}
}
4.routing direct exchange
(1)发送
/**
* routing direct exchange 路由
*/
@Test
void publishDirectQueue() {
String fanoutExchange = "direct-exchange";
String message = "hello,boy!";
String routingKey = "red";
rabbitTemplate.convertAndSend(fanoutExchange, routingKey, message);
}
(2)接收
@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct-queue1"), exchange = @Exchange(name="direct-exchange"), key = {"red", "blue"}))
public void ListenDirectQueue1(String message) throws InterruptedException {
System.out.println("direct queue1:'" + message + "'");
}
@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct-queue2"), exchange = @Exchange(name="direct-exchange"), key = {"red", "yellow"}))
public void ListenDirectQueue2(String message) throws InterruptedException {
System.out.println("direct queue2:'" + message + "'");
}
5.topics topic exchange
(1)发送
/**
* topics topic exchange
*/
@Test
void publishTopicQueue() {
String exchange = "topic-exchange";
String message = "hello,boy!";
String routingKey = "china.sport";
rabbitTemplate.convertAndSend(exchange, routingKey, message);
}
(2)接收
@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "topic-queue1"), exchange = @Exchange(name="topic-exchange",type = ExchangeTypes.TOPIC), key = "china.#"))
public void ListenTopicQueue1(String message) throws InterruptedException {
System.out.println("topic queue1:'" + message + "'");
}
@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "topic-queue2"), exchange = @Exchange(name="topic-exchange",type = ExchangeTypes.TOPIC), key = "#.news"))
public void ListenTopicQueue2(String message) throws InterruptedException {
System.out.println("topic queue2:'" + message + "'");
}