java消息队列--ActiveMQ,RabbitMQ入门
消息中间件(mq)一般用于发送,存储消息,类似于现实生活中邮政系统,消息队列主要作用在于异步和服务解耦。
消息中间件在大体是使用上和database的使用方式一样,获取connection,然后就可以写数据或者读数据了。但是具体到使用,又有很大不同,就像邮政系统,其内部是很复杂的,要确保消息能够正确到达目的地。最简单的模型就是producer-->queue--->consumer,但是如果要向多个队列发消息呢?或者是接收多个队列消息呢?这时就得使用routingKey和bindingKey了,也就是图中的Broker的抽象。Broker分装了Exchange和Queue的概念。
正常情况下,我们使用RabbitMQ和使用Redis是一样的,都需要写一个Client的组件,用于和MQ通信。好在Spring已经帮我们干了这件事,直接使用RabbitTemplate对象发消息,使用@RabbitMQListener注解接受消息就可以了。
发送消息过程还是比较简单的,首先在服务启动时看没有该队列,没有就创建一个队列,然后就可以向里面发消息了。
那么消费者如何消费呢?通常做法是定义消息监听器。activemq提供了3种消息监听器,MessageListener, SessionAwareMessageListener, MessageListenerAdapter. 后面两种消息监听器都是需要收到消息后需要确认或者回复时使用的(双向消息)。
接下来看下spring是怎么整合RabbitMQ呢?依然是xxxAutoxxx类,在这里就是RabbitAutoConfiguration.class。
@Configuration @ConditionalOnClass({ RabbitTemplate.class, Channel.class }) @EnableConfigurationProperties(RabbitProperties.class) @Import(RabbitAnnotationDrivenConfiguration.class) public class RabbitAutoConfiguration { // 这是RabbitAutoConfiguration的注解,基本思路就是如果有Rabbitmq,spring会去加载这个bean, //而RabbitAutoConfiguration告诉spring具体怎么加载
spring中是怎么配置RabbitMQ的参数呢?查阅源码,只需要在properties文件配置相同名的变量就可以了。
@ConfigurationProperties(prefix = "spring.rabbitmq") public class RabbitProperties { /** * RabbitMQ host. */ private String host = "localhost"; /** * RabbitMQ port. */ private int port = 5672; /** * Login user to authenticate to the broker. */ private String username = "guest";
@ConfigurationProperties这个注解,看个名字,我们就可以猜出它的作用,就是从properties文件提取以spring.rabbitmq开头的变量值。
关于一个队列,被多个消费者监听的情况,会竞争性消费。如果想每个消费者都消费消息,通常要使用多个队列。
关于队列类型和使用场景,后续待更。
参考博文: 消息中间件RabbitMQ