`
weknow619
  • 浏览: 62230 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

【Spring】使用Spring和AMQP发送接收消息(上)

阅读更多
讲AMQP之前,先讲下传统的JMS的消息模型,JMS中主要有三个参与者:消息的生产者、消费者、传递消息的通道(队列或者主题),两种消息模型如下:
通道是队列:

通道是主题:

在JMS中,虽然通道有助于解耦消息的生产者和消费者,但这两者依然会与通道相耦合。生产者会将消息发布到一个特定的队列或主题上,消费者从特定的队列或主题上接收这些消息,通道具有双重责任,就是传递数据和确定这些消息该发送到什么地方,队列的话会使用点对点算法发送,主题的话就使用发布-订阅方式。
而使用AMQP的话,生产者并不会直接将消息发布到队列中,AMQP的消息的生产者以及传递消息的队列之间引入间接机制Exchange,Exchange再与队列绑定。关系图如下:


从图可以看出Exchange收到消息后,Exchange会将信息路由到队列上,消费者再从队列中取数据并处理。这里Exchange不是简单地把消息传递到队列中,AMQP定义了四种不同类型的Exchange,每种都有不同的路由算法,以此决定是否将信息放到队列中。根据Exchange算法的不同,它可能会使用消息的routing key和/或参数,并将其与Exchange和队列之间的binding和routing key和参数进行对比,如果对比结果满足相应的算法,那么消息就路由到该队列上。

AMQP中定义的四种不同类型的Exchange:
Direct:如果消息的routing key与binding的routing key直接匹配的话,消息将会路由到该队列上;
Topic:如果消息的routing key与binding的routing key符合通配符匹配的话,消息将会路由到该队列上;
Headers:如果消息参数表中的头信息和值都与binding参数表相匹配,消息将会路由到该队列上;
Fanout:不管消息的routing key和参数表的头信息/值是什么,消息将会路由到所有队列上。
这里要深入了解AMQP的到www.amqp.org查看,下面使用Spring、AMQP实现发送、接收消息。


先配置Spring支持AMQP消息
使用Spring AMQP前要先配置一个连接工厂,具体来讲,这里选择配置RabbitMQ连接工厂。RabbitMQ实现了AMQP,也是目前较常用的消息代理。使用RabbitMQ发送接收消息前,要先安装RabbitMQ,具体安装步骤可以在www.rabbitmq.com/download.html上找到安装指南,这里就不详细展开。

配置RabbitMQ连接工厂最简单的方式是使用Spring AMQP所提供的rabbit配置命名空间,要使用该功能,首先要确保Spring配置文件中声明了该模式:

<?xml version="1.0" encoding="UTF-8"?>  
<beans:beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:rabbit="http://www.springframework.org/schema/rabbit"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans.xsd  
    http://www.springframework.org/schema/rabbit  
    http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd"> 
...
</beans:beans>

这个配置不是必须的,这里选择将rabbit作为首选命名空间,将beans作为第二的命名空间,因为在这个配置中,会更多的声明rabbit而不是bean,这样的话,只会有少量的bean元素使用“beans:”前缀,而rabbit元素就能避免使用前缀了。

rabbit命名空间包含了多个在Spring中配置RabbitMQ的元素,用得最多的就是<connection-factory>,使用时最好给其设置一个bean ID,不然就难将连接工厂装配到需要它的bean中了。

<connectioin-factory id="connectionFactory">

连接工厂默认情况下会设置RabbitMQ服务器监听localhost的5672端口,用户名密码都为guest,一般在开发环境可以不作修改,在生产环境的修改方式如下 :
<connectioin-factory id="connectionFactory" 
      host="${rabbitmq.host}"
      post="${rabbitmq.post}"
      username="${rabbitmq.username}"
      password="${rabbitmq.password}" 
/>

这样设置的好处是具体值可以到属性文件中配置。

接下来看看如何创建队列、Exchange、binding
在传统的JMS中,队列和主题的路由行为是通过规范建立的,而AMQP依赖于如何定义队列和Exchange以及如何将它们绑定在一起。声明队列、Exchange和binding的一种方式是使用RabbitMQ Channel接口的各种方法,不过这里使用rabbit命名空间更加方便,它包含了多个元素,可以帮我们声明队列、Exchange以及将它们结合在一起的binding。元素如下:

这些配置元素要与<admin>元素一起使用,<admin>元素会创建一个RabbitMQ管理组件,如果上述表格中的元素在RabbitMQ代理中尚未存在的话,<admin>会自动创建它们。
比如现在想声明名为spittle.test.queue的队列,只需要在Spring配置中添加如下配置即可:

<admin connection-factory="connectionFactory" />
<queue id="spittleTestQueue" name="spittle.test" />

当如此配置时,Exchange默认是一个没有名称的direct Exchange,所有队列都会绑定到这个Exchange中,并且routing key与队列的名称相同。在这样的配置下,我们可以将消息发送到这个没有名称的Exchange上,并将routing key设定为spittle.test.queue,这样消息就会路由到这个队列中(其实这里就类似于JMS的点对点模型)。
其他有意思的路由需要我们自行声明一个或更多的Exchange,并将其绑定到队列上,比如不管routing key是什么, 要将消息路由到多个队列上,可以按照如下方式配置一个fanout以及多个队列:

<admin connection-factory="connectionFactory" />
<queue  name="spittle.test.queue.1" >
<queue  name="spittle.test.queue.2" >
<queue  name="spittle.test.queue.3" >
<fanout-exchange name="spittle.fanout">
  <bindings>
    <binding queue="spittle.test.queue.1" />
    <binding queue="spittle.test.queue.2" />
    <binding queue="spittle.test.queue.3" />
  </bindings>
</fanout-exchange>


其他类型的Exchange读者可以根据上面的表格自行尝试,下一篇将继续写如何发送消息。
0
0
分享到:
评论

相关推荐

    rabbitmq学习10:使用spring-amqp发送消息及异步接收消息

    标题中的“rabbitmq学习10:使用spring-amqp发送消息及异步接收消息”表明了本次讨论的主题,即如何在Spring框架中利用Spring AMQP组件与RabbitMQ进行交互,实现消息的发送和异步接收。RabbitMQ是一个开源的消息代理...

    SpringAMQP-支持使用AMQP的Spring编程模型

    5. **RabbitTemplate**:这是 Spring AMQP 的主要操作接口,提供了一系列的方法来发送和接收消息。它封装了与 RabbitMQ 服务器的交互,包括直接发送、发布/订阅、路由等模式。 6. **消息转换器**:Spring AMQP 提供...

    spring-amqp文档.zip

    - `RabbitTemplate`:这是Spring AMQP的主要入口点,提供发送和接收消息的方法,简化了与RabbitMQ服务器的交互。 - `Message`和`MessageProperties`:`Message`代表AMQP的消息,`MessageProperties`包含消息的元...

    spring-amqp 1.5.3源码

    1. **RabbitTemplate**:这是Spring AMQP的核心类,它提供了一种声明式的方式来发送和接收消息。RabbitTemplate简化了与RabbitMQ服务器的交互,包括创建信道、发送和接收消息等操作。 2. **AmqpAdmin**:这是一个...

    Spring AMQP 2 中文 参考手册 中文文档

    快速游览(Quick Tour)部分展示了如何使用Spring AMQP发送和接收消息。Spring AMQP通过提供`RabbitTemplate`类来简化消息的发送和接收过程,该类封装了发送消息和接收消息的通用方法。在代码示例中,首先创建了一个...

    spring-amqp,spring-retry,spring-rabbit

    - 模板机制:Spring AMQP核心的`AmqpTemplate`简化了发送和接收消息的过程。 - 消费者监听:通过`@RabbitListener`注解实现消息消费者,可以监听特定队列并处理消息。 - 异步消息处理:支持异步消息处理,提高...

    spring-amqp 相关jar

    Spring AMQP 是一个由 Spring Framework 提供的框架,它允许开发者使用 Spring 的编程模型与 RabbitMQ 消息中间件进行交互。RabbitMQ 是一种流行的开源消息代理,它实现了 Advanced Message Queuing Protocol (AMQP)...

    Spring AMQP 1.5.3.RELEASE API

    3. **RabbitTemplate**:这是Spring AMQP的核心组件,它提供了一组模板方法,简化了发送和接收消息的过程。开发者可以通过RabbitTemplate进行基本的消息操作,如发送消息到指定队列,或者从队列中消费消息。 4. **...

    spring-amqp

    Spring AMQP 允许使用模板方法和回调函数来处理消息的发送和接收。例如,可以提供一个回调函数,当消息发送失败时执行错误处理逻辑。 **7. Spring Boot 集成** Spring Boot 提供了对 Spring AMQP 的开箱即用支持,...

    java rabbitmq spring springAMQP 代码包 project

    开发者可能会在项目中创建`ConnectionFactory`以连接到RabbitMQ服务器,定义`Queue`和`Exchange`,并使用`RabbitTemplate`或`AmqpAdmin`来发送和接收消息。同时,Spring的`@RabbitListener`注解可能被用来监听特定...

    spring-amqp-reference.pdf

    - 参考部分提供了使用Spring AMQP的详细指南,包括AMQP的基础抽象(如消息、交换器、队列、绑定等概念)、连接和资源管理、消息发送和接收的API等。 4. AMQP基础抽象 - 消息(Message):AMQP中的基本数据单位,...

    spring-cloud-config + spring-cloud-bus-amqp实现分布式集群配置动态更新

    Spring Cloud Config 和 Spring Cloud Bus AMQP 的结合使用为解决这一问题提供了一种优雅的解决方案。让我们深入探讨这两个组件以及它们如何协同工作来实现配置的动态更新。 Spring Cloud Config 是一个用于微服务...

    spring rabbitmq amqp

    创建消息生产者(Producer)时,Spring提供了一个`RabbitTemplate`类,我们可以使用它来发送消息到指定的交换机(Exchange)。交换机根据预设的路由键(Routing Key)将消息分发到相应的队列(Queue)。队列是消息的...

    spring amqp实现异步消息队列的股票系统

    1. `RabbitTemplate`:这是Spring AMQP的核心工具类,用于发送和接收消息。我们可以使用它来发布股票数据到指定的交换机,并配置交换机的类型(如Direct、Fanout、Topic等)和路由键。 2. `@RabbitListener`:这是...

    spring amqp rabbit 标签使用

    `RabbitTemplate`是Spring AMQP的核心组件,用于发送和接收消息。你可以通过`@Bean`注解在配置类中创建它: ```java @Bean public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { ...

    spring-amqp-1.2.2.RELEASE.zip

    `RabbitTemplate`是Spring AMQP的核心工具类,它提供了发送和接收消息的便捷方法。 7. **Listener容器**: Spring AMQP提供了两种监听容器,一种是基于SimpleMessageListenerContainer,另一种是基于...

    spring amqp rabbit 消息确认及外部事物

    这个项目可能包括配置文件、示例代码以及测试用例,帮助开发者更好地理解和实践Spring AMQP与RabbitMQ的事务和消息确认。 总的来说,理解并掌握Spring AMQP与RabbitMQ的消息确认和外部事务对于构建高可用、高可靠的...

    Spring AMQP hello world

    AMQP是一种开放标准的消息协议,它定义了消息生产者、消费者和消息队列之间的交互方式。RabbitMQ是基于AMQP的开源消息代理,广泛应用于分布式系统中的异步任务处理和解耦。 Spring AMQP提供了与RabbitMQ集成的便利...

    spring amqp 配置实现rabbitmq 路由

    RabbitMQ是一个开源的消息代理和队列服务器,它遵循AMQP协议,用于在分布式系统中发送和接收消息。通过使用RabbitMQ,应用程序可以解耦它们之间的通信,提高系统的可扩展性和可靠性。 Spring AMQP提供了一组API和...

Global site tag (gtag.js) - Google Analytics