讲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读者可以根据上面的表格自行尝试,下一篇将继续写如何发送消息。

【Spring】使用Spring和AMQP发送接收消息(上)的更多相关文章

  1. 【Spring】使用Spring和AMQP发送接收消息(下)

    上篇讲了使用RabbitMQ发送消息,本篇则来讲接收消息.在传统JMS中有两种从队列获取信息的方式,使用JmsTemplate的同步方式以及使用消息驱动pojo的异步方式.Spring AMQP也提供 ...

  2. 【Spring】使用Spring和AMQP发送接收消息(中)

    上篇讲了RabbitMQ连接工厂的作用是用来创建RabbitMQ的连接,本篇就来讲讲RabbitMQ的发送消息.通过RabbitMQ发送消息最简单的方式就是将connectionFactory Bea ...

  3. XMPP客户端开发(2)--发送接收消息

    客户端连接上服务器并登录以后,可以发送.接收消息. 首先需要定义Chat,MessageListener和ChatMessageListener几个变量: private static Chat ch ...

  4. 十一、模拟扫码登录微信(用Django简单的布置了下页面)发送接收消息

    为了能够模拟登陆QQ,并获取信息.对扫码登录微信进行了分析.简单的用了一下Django将获取的信息映射到页面上.(python3+pycharm) 主要过程就是: 1.获取二维码 2.扫码登录(有三种 ...

  5. 安装RabbitMq,写程序发送接收消息

    1.安装Erlang和RabbitMq 在安装RabbitMq之前需要安装的Erlang(esl-erlang_22.0_windows_amd64.exe): https://pan.baidu.c ...

  6. GCM 发送接收消息 Message Client Server 服务器端,客户端

    GCM 传递参数 最近用了很多时间做GCM,由于碰到很多问题,因此详细做一下记录,以方便各位网友,不用再走我的重复的路.不过我试了一下GCM在国内很不好用.假如开发国外的程序的话,用GCM倒是很不错的 ...

  7. python通过套接字来发送接收消息

    案例如下: 1.启动一个服务端套接字服务 2.启动一个客户端套接字服务 3.客户端向服务端发送一个hello,服务端则回复一个word,并打印 参考地址:https://www.cnblogs.com ...

  8. kafka控制测试发送接收消息

    kafaka,生产者:./kafka-console-producer.sh --broker-list localhost:9092 --topic testTopic 消费者:./kafka-co ...

  9. spring 和spring cloud 组成

    spring 顶级项目:Spring IO platform:用于系统部署,是可集成的,构建现代化应用的版本平台,具体来说当你使用maven dependency引入spring jar包时它就在工作 ...

随机推荐

  1. july教你如何迅速秒杀掉:99%的海量数据处理面试题

    作者:July出处:结构之法算法之道blog 以下是原博客链接网址 http://blog.csdn.net/v_july_v/article/details/7382693 微软面试100题系列 h ...

  2. Ueditor实现自定义conttoller请求或跨域请求

    http://www.th7.cn/Program/java/201507/510254.shtml

  3. AIX上面Oracle数据库相关启动

    1,启动停止Oracle实例 (1) su -oracle (2) echo $ORACLE_SID (3) sqlplus /nolog //以不登录到数据库的方式进入sqlplus环境 (4) c ...

  4. bootstrap 树

    http://jsfiddle.net/jhfrench/GpdgF/ 把原文的i标签中的图标显示出来: 源码: <div class="tree well"> < ...

  5. C# winform 按钮设置左边图标

    按钮设置操作如下: 1.先设置按钮图标,再设置图标的对齐方式 2.再设置按钮字体的对齐方式. 3.最后设置排列: TextImageRelation:设置为ImageBeforeText

  6. SecureCRT 保存FTP用户登录密码

    Connect连接对话框->右键选择Session->选择属性->选择Connection 中的 Logon Actions->在右侧进行设置:

  7. asp.net权限认证篇外:集成域账号登录

    在之前的我们已经讲过asp.net权限认证:Windows认证,现在我们来讲讲域账号登录, 这不是同一件事哦,windows认证更多的是对资源访问的一种权限管控,而域账号登录更多的是针对用户登录的认证 ...

  8. css单位总结

    body的font-size:14px     body第二代子元素的font-size: em: 1.2em=1.2*1.2*14px rem:1.2rem=1.2*14px 视口高度:1000px ...

  9. C++ 构造函数和析构函数的调用顺序、虚析构函数的作用

    构造函数和析构函数的调用顺序 构造函数的调用顺序: 当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达最底层的目标派生类的构造函数为止. 析构函数的调用书序: ...

  10. Omi教程-组件通讯

    组件通讯 Omi框架组建间的通讯非常遍历灵活,因为有许多可选方案进行通讯: 通过在组件上声明 data-* 传递给子节点 通过在组件上声明 data 传递给子节点 父容器设置 childrenData ...