2019独角兽企业重金招聘Python工程师标准>>>

1、Work queues
2、Publish/Subscribe
3、Routing
4、Topics
5、Header
6、RPC

1. Work queues 工作队列

work queues与入门程序相比,多了一个消费端,两个消费端共同消费同一个队列中的消息。
应用场景:对于 任务过重或任务较多情况使用工作队列可以提高任务处理的速度。

测试:
1、使用入门程序,启动多个消费者。
2、生产者发送多个消息。

结果:
1、一条消息只会被一个消费者接收;
2、rabbit采用轮询的方式将消息是平均发送给消费者的;
3、消费者在处理完某条消息后,才会收到下一条消息。

2. Publish/subscribe 发布/订阅

2.1 工作模式

发布订阅模式:
1、每个消费者监听自己的队列;
2、生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息。

2.2 代码

案例:
用户通知,当用户充值成功或转账完成系统通知用户,通知方式有短信、邮件多种方法 。

1、生产者
声明Exchange_fanout_inform交换机。
声明两个队列并且绑定到此交换机,绑定时不需要指定routingkey 发送消息时不需要指定routingkey。

package com.xuecheng.rabbitemq.test;import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.junit.Test;import java.io.IOException;
import java.util.concurrent.TimeoutException;/*** @ClassName: producer01* @description:* @author: edison_Kwok* @Date: create in 2019/4/17 11:31* @Version: 1.0*/
public class producer02_publish {private static final String QUEUE_INFORM_EMAIL = "queue_inform_email";private static final String QUEUE_INFORM_SMS = "queue_inform_sms";private static final String EXCHANGE_FANOUT_INFORM="exchange_fanout_inform";@Testpublic void send01() {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("127.0.0.1");connectionFactory.setPort(5672);connectionFactory.setUsername("guest");connectionFactory.setPassword("guest");//rabbitmq默认虚拟机名称为“/”,虚拟机相当于一个独立的mq服务connectionFactory.setVirtualHost("/");Connection connection = null;Channel channel = null;try {//创建与RabbitMQ服务的TCP连接connection = connectionFactory.newConnection();//创建与Exchange的通道,每个连接可以创建多个通道,每个通道代表一个会话任务channel = connection.createChannel();//声明交换机channel.exchangeDeclare(EXCHANGE_FANOUT_INFORM, BuiltinExchangeType.FANOUT);/*** 声明队列,如果Rabbit中没有此队列将自动创建* param1:队列名称* param2:是否持久化* param3:队列是否独占此连接* param4:队列不再使用时是否自动删除此队列* param5:队列参数*/channel.queueDeclare(QUEUE_INFORM_EMAIL, true, false, false, null);channel.queueDeclare(QUEUE_INFORM_SMS, true, false, false, null);//将交换机和队列绑定channel.queueBind(QUEUE_INFORM_EMAIL,EXCHANGE_FANOUT_INFORM,"");channel.queueBind(QUEUE_INFORM_SMS,EXCHANGE_FANOUT_INFORM,"");/*** 消息发布方法* param1:Exchange的名称,如果没有指定,则使用Default Exchange* param2:routingKey,消息的路由Key,是用于Exchange(交换机)将消息转发到指定的消息队列* param3:消息包含的属性* param4:消息体*/for (int i = 0; i < 5; i++) {String message = "send message to user"+i;channel.basicPublish(EXCHANGE_FANOUT_INFORM,"",null,message.getBytes("UTF-8"));System.out.println("发布:" + message);}} catch (Exception e) {e.printStackTrace();}finally {try {channel.close();} catch (IOException e) {e.printStackTrace();} catch (TimeoutException e) {e.printStackTrace();}try {connection.close();} catch (IOException e) {e.printStackTrace();}}}
}

2.邮件发送消费者

package com.xuecheng.rabbitmq.test;import com.rabbitmq.client.*;import java.io.IOException;/*** @ClassName: Consumer01* @description:* @author: edison_Kwok* @Date: create in 2019/4/17 11:43* @Version: 1.0*/
public class Consumer02_subscribe_email {private static final String QUEUE_INFORM_EMAIL = "queue_inform_email";private static final String EXCHANGE_FANOUT_INFORM="exchange_fanout_inform";public static void main(String[] args) {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("127.0.0.1");connectionFactory.setPort(5672);connectionFactory.setUsername("guest");connectionFactory.setPassword("guest");//rabbitmq默认虚拟机名称为“/”,虚拟机相当于一个独立的mq服务connectionFactory.setVirtualHost("/");Connection connection = null;Channel channel = null;try {//创建与RabbitMQ服务的TCP连接connection = connectionFactory.newConnection();//创建与Exchange的通道,每个连接可以创建多个通道,每个通道代表一个会话任务channel = connection.createChannel();channel.exchangeDeclare(EXCHANGE_FANOUT_INFORM,BuiltinExchangeType.FANOUT);channel.queueDeclare(QUEUE_INFORM_EMAIL, true, false, false, null);channel.queueBind(QUEUE_INFORM_EMAIL,EXCHANGE_FANOUT_INFORM,"");DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body)throws IOException {//交换机String exchange = envelope.getExchange();//路由keyString routingKey = envelope.getRoutingKey();//消息idlong deliveryTag = envelope.getDeliveryTag();//消息内容String msg = new String(body,"utf-8");System.out.println("订阅:" + msg);}};channel.basicConsume(QUEUE_INFORM_EMAIL, true, defaultConsumer);} catch (Exception e) {e.printStackTrace();}}
}

按照上边的代码,编写邮件通知的消费代码。

3、短信发送消费者

参考上边的邮件发送消费者代码编写。

2.3 思考

1、publish/subscribe与work queues有什么区别。区别:

1)work queues不用定义交换机,而publish/subscribe需要定义交换机。

2)publish/subscribe的生产方是面向交换机发送消息,work queues的生产方是面向队列发送消息(底层使用默认交换机)。

3)publish/subscribe需要设置队列和交换机的绑定,work queues不需要设置,实质上work queues会将队列绑定到默认的交换机。

相同点: 所以两者实现的发布/订阅的效果是一样的,多个消费端监听同一个队列不会重复消费消息。

2、实质工作用什么 publish/subscribe还是work queues。

建议使用 publish/subscribe,发布订阅模式比工作队列模式更强大,并且发布订阅模式可以指定自己专用的交换机。

3. Routing

3.1 工作模式

路由模式:
1、每个消费者监听自己的队列,并且设置routingkey。
2、生产者将消息发给交换机,由交换机根据routingkey来转发消息到指定的队列。

3.2 代码

1、生产者
声明exchange_routing_inform交换机;
声明两个队列并且绑定到此交换机,绑定时需要指定routingkey发送消息时需要指定routingkey。

package com.xuecheng.rabbitemq.test;import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.junit.Test;import java.io.IOException;
import java.util.concurrent.TimeoutException;/*** @ClassName: producer01* @description:* @author: edison_Kwok* @Date: create in 2019/4/17 11:31* @Version: 1.0*/
public class producer02_routing {private static final String QUEUE_INFORM_EMAIL = "queue_inform_email";private static final String QUEUE_INFORM_SMS = "queue_inform_sms";private static final String EXCHANGE_DIRECT_INFORM="exchange_direct_inform";private static final String ROUTINGKEY_EMAIL="routingkey_email";private static final String ROUTINGKEY_SMS="routingkey_sms";@Testpublic void send01() {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("127.0.0.1");connectionFactory.setPort(5672);connectionFactory.setUsername("guest");connectionFactory.setPassword("guest");//rabbitmq默认虚拟机名称为“/”,虚拟机相当于一个独立的mq服务connectionFactory.setVirtualHost("/");Connection connection = null;Channel channel = null;try {//创建与RabbitMQ服务的TCP连接connection = connectionFactory.newConnection();//创建与Exchange的通道,每个连接可以创建多个通道,每个通道代表一个会话任务channel = connection.createChannel();//声明交换机channel.exchangeDeclare(EXCHANGE_DIRECT_INFORM, BuiltinExchangeType.DIRECT);/*** 声明队列,如果Rabbit中没有此队列将自动创建* param1:队列名称* param2:是否持久化* param3:队列是否独占此连接* param4:队列不再使用时是否自动删除此队列* param5:队列参数*/channel.queueDeclare(QUEUE_INFORM_EMAIL, true, false, false, null);channel.queueDeclare(QUEUE_INFORM_SMS, true, false, false, null);//将交换机和队列绑定channel.queueBind(QUEUE_INFORM_EMAIL,EXCHANGE_DIRECT_INFORM,ROUTINGKEY_EMAIL);channel.queueBind(QUEUE_INFORM_SMS,EXCHANGE_DIRECT_INFORM,ROUTINGKEY_SMS);channel.queueBind(QUEUE_INFORM_EMAIL,EXCHANGE_DIRECT_INFORM,"both");channel.queueBind(QUEUE_INFORM_SMS,EXCHANGE_DIRECT_INFORM,"both");/*** 消息发布方法* param1:Exchange的名称,如果没有指定,则使用Default Exchange* param2:routingKey,消息的路由Key,是用于Exchange(交换机)将消息转发到指定的消息队列* param3:消息包含的属性* param4:消息体*/for (int i = 0; i < 5; i++) {String message = "send message to user"+i;channel.basicPublish(EXCHANGE_DIRECT_INFORM,"both",null,message.getBytes("UTF-8"));System.out.println("发布:" + message);}} catch (Exception e) {e.printStackTrace();}finally {try {channel.close();} catch (IOException e) {e.printStackTrace();} catch (TimeoutException e) {e.printStackTrace();}try {connection.close();} catch (IOException e) {e.printStackTrace();}}}
}

2、邮件发送消费者

package com.xuecheng.rabbitmq.test;import com.rabbitmq.client.*;import java.io.IOException;/*** @ClassName: Consumer01* @description:* @author: edison_Kwok* @Date: create in 2019/4/17 11:43* @Version: 1.0*/
public class Consumer02_routing_email {private static final String QUEUE_INFORM_EMAIL = "queue_inform_email";private static final String EXCHANGE_DIRECT_INFORM="exchange_direct_inform";private static final String ROUTINGKEY_EMAIL="routingkey_email";public static void main(String[] args) {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("127.0.0.1");connectionFactory.setPort(5672);connectionFactory.setUsername("guest");connectionFactory.setPassword("guest");//rabbitmq默认虚拟机名称为“/”,虚拟机相当于一个独立的mq服务connectionFactory.setVirtualHost("/");Connection connection = null;Channel channel = null;try {//创建与RabbitMQ服务的TCP连接connection = connectionFactory.newConnection();//创建与Exchange的通道,每个连接可以创建多个通道,每个通道代表一个会话任务channel = connection.createChannel();channel.exchangeDeclare(EXCHANGE_DIRECT_INFORM,BuiltinExchangeType.DIRECT);channel.queueDeclare(QUEUE_INFORM_EMAIL, true, false, false, null);channel.queueBind(QUEUE_INFORM_EMAIL,EXCHANGE_DIRECT_INFORM,ROUTINGKEY_EMAIL);channel.queueBind(QUEUE_INFORM_EMAIL,EXCHANGE_DIRECT_INFORM,"both");DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body)throws IOException {//交换机String exchange = envelope.getExchange();//路由keyString routingKey = envelope.getRoutingKey();//消息idlong deliveryTag = envelope.getDeliveryTag();//消息内容String msg = new String(body,"utf-8");System.out.println("订阅:" + msg);}};channel.basicConsume(QUEUE_INFORM_EMAIL, true, defaultConsumer);} catch (Exception e) {e.printStackTrace();}}
}

3、短信发送消费者

参考邮件发送消费者的代码流程,编写短信通知的代码。

3.3 思考

1、Routing模式和Publish/subscibe有啥区别?

Routing模式要求队列在绑定交换机时要指定routingkey,消息会转发到符合routingkey的队列。

4. Topics

4.1 工作模式

路由模式:
1、每个消费者监听自己的队列,并且设置带统配符的routingkey。
2、生产者将消息发给broker,由交换机根据routingkey来转发消息到指定的队列。

4.2 代码

案例:

根据用户的通知设置去通知用户,设置接收Email的用户只接收Email,设置接收sms的用户只接收sms,设置两种通知类型都接收的则两种通知都有效。

1、生产者
声明交换机,指定topic类型:

package com.xuecheng.rabbitemq.test;import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.junit.Test;import java.io.IOException;
import java.util.concurrent.TimeoutException;/*** @ClassName: producer01* @description:* @author: edison_Kwok* @Date: create in 2019/4/17 11:31* @Version: 1.0*/
public class producer02_topics {private static final String QUEUE_INFORM_EMAIL = "queue_inform_email";private static final String QUEUE_INFORM_SMS = "queue_inform_sms";private static final String EXCHANGE_TOPIC_INFORM="exchange_topic_inform";private static final String ROUTINGKEY_EMAIL="inform.#.email.#";private static final String ROUTINGKEY_SMS="inform.#.sms.#";@Testpublic void send01() {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("127.0.0.1");connectionFactory.setPort(5672);connectionFactory.setUsername("guest");connectionFactory.setPassword("guest");//rabbitmq默认虚拟机名称为“/”,虚拟机相当于一个独立的mq服务connectionFactory.setVirtualHost("/");Connection connection = null;Channel channel = null;try {//创建与RabbitMQ服务的TCP连接connection = connectionFactory.newConnection();//创建与Exchange的通道,每个连接可以创建多个通道,每个通道代表一个会话任务channel = connection.createChannel();//声明交换机channel.exchangeDeclare(EXCHANGE_TOPIC_INFORM, BuiltinExchangeType.TOPIC);/*** 声明队列,如果Rabbit中没有此队列将自动创建* param1:队列名称* param2:是否持久化* param3:队列是否独占此连接* param4:队列不再使用时是否自动删除此队列* param5:队列参数*/channel.queueDeclare(QUEUE_INFORM_EMAIL, true, false, false, null);channel.queueDeclare(QUEUE_INFORM_SMS, true, false, false, null);//将交换机和队列绑定channel.queueBind(QUEUE_INFORM_EMAIL,EXCHANGE_TOPIC_INFORM,ROUTINGKEY_EMAIL);channel.queueBind(QUEUE_INFORM_SMS,EXCHANGE_TOPIC_INFORM,ROUTINGKEY_SMS);/*** 消息发布方法* param1:Exchange的名称,如果没有指定,则使用Default Exchange* param2:routingKey,消息的路由Key,是用于Exchange(交换机)将消息转发到指定的消息队列* param3:消息包含的属性* param4:消息体*/for (int i = 0; i < 5; i++) {String message = "send message to user"+i;channel.basicPublish(EXCHANGE_TOPIC_INFORM,"inform.sms.email",null,message.getBytes("UTF-8"));System.out.println("发布:" + message);}} catch (Exception e) {e.printStackTrace();}finally {try {channel.close();} catch (IOException e) {e.printStackTrace();} catch (TimeoutException e) {e.printStackTrace();}try {connection.close();} catch (IOException e) {e.printStackTrace();}}}
}

2、消费端
队列绑定交换机指定通配符:
统配符规则:

中间以“.”分隔。
符号#可以匹配多个词,符号*可以匹配一个词语。

package com.xuecheng.rabbitmq.test;import com.rabbitmq.client.*;import java.io.IOException;/*** @ClassName: Consumer01* @description:* @author: edison_Kwok* @Date: create in 2019/4/17 11:43* @Version: 1.0*/
public class Consumer02_topics_email {private static final String QUEUE_INFORM_EMAIL = "queue_inform_email";private static final String EXCHANGE_TOPIC_INFORM="exchange_topic_inform";private static final String ROUTINGKEY_EMAIL="inform.#.email.#";public static void main(String[] args) {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("127.0.0.1");connectionFactory.setPort(5672);connectionFactory.setUsername("guest");connectionFactory.setPassword("guest");//rabbitmq默认虚拟机名称为“/”,虚拟机相当于一个独立的mq服务connectionFactory.setVirtualHost("/");Connection connection = null;Channel channel = null;try {//创建与RabbitMQ服务的TCP连接connection = connectionFactory.newConnection();//创建与Exchange的通道,每个连接可以创建多个通道,每个通道代表一个会话任务channel = connection.createChannel();channel.exchangeDeclare(EXCHANGE_TOPIC_INFORM,BuiltinExchangeType.TOPIC);channel.queueDeclare(QUEUE_INFORM_EMAIL, true, false, false, null);channel.queueBind(QUEUE_INFORM_EMAIL,EXCHANGE_TOPIC_INFORM,ROUTINGKEY_EMAIL);DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body)throws IOException {//交换机String exchange = envelope.getExchange();//路由keyString routingKey = envelope.getRoutingKey();//消息idlong deliveryTag = envelope.getDeliveryTag();//消息内容String msg = new String(body,"utf-8");System.out.println("订阅:" + msg);}};channel.basicConsume(QUEUE_INFORM_EMAIL, true, defaultConsumer);} catch (Exception e) {e.printStackTrace();}}
}

4.3 思考

1、本案例的需求使用Routing工作模式能否实现?

使用Routing模式也可以实现本案例,共设置三个 routingkey,分别是email、sms、all,email队列绑定email和all,sms队列绑定sms和all,这样就可以实现上边案例的功能,实现过程比topics复杂。

Topic模式更多加强大,它可以实现Routing、publish/subscirbe模式的功能。

5. Header模式

header模式与routing不同的地方在于,header模式取消routingkey,使用header中的 key/value(键值对)匹配队列。

案例:

根据用户的通知设置去通知用户,设置接收Email的用户只接收Email,设置接收sms的用户只接收sms,设置两种通知类型都接收的则两种通知都有效。

代码:
1)生产者
队列与交换机绑定的代码与之前不同,如下:

package com.xuecheng.rabbitemq.test;import com.rabbitmq.client.*;
import org.junit.Test;import java.io.IOException;
import java.util.Hashtable;
import java.util.Map;
import java.util.concurrent.TimeoutException;/*** @ClassName: producer01* @description:* @author: edison_Kwok* @Date: create in 2019/4/17 11:31* @Version: 1.0*/
public class producer02_header {private static final String QUEUE_INFORM_EMAIL = "queue_inform_email";private static final String QUEUE_INFORM_SMS = "queue_inform_sms";private static final String EXCHANGE_HEADER_INFORM = "exchange_header_inform";private static final Map<String, Object> headers_email = new Hashtable<>();private static final Map<String, Object> headers_sms = new Hashtable<>();static {headers_email.put("inform_type", "email");headers_sms.put("inform_type", "sms");}@Testpublic void send01() {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("127.0.0.1");connectionFactory.setPort(5672);connectionFactory.setUsername("guest");connectionFactory.setPassword("guest");//rabbitmq默认虚拟机名称为“/”,虚拟机相当于一个独立的mq服务connectionFactory.setVirtualHost("/");Connection connection = null;Channel channel = null;try {//创建与RabbitMQ服务的TCP连接connection = connectionFactory.newConnection();//创建与Exchange的通道,每个连接可以创建多个通道,每个通道代表一个会话任务channel = connection.createChannel();//声明交换机channel.exchangeDeclare(EXCHANGE_HEADER_INFORM, BuiltinExchangeType.HEADERS);/*** 声明队列,如果Rabbit中没有此队列将自动创建* param1:队列名称* param2:是否持久化* param3:队列是否独占此连接* param4:队列不再使用时是否自动删除此队列* param5:队列参数*/channel.queueDeclare(QUEUE_INFORM_EMAIL, true, false, false, null);channel.queueDeclare(QUEUE_INFORM_SMS, true, false, false, null);//将交换机和队列绑定channel.queueBind(QUEUE_INFORM_EMAIL, EXCHANGE_HEADER_INFORM, "", headers_email);channel.queueBind(QUEUE_INFORM_SMS, EXCHANGE_HEADER_INFORM, "", headers_sms);Map<String, Object> map = new Hashtable<>();map.put("inform_type", "email");map.put("inform_type", "sms");AMQP.BasicProperties.Builder properties = new AMQP.BasicProperties.Builder();properties.headers(map);/*** 消息发布方法* param1:Exchange的名称,如果没有指定,则使用Default Exchange* param2:routingKey,消息的路由Key,是用于Exchange(交换机)将消息转发到指定的消息队列* param3:消息包含的属性* param4:消息体*/for (int i = 0; i < 5; i++) {String message = "send message to user" + i;channel.basicPublish(EXCHANGE_HEADER_INFORM, "", properties.build(), message.getBytes("UTF-8"));System.out.println("发布:" + message);}} catch (Exception e) {e.printStackTrace();} finally {try {channel.close();} catch (IOException e) {e.printStackTrace();} catch (TimeoutException e) {e.printStackTrace();}try {connection.close();} catch (IOException e) {e.printStackTrace();}}}
}

2)发送邮件消费者

package com.xuecheng.rabbitmq.test;import com.rabbitmq.client.*;import java.io.IOException;
import java.util.Hashtable;
import java.util.Map;/*** @ClassName: Consumer01* @description:* @author: edison_Kwok* @Date: create in 2019/4/17 11:43* @Version: 1.0*/
public class Consumer02_headers_email {private static final String QUEUE_INFORM_EMAIL = "queue_inform_email";private static final String EXCHANGE_HEADER_INFORM = "exchange_header_inform";private static final Map<String, Object> headers_email = new Hashtable<>();public static void main(String[] args) {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("127.0.0.1");connectionFactory.setPort(5672);connectionFactory.setUsername("guest");connectionFactory.setPassword("guest");//rabbitmq默认虚拟机名称为“/”,虚拟机相当于一个独立的mq服务connectionFactory.setVirtualHost("/");Connection connection = null;Channel channel = null;try {//创建与RabbitMQ服务的TCP连接connection = connectionFactory.newConnection();//创建与Exchange的通道,每个连接可以创建多个通道,每个通道代表一个会话任务channel = connection.createChannel();channel.exchangeDeclare(EXCHANGE_HEADER_INFORM,BuiltinExchangeType.HEADERS);channel.queueDeclare(QUEUE_INFORM_EMAIL, true, false, false, null);channel.queueBind(QUEUE_INFORM_EMAIL,EXCHANGE_HEADER_INFORM,"",headers_email);DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body)throws IOException {//交换机String exchange = envelope.getExchange();//路由keyString routingKey = envelope.getRoutingKey();//消息idlong deliveryTag = envelope.getDeliveryTag();//消息内容String msg = new String(body,"utf-8");System.out.println("订阅:" + msg);}};channel.basicConsume(QUEUE_INFORM_EMAIL, true, defaultConsumer);} catch (Exception e) {e.printStackTrace();}}
}

6. RPC

RPC即客户端远程调用服务端的方法 ,使用MQ可以实现RPC的异步调用,基于Direct交换机实现,流程如下:

1、客户端即是生产者就是消费者,向RPC请求队列发送RPC调用消息,同时监听RPC响应队列;
2、服务端监听RPC请求队列的消息,收到消息后执行服务端的方法,得到方法返回的结果;
3、服务端将RPC方法 的结果发送到RPC响应队列;
4、客户端(RPC调用方)监听RPC响应队列,接收到RPC调用结果。

转载于:https://my.oschina.net/edisonOnCall/blog/3038839

RabbitMQ 6种工作模式相关推荐

  1. RabbitMQ五种工作模式

    RabbitMQ五种工作模式 1.简单队列 一个生产者对应一个消费者!! 2.work 模式 一个生产者对应多个消费者,但是一条消息只能有一个消费者获得消息!!! 轮询分发就是将消息队列中的消息,依次 ...

  2. rabbitmq几种工作模式_RabbitMQ的六种工作模式总结

    精品推荐 国内稀缺优秀Java全栈课程-Vue+SpringBoot通讯录系统全新发布! 作者:侧身左睡 https://www.cnblogs.com/xyfer1018/p/11581511.ht ...

  3. rabbitmq几种工作模式_RabbitMQ六种队列模式-简单队列模式

    在官网的教程中,描述了如上六类工作队列模式: 简单队列模式:最简单的工作队列,其中一个消息生产者,一个消息消费者,一个队列.也称为点对点模式. 工作模式:一个消息生产者,一个交换器,一个消息队列,多个 ...

  4. 基于SpringCloud开发rabbitmq五种工作模式实现

    工作模式 1. RabbitMQ消息模型 2. SpringAMQP 2.1. Basic Queue 简单队列模型 2.1.1.消息发送 2.1.2.消息接收 2.1.3.测试 2.2. WorkQ ...

  5. RabbitMQ七种工作模式实现测试代码

    所有工作模式依赖都相同 <dependencies><!--RabbitMQ的客户端依赖--><dependency><groupId>com.rabb ...

  6. 消息队列(四)——rabbitMQ四种工作模式

    RabbitMQ工作模式 模式总结: 1.简单模式helloworld 一个生产者,一个消费者,不需要交换机(使用默认交换机) 2.工作队列模式Work Queue 一个生产者,多个消费者(竞争关系) ...

  7. 快速入门RabbitMQ(详细)第二篇:RabbitMQ五种工作模式的使用及总结

    4. RabbitMQ工作模式 4.1. Work queues工作队列模式 Work Queues 与入门程序的 简单模式 相比,多了一个或一些消费端,多个消费端共同消费同一个队列中的消息.应用场景 ...

  8. RabbitMQ几种工作模式,实现延时消息的两种案例

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 1.死信队列 1.1消息什么时候变为死信(dead-letter) 消息被否定接收,消费者使用basic.reject ...

  9. RabbitMQ的6种工作模式的学习记录,普通MAVEN和springboot项目整合rabbitmq的API详解

    1.RabbitMQ后台管理页面 2.RabbitMQ 核心(自我理解) 3.RabbitMQ6种工作模式介绍 4. RabbitMQ的消息可靠性 5.RabbitMQ普通MAVEN项目使用 6.Sp ...

最新文章

  1. Docker - Install docker on CentOS
  2. 为什么分布式一定要有延时任务?
  3. python编程入门p-读书笔记 - 《Python编程:从入门到实践》
  4. Sql结果导出为excel文件
  5. 国行iphone第一次安装APP网络状况
  6. 你好骚啊......
  7. 从Linus Torvalds一封发飙的电邮开始谈设备树究竟是棵什么树?
  8. html jquery 模板,用模版生成HTML的的框架jquery.tmpl使用详解
  9. 面向对象编程的两顶帽子
  10. STM32单片机使用注意事项
  11. DB2数据库SQL0670N错误(行长度超限)案例解析
  12. MATALAB动态爱心代码
  13. php前台输出繁体,利用PHP输出控制功能做简繁体转换_php
  14. [ Keil ] keil4工程转keil5方法
  15. pycharm 软件详细使用教程,新手必看篇
  16. 图像检测与分割标注文件XML/JSON/TXT一键批量转换编辑软件
  17. aws(亚马逊云服务)ssh登录提示Error establishing SSH connection to your instance. Try again later.
  18. 解决面部毛孔粗大的7个小窍门 - 健康程序员,至尚生活!
  19. 图文讲解uni-app支持PC宽屏
  20. linux 嵌入式 播放器,基于Linux的嵌入式媒体播放器研究

热门文章

  1. 【心情】还有5分钟回苏州了!
  2. java sdf.parse_用DateFormat的parse方法验证字符串是否是日期的问题
  3. mysql缓解oom发生的方法_MySQL Slave 触发 oom-killer解决方法_MySQL
  4. python 调用 c 生成数组_python调用c++传递数组的实例
  5. matlab python比较_MATLAB与Python的比较
  6. oracle中间件微信公众号,对TP5.1中间件融合微信公众号代码的优化
  7. android textview 设置字体,Android TextView设置字体风格
  8. android筛选cookie,服务器无法从Android手机识别Cookie
  9. 第十七届全国大学生智能车竞赛:英飞凌芯片第二批申请开放
  10. 神经网络学习中的SoftMax与交叉熵