一 .概述

  本部分的主要的内容都是从spring amqp的官文档之中摘录过来的.


二 .spring amqp的抽象

[1] 消息 :

  在spring amqp之中,使用Message来抽象消息的内容.

public class Message {private final MessageProperties messageProperties;private final byte[] body;public Message(byte[] body, MessageProperties messageProperties) {this.body = body;this.messageProperties = messageProperties;}public byte[] getBody() {return this.body;}public MessageProperties getMessageProperties() {return this.messageProperties;}
}

从上面的定义之中,我们可以看到,一个消息被抽象称为两个部分,一个就是消息的主体,被抽象为是一个字节数组,另外一个部分就是MessageProperties .

[2]交换机Exchange

public interface Exchange {String getName();String getExchangeType();boolean isDurable();boolean isAutoDelete();Map<String, Object> getArguments();}

常见的,我们可以使用下面的实现类:

public abstract class ExchangeTypes {public static final String DIRECT = "direct";public static final String TOPIC = "topic";public static final String FANOUT = "fanout";public static final String HEADERS = "headers";public static final String SYSTEM = "system";/*** The constant to represent {@code x-delayed-message} exchange mode.* @deprecated since 1.6.4, it's not a user-available exchange type,* the delayed {@code boolean} is used for that.*/@Deprecatedpublic static final String DELAYED = "x-delayed-message";
}

我们可以看到最常用的direct类型, topic类型,fanout类型.

[3]队列

public class Queue  {private final String name;private volatile boolean durable;private volatile boolean exclusive;private volatile boolean autoDelete;private volatile Map<String, Object> arguments;/*** 队列是持久的,非排他的和非自动删除的。** @param name 队列名*/public Queue(String name) {this(name, true, false, false);}// Getters and Setters omitted for brevity

}

我们可以通过上面的队列完成一个队列的创建.

[4]绑定

public class Binding extends AbstractDeclarable {public enum DestinationType {QUEUE, EXCHANGE;}

另外,我们也可以通过构建者模式来创建一个队列

Binding b = BindingBuilder.bind(someQueue).to(someTopicExchange).with("foo.*");

上面的代码表示的就是 绑定 一个队列到一个交换机,然后使用的一个绑定建.


三 .连接

  在spring amqp之中使用ConnectionFactory来抽象Rabbitmq客户端之中的ConnectionFacory对象,我们一般会使用CachingConnectionFacotory对象来作为实现.

如何声明一个ConnectionFactory对象.

[1]xml的方式:

<rabbit:connection-factoryid="connectionFactory" channel-cache-size="50"/>

上面的代码会默认向容器之中添加一个ConnectionFactory对象.

另外,我们通过这种方式进行ConnetionFactory的一些属性的设置.


四 .配置RabbitTemplate对象

[1]return机制

  我们使用return机制非常的简单.

        template.setMandatory(true);template.setReturnCallback(new ReturnCallback() {@Overridepublic void returnedMessage(Message message, int replyCode, String replyText, String exchange,String routingKey) {// 当消息没有被送回到的时候,会回调这个方法.// 其中基本的信息都已经有了.
            }});

在上面,我们需要注意的就是两点内容:

[1]设置属性mandatory属性为true

[2]设置一个回调的函数

[2]Confirm机制

我们使用确认机制也非常的简单,如下:  

template.setConfirmCallback(new ConfirmCallback() {@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {System.out.println("确认消息");}});


五 . 消息的发送  

void send(Message message) throws AmqpException;void send(String routingKey, Message message) throws AmqpException;void send(String exchange, String routingKey, Message message) throws AmqpException;

在发送过程之中,我们需要创建一个消息.

Message message = MessageBuilder.withBody("foo".getBytes()).setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN).setMessageId("123").setHeader("bar", "baz").build();

Message message = MessageBuilder.withBody("foo".getBytes()).setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN).setMessageId("123").setHeader("bar", "baz").build();

上面的两种方式都可以使用构建者模式创建一个消息对象.


六 .消息的接收

  我们一般情况下都会使用注解驱动的方式完成消息的消费.

    <rabbit:annotation-driven/>

@Component
public class MyService {@RabbitListener(bindings = @QueueBinding(value = @Queue(value = "myQueue", durable = "true"),exchange = @Exchange(value = "auto.exch", ignoreDeclarationExceptions = "true"),key = "orderRoutingKey"))public void processOrder(String data) {...}@RabbitListener(bindings = @QueueBinding(value = @Queue,exchange = @Exchange(value = "auto.exch"),key = "invoiceRoutingKey"))public void processInvoice(String data) {...}}

在上面,我们使用@RabbitListener来完成一个消息的监听,每当消息到达的时候,都会回调对应的方法.

更常见的:

我们仅仅只需要监听一个队列就可以了.  

   @RabbitListener(queues = "myQueue")public void processOrder(String data) {...}

其中,我们最为关系的就是方法的参数,在spring amqp之中,变得更加的灵活了.

原始的org.springframework.amqp.core.Message。
接收消息的com.rabbitmq.client.Channel

另外,我们可以使用下面的注解完成一些参数的映射.

(1)@payload 将消息的body进行转换

(2)使用@Header 叫消息的头进行转换

更一般的,我们喜欢使用下面的这种方式进行.

@RabbitListener(queues = "myQueue")
public void processOrder(Message<Order> order) { ...
}

注意:这个接口是下面的这种类型:

public interface Message<T> {T getPayload();MessageHeaders getHeaders();
}

转载于:https://www.cnblogs.com/trekxu/p/9791895.html

035 spring amqp相关推荐

  1. spring amqp rabbitmq fanout配置

    基于spring amqp rabbitmq fanout配置如下: 发布端 <rabbit:connection-factory id="rabbitConnectionFactor ...

  2. php stomp rabbitmq,docker环境下的RabbitMQ部署,Spring AMQP使用

    AMQP简介 AMQP,即 Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦和 ...

  3. Spring AMQP 教程

    Spring AMQP 我们今天将研究Spring AMQP. 目录[ 隐藏 ] 1 Spring AMQP 1.1什么是AMQP? 1.2为什么我们需要AMQP? 1.3 JMS和AMQP之间的区别 ...

  4. Spring AMQP RabbitMQ示例

    Spring AMQP RabbitMQ示例 今天我们将研究Spring AMQP RabbitMQ示例应用程序.我们之前的帖子中已经讨论了一些"Spring AMQP基础知识理论" ...

  5. Spring AMQP ActiveMQ教程

    Spring AMQP ActiveMQ教程 欢迎使用Spring AMQP ActiveMQ教程.之前我们研究过安装Apache ActiveMQ服务器.今天我们将创建一个Spring应用程序来使用 ...

  6. Spring AMQP + Rabbit 配置多数据源消息队列

    一般在稍微大一点的项目中,需要配置多个数据库数据源,最简单的方式是用 Spring 来实现,只需要继承 AbstractRoutingDataSource 类,实现 determineCurrentL ...

  7. RabbitMQ(6)-Spring AMQP,Spring集成RabbitMQ

    2019独角兽企业重金招聘Python工程师标准>>> 一.Qucik Start 1.rabbitmq-producer.xml <?xml version="1. ...

  8. day72 JavaWeb框架阶段——RabbitMQ消息队列【了解常见的MQ产品,了解RabbitMQ的5种消息模型,会使用Spring AMQP】

    文章目录 0.学习目标 1.RabbitMQ 1.1.搜索与商品服务的问题 1.2.消息队列(MQ) 1.2.1.什么是消息队列 1.2.2.AMQP和JMS 1.2.3.常见MQ产品 1.2.4.R ...

  9. Spring AMQP参考手册

    一.快速入门 Maven依赖声明 <dependency>     <groupId>org.springframework.amqp</groupId>     ...

  10. Spring AMQP 源码分析 01 - Impatient

    ### 准备 ## 目标 了解 Spring AMQP 核心代码 ## 前置知识 RabbitMQ 入门 ## 相关资源 Quick Tour for the impatient:<http:/ ...

最新文章

  1. return与exit()
  2. 编译内核指定模块,筛选当前模块依赖的组件
  3. 如何利用 C# + Python 破解猫眼电影的反爬虫机制?
  4. android 动画引擎,一个使用openGL渲染的炫丽Android动画库
  5. python3手机版下载-Python3中文版下载
  6. 48session的生命周期
  7. 在Python2.7下如何安装TA-lib库
  8. 东京战纪服务器维护中,东京战纪7月21维护公告 当前测试进度介绍
  9. LINUX环境并发服务器的三种实现模型
  10. 递归函数与二分查找算法
  11. 保存更新失败,事务回滚,但是MQ消息发送成功。
  12. 与计算机程序设计的文献,计算机编程语言参考文献
  13. 网页简单轮播图的实现
  14. android gms认证之run host test,Android GMS认证项总结
  15. Thinkpad E450c WIN8 重装系统 如何U盘启动
  16. mdx格式的词典用什么软件打开_抄作业了!手把手教你安装欧路词典(ios系统为例)...
  17. ios swift收起键盘
  18. 联想E420麦克风没有声音的方案
  19. 微信聊天记录内的文件如何实现自动同步备份?
  20. diskgenius系统迁移_手把手教你如何优化windows7操作系统

热门文章

  1. 本地开发phpmyadmin去登陆验证
  2. 发现有的时候,EBS会报连接数不足的问题
  3. FileUtils类 使用举例
  4. 为什么要进行URL编码!!!
  5. 用了很多年的 CMS 垃圾收集器,终于换成了 G1,真香!!
  6. python全栈薪资这么高,你知道大厂面试都问什么吗?
  7. 你还在用迭代器处理集合吗?试试Stream,真香!
  8. 哈哈,代码比较工具,好像就这5款比较顺手~~~
  9. 终于找全啦!一二线城市知名互联网公司名单!对着找就对了...
  10. Spring Cloud 和 Dubbo,到底用哪个好?