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。
1 2 3 4 5 6 7 | @Configuration @ConditionalOnClass ({ RabbitTemplate. class , Channel. class }) @EnableConfigurationProperties (RabbitProperties. class ) @Import (RabbitAnnotationDrivenConfiguration. class ) public class RabbitAutoConfiguration { // 这是RabbitAutoConfiguration的注解,基本思路就是如果有Rabbitmq,spring会去加载这个bean, //而RabbitAutoConfiguration告诉spring具体怎么加载 |
spring中是怎么配置RabbitMQ的参数呢?查阅源码,只需要在properties文件配置相同名的变量就可以了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义