消息队列
1.简单模式
主要角色
-
生产者
-
消费者
消息发布者定义为对象Send,消息消费者(接收者)定义为对象Recv。发布者将连接到RabbitMQ,发送单个消息,然后退出。
-
导入相关依赖:
<dependency> <groupId>com.rabbitmq</groupId? <artifactId>amqp-client</artifactId>
-
获取MQ连接:
import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; public class ConnectionUtils { public static Connection getConnection() throws Exception{ //定义连接工厂 ConnectionFactory factory=new ConnectionFactory(); //设置服务地址 factory.setHost("localhost"); //设置端口 factory.setPort(5672); //设置账号信息:用户名、密码、vhost factory.setVirtualHost("testhost"); factory.setUsername("admin"); factory.setPassword("123456"); //通过工程获取连接 Connection connection=factory.newConnection(); return connection; } }
-
生产者发送消息到队列:
public class Send { private final static String QUEUE_NAME="hello"; //命名队列 public static void main(String[] args) throws Exception{ try (Connection connection= ConnectionUtils.getConnection(); Channel channel=connection.createChannel()){ //通过绑定对应消息队列 //参数1:队列名称,如果队列不存在自动创建 //参数2:用来定义队列特性是否要持久化,true持久化队列 //参数3:exclusive是否独占队列,true独占队列 //参数4:autoDelete是否在消费完成后自动删除队列 true自动删除 //参数5:额外附加参数 channel.queueDeclare(QUEUE_NAME,false,false,false,null); String message="hello rabbitMQ!"; //发布消息 //参数1:交换机名称 参数2:队列名称 参数3:传递消息额外设置 参数4:消息的具体内容 channel.basicPublish("",QUEUE_NAME,null,message.getBytes()); System.out.println("[x] Sent '"+message+"'"); } } }
获取连接后创建一个频道,这是完成任务的大部分API所在的位置。
Receiving
-
消费者从队列中获取消息
public class Recv { private final static String QUEUE_NAME="hello"; public static void main(String[] args) throws Exception{ //获取连接以及频道 Connection connection= ConnectionUtils.getConnection(); Channel channel=connection.createChannel(); //声明队列 channel.queueDeclare(QUEUE_NAME,false,false,false,null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); DeliverCallback callback=(consumerTag,delivery)->{ String message=new String(delivery.getBody(),"UTF-8"); System.out.println(" [x] Received '" + message + "'"); }; //监听队列 channel.basicConsume(QUEUE_NAME,true,callback,consumerTag->{}); } }
核心
-
Broker:可以理解为安装RabbitMQ服务的这台机器就是一个Broker
-
Exchange:交换机,消息经由它,通过路由键来判断并决定把消息投递到哪个队列,它类似于一个路由器的角色
-
Queue:队列,最终将消息投递到队列中,由消费端监听队列进行消费
-
Binding:绑定关系,需要给交换机绑定队列,绑定时需要给一个路由键
-
RoutingKey:路由键,交换机和队列进行绑定时,需要指定路由键或通配符路由键。交换机根据路由键来决定消息投递到哪个或哪些队列
大致流程:使用RabbitMQ前,首先需要根据业务来创建交换机和队列,创建完成后需要给交换机绑定队列(交换机和队列可以是多对多的关系),绑定队列时要指定具体的路由键或者通配符路邮件当生产者发送一条消息的时候,需要指定交换机和理由键,消息到达Broker后先转给刚才指定的交换机,交换机再根据路由键来决定把消息投递给与自己绑定的哪一个或哪一些队列,最后再由消费端来监听这些队列,消息处理对应的消息。