首页天道酬勤activemq入门,rabbitmq官方教程中文

activemq入门,rabbitmq官方教程中文

张世龙 05-05 13:33 31次浏览

另一方面,消息队列消息队列可以视为存储消息的容器。 如果需要使用消息,直接从容器中检索消息并自己使用即可。 中间件

二、为什么消息队列通过异步处理提高系统性能(减少响应所需时间)。

削峰/限流

降低系统耦合性。

三、为什么使用消息队列带来的一些问题系统可用性降低:系统的可用性在一定程度上下降了? 在加入MQ之前,不需要考虑信息丢失或MQ中断,但在引入MQ之后需要考虑。

加入33558www.Sina.com/MQ后,必须保证消息没有重复消耗、消息丢失时的处理、消息传递的顺序等问题。

系统复杂性提高:消息队列表示可以实现异步,但消息队列异步确实可以提高系统的响应速度。 但是万一信息真正的消费者没有正确消费信息怎么办? 这样会引起数据不一致!

四个jmsvsamqp 4.1 JMS JMS (javamessageservice,java消息服务)是java消息服务,允许JMS客户端通过JMS服务进行异步消息传输。

一致性问题:

4.2 AMQP AMQP,即高级消息排队协议,是提供统一消息服务的APP应用层标准的ActiveMQ 就是基于 JMS 规范实现的。(二进制APP协议,是APP方案)

4.3 JMS vs AMQP比较方向定义jmsamqpJavaAPI协议跨语言no跨平台no支持消息类型Peer-2-Peer; Pub/sub为:直接交换; fanout exchange; 主题变更; headers exchange; 系统交换。 本质上,后四种类型与JMS的pub/sub模型差别不大,而只在路由机制中进行更详细分类的消息类型支持多种消息类型。 上面介绍了byte[] (二进制)五、RabbitMQ核心概念

1.2.2交换(交换机) ) ) ) ) ) ) ) ) ) ) )。

在RabbitMQ中,消息并不直接传递到高级消息队列协议,中途必须经过Queue(消息队列)这一层,Exchange(交换器)

3358www.Sina.com/用于接收生产者发送的消息并将其路由到服务器中的队列。 如果无法路由,它可能会返回到Exchange(交换器)或直接销毁。

http://www.Sina.com/: http://www.Sina.com/,http://www.Sina.com/,http://www.Sina.com /,http://www.Sina.com

生产者向交换机发送消息时,通常指定Queue(消息队列)来指定此消息的路由规则,但指定3358www.Sina.com/。

生产者向交换机发送消息时,需要路由密钥,如果绑定密钥和路由密钥匹配,则消息将路由到相应的队列。

1.2.3消息队列。

用于保存消息直到发送到Exchange(交换器)消费者。 它既是信息的容器,也是信息的终点。 消息可以放入一个或多个队列中。 消息一直在队列中,等待消费者连接到此队列并将其删除。

Producer(生产者)这种情况下,队列中的消息不是所有消费者都接收并处理所有消息,而是平均分配(轮询)给多个消费者来处理

1.2.4消息中间件服务节点(broker )。

对RabbitMQ来说,RabbitMQ中介器可以仅仅被视为RabbitMQ服务节点或RabbitMQ服务实例。 在许多情况下,也可以将RabbitMQ中介程序视为RabbitMQ服务器。

1.2.5 Exchange Ty

pes(交换器类型)

① fanout

fanout 类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中,不需要做任何判断操作,所以 fanout 类型是所有的交换机类型里面速度最快的。fanout 类型常用来广播消息。

② direct

direct 类型的Exchange路由规则也很简单,它会把消息路由到那些 Bindingkey 与 RoutingKey 完全匹配的 Queue 中。

③ topic

前面讲到direct类型的交换器路由规则是完全匹配 BindingKey 和 RoutingKey ,但是这种严格的匹配方式在很多情况下不能满足实际业务的需求。topic类型的交换器在匹配规则上进行了扩展,它与 direct 类型的交换器相似,也是将消息路由到 BindingKey 和 RoutingKey 相匹配的队列中,但这里的匹配规则有些不同,它约定:

RoutingKey 为一个点号“.”分隔的字符串(被点号“.”分隔开的每一段独立的字符串称为一个单词),如 “com.rabbitmq.client”、“java.util.concurrent”、“com.hidden.client”;

BindingKey 和 RoutingKey 一样也是点号“.”分隔的字符串;

BindingKey 中可以存在两种特殊字符串“”和“#”,用于做模糊匹配,其中“”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)。

④ headers(不推荐)

headers 类型的交换器不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的 headers 属性进行匹配

六、实操 1.创建交换器

2.docker部署遇到的问题

问题一:访问交换机时报错

Management API returned status code 500

问题二:访问channel时报错

Stats in management UI are disabled on this node

解决方法:

 

问题三、连接RabbitMQ异常: com.rabbitmq.client.ShutdownSignalException: connection error; protocol meth

原因:权限不够。

解决方法:rabbitmqctl set_permissions -p "/" username "." "." ".*"

 

 

3.springboot整合rabbitmq

1.创建springboot项目,添加依赖

<dependency>           <groupId>org.springframework.boot</groupId>           <artifactId>spring-boot-starter-amqp</artifactId>       </dependency>        

2.配置文件

spring: rabbitmq:   host: 192.168.36.131   username: root   password: root 3.编写测试类 @SpringBootTestclass RabbitmqDemoApplicationTests {​   @Autowired   private RabbitTemplate rabbitTemplate;       @Test   public void send(){       //使用的点对点发送:direct路由       ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();       map.put("fd","hshahh");       map.put("duo",new String());       map.put("数组", Arrays.asList("fd",3));       //convertAndSend直接把对象序列化发送       rabbitTemplate.convertAndSend("exchanges.direct","jd",map);   }​   @Test   public void receive(){   //序列化接收       Object jd = rabbitTemplate.receiveAndConvert("jd");       System.out.println(jd.getClass());       System.out.println(jd);   }​   @Test   public void fanoutSend(){       rabbitTemplate.convertAndSend("exchanges.fanout","",new Book("fesf",33));   }​} 4.编写序列化json的转换器 @Configurationpublic class MyConverter {​   @Bean   public MessageConverter converter(){       return new 饱满的大船2JsonMessageConverter();   }}​//按Ctrl+Alt+B 显示子类 5.启动rabbitmq 6.消息监听 @Servicepublic class BookService {​ //监听队列   @RabbitListener(queues="jd.emps")   public void receive(Book book){       System.out.println("收到: "+book);   }       @RabbitListener(queues="jd")   public void receive2(Message message){       System.out.println(message.getBody());       System.out.println(message.getMessageProperties());   }}​​//开启rabbit的注解配置@EnableRabbit@SpringBootApplicationpublic class RabbitmqDemoApplication {​   public static void main(String[] args) {       SpringApplication.run(RabbitmqDemoApplication.class, args);   }}​ 7.自动配置

1.rabbitAutoConfiguration

2.有自动配置了连接工厂ConnectionFactory

3.RabbitProperties,封装了RabbitMQ配置

4.RabbitTemplate:给RabbitMQ发送和接收消息

5.AmqpAdmin系统管理功能组件

8.使用AmqpAdmin创建交换器和队列 @Testpublic void create(){   //创建交换器   //amqpAdmin.declareExchange(new DirectExchange("ampqadmin.exchange"));​   //创建队列   //amqpAdmin.declareQueue(new Queue("ampqadmin",true));​   //绑定   amqpAdmin.declareBinding(new Binding("ampqadmin", Binding.DestinationType.QUEUE,"ampqadmin.exchange","amqpadmin.#",null));​   //删除   amqpAdmin.deleteExchange("");   amqpAdmin.deleteQueue("");}

inputstream,java object转换为string