目录
上一篇博客我们介绍了RabbitMQ消息通信中的一些基本概念,这篇博客我们介绍 RabbitMQ 的五种工作模式,这也是实际使用RabbitMQ需要重点关注的。
这里是RabbitMQ 官网中的相关介绍:http://www.rabbitmq.com/getstarted.html
本篇博客源码下载地址:https://github.com/YSOcean/RabbitMQTest
1、简单队列
其实上篇文章末尾给出的代码就是简单队列。
一个生产者对应一个消费者!!!
生产者将消息发送到“hello”队列。消费者从该队列接收消息。
①、pom文件
必须导入rabbitmq 依赖包
1 <dependency>
2 <groupId>com.rabbitmq</groupId>
3 <artifactId>amqp-client</artifactId>
4 <version>3.4.1</version>
5 </dependency>
②、工具类
1 package com.ys.utils;
2
3 import com.rabbitmq.client.Connection;
4 import com.rabbitmq.client.ConnectionFactory;
5
6 /**
7 * Create by hadoop
8 */
9 public class ConnectionUtil {
10
11 public static Connection getConnection(String host,int port,String vHost,String userName,String passWord) throws Exception{
12 //1、定义连接工厂
13 ConnectionFactory factory = new ConnectionFactory();
14 //2、设置服务器地址
15 factory.setHost(host);
16 //3、设置端口
17 factory.setPort(port);
18 //4、设置虚拟主机、用户名、密码
19 factory.setVirtualHost(vHost);
20 factory.setUsername(userName);
21 factory.setPassword(passWord);
22 //5、通过连接工厂获取连接
23 Connection connection = factory.newConnection();
24 return connection;
25 }
26 }
③、生产者 Producer
1 package com.ys.simple;
2
3 import com.rabbitmq.client.Channel;
4 import com.rabbitmq.client.Connection;
5 import com.ys.utils.ConnectionUtil;
6
7 /**
8 * Create by YSOcean
9 */
10 public class Producer {
11 private final static String QUEUE_NAME = "hello";
12
13 public static void main(String[] args) throws Exception{
14 //1、获取连接
15 Connection connection = ConnectionUtil.getConnection("192.168.146.251",5672,"/","guest","guest");
16 //2、声明信道
17 Channel channel = connection.createChannel();
18 //3、声明(创建)队列
19 channel.queueDeclare(QUEUE_NAME, false, false, false, null);
20 //4、定义消息内容
21 String message = "hello rabbitmq ";
22 //5、发布消息
23 channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
24 System.out.println("[x] Sent'"+message+"'");
25 //6、关闭通道
26 channel.close();
27 //7、关闭连接
28 connection.close();
29 }
30 }
④、消费者Consumer
1 package com.ys.simple;
2
3 import com.rabbitmq.client.Channel;
4 import com.rabbitmq.client.Connection;
5 import com.rabbitmq.client.QueueingConsumer;
6 import com.ys.utils.ConnectionUtil;
7
8
9 /**
10 * Create by YSOcean
11 */
12 public class Consumer {
13
14 private final static String QUEUE_NAME = "hello";
15
16 public static void main(String[] args) throws Exception{
17 //1、获取连接
18 Connection connection = ConnectionUtil.getConnection("192.168.146.251",5672,"/","guest","guest");
19 //2、声明通道
20 Channel channel = connection.createChannel();
21 //3、声明队列
22 channel.queueDeclare(QUEUE_NAME, false, false, false, null);
23 //4、定义队列的消费者
24 QueueingConsumer queueingConsumer = new QueueingConsumer(channel);
25 //5、监听队列
26 /*
27 true:表示自动确认,只要消息从队列中获取,无论消费者获取到消息后是否成功消费,都会认为消息已经成功消费
28 false:表示手动确认,消费者获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,
29 如果消费者一直没有反馈,那么该消息将一直处于不可用状态,并且服务器会认为该消费者已经挂掉,不会再给其
30 发送消息,直到该消费者反馈。
31 */
32
33 channel.basicConsume(QUEUE_NAME,true,queueingConsumer);
34 //6、获取消息
35 while (true){
36 QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery();
37 String message = new String(delivery.getBody());
38 System.out.println(" [x] Received '" + message + "'");
39 }
40 }
41
42 }
注意这里消费者有自动确认消息和手动确认消息两种模式。
2、work 模式
一个生产者对应多个消费者,但是只能有一个消费者获得消息!!!
竞争消费者模式。
①、生产者
1 package com.ys.workqueue;
2
3 import com.rabbitmq.client.Channel;
4 import com.rabbitmq.client.Connection;
5 import com.ys.utils.ConnectionUtil;
6
7 /**
8 * Create by YSOcean
9 */
10 public class Producer {
11 private final static String QUEUE_NAME = "work_queue";
12
13 public static void main(String[] args) throws Exception{
14 //1、获取连接
15 Connection connection = ConnectionUtil.getConnection("192.168.146.251",5672,"/","guest","guest");
16 //2、声明信道
17 Ch