概述:
异步消息简介基于JMS的消息功能使用Spring和AMQP发送消息消息驱动的POJO异步就是不需要立即关心调用返回结果,继续做其他事情
同步就是需要关心返回的结果,一直阻塞到有结果(超时)
模型为两种
点对点消息模型 : 有且仅有一个接受者
发布—订阅消息模型:类似关注名人微博,接受者就是粉丝
异步的优点:
无需等待、面向消息和解耦、位置独立
JMS只是定义一个规范,类似JDBC,具体实现不同厂商,这里的实现者就是ActiveMQ
如何做?
引入ActiveMQ命名空间
创建连接工厂 ActiveMQConnectionFactory 默认监听61616端口
声明ActiveMQ消息目的地 目的地可以是一个队列,也可以是一个主题,这取决于应用的需求。
JmsTemplate,优化Exception
发送消息
也有各种转换器:例如MappingJackson2MessageConverter、MarshallingMessageConverter
接受消息:使用JmsTemplate接收消息的最大缺点在于receive()和receiveAndConvert()方法都是同步的。
创建消息监听器;实现接口MessageListener
实际上,AMQP具有多项JMS所不具备的优势。首先,AMQP为消息定义了线路层(wire-level protocol)的协议,而JMS所定义的是API规范。JMS的API协议能够确保所有的实现都能通过通用的API来使用,但是并不能保证某个JMS实现所发送的消息能够被另外不同的JMS实现所使用。而AMQP的线路层协议规范了消息的格式,消息在生产者和消费者间传送的时候会遵循这个格式。这样AMQP在互相协作方面就要优于JMS——它不仅能跨不同的AMQP实现,还能跨语言和平台。
通过Exchange来解耦
四种标准的AMQP Exchange
Direct:如果消息的routing key与binding的routing key直接匹配的话,消息将会路由到该队列上;Topic:如果消息的routing key与binding的routing key符合通配符匹配的话,消息将会路由到该队列上;Headers:如果消息参数表中的头信息和值都与bingding参数表中相匹配,消息将会路由到该队列上;Fanout:不管消息的routing key和参数表的头信息/值是什么,消息将会路由到所有队列上。实现者:RabbitMQ 默认监听端口5672
convertAndSend() 和send()
receive()方法 和receiveAndConvert()
