1. 引用依赖

<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.1.2</version>
</dependency>

2. 连接MQ

    public static Connection getConnection() throws Exception {
// 创建一个连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.11"); // 设置rabbitmq服务器地址
factory.setPort(5672);
factory.setUsername("***");
factory.setPassword("***");
factory.setVirtualHost("testhost"); // 在后台配置的虚拟地址,类似于库,默认是/
return factory.newConnection();
}

3. 发送消息

  实现方式1:最基础的方法消息方法,只需要指定队列,不填写交换机名称会使用MQ默认的。

    public static void sendMessage(String message) throws Exception {
// 创建连接
Connection connection = ConnectionUtil.getConnection();
// 创建通道
Channel channel = connection.createChannel();
// 创建队列
// 参数1: ConnectionUtil.QUEUE_NAME,队列名称
// 参数2:true 队列是否需要持久化(队列持久化和消息持久化是两回事)
// 参数3:false 是否(排他队列)单一队列,这里表示此队列是否只给这个连接使用
// 参数4:false 是否自动删除,表示在没有人使用时是否自动删除
// 参数5:null 是个Map类型,可以传一些队列参数
channel.queueDeclare(ConnectionUtil.QUEUE_NAME,true,false,false,null);
// 参数1:交换机名称,为空时,使用默认交换机AMQP default
// 参数2:队列名称,在绑定队列之后,会把队列名称作为交换机的路由键使用
// 参数3:。。
// 参数4:消息内容,Byte类型
channel.basicPublish("", ConnectionUtil.QUEUE_NAME, null, message.getBytes());
// 关闭通道
channel.close();
// 关闭连接
connection.close();
}

  实现方式2:指定交换机类型fanout

    public static void sendMessage(String message) throws Exception {
// 创建连接
Connection connection = ConnectionUtil.getConnection();
// 创建通道
Channel channel = connection.createChannel();
// 删除交换机,因为之前测试可能申请过这个名字的交换机,更改类型会报错
channel.exchangeDelete("exchangeTest");
// 创建交换机exchange
// 参数1:交换机名称
// 参数2:交换机类型
channel.exchangeDeclare("exchangeTest", BuiltinExchangeType.FANOUT);
// 交换机与队列绑定
// 参数1:队列名称
// 参数2:交换机名称
// 参数3:routingKey路由键,fanout类型交换机是不需要路由键的
channel.queueBind("queue1", "exchangeTest", "");
// 发送消息
// 参数1:交换机名称,为空时,使用默认交换机AMQP default
// 参数2:routingKey路由键,fanout类型交换机是不需要路由键的
// 参数3:。。
// 参数4:消息内容,Byte类型
channel.basicPublish("exchangeTest", "", null, message.getBytes());
// 关闭通道
channel.close();
// 关闭连接
connection.close();
}

  实现方式3:指定交换机类型direct,其他代码跟上面一样,只是BuiltinExchangeType类型不同,绑定队列时需要填写routingKey

        channel.exchangeDeclare("exchangeTest2", BuiltinExchangeType.DIRECT);
// 交换机与队列绑定
// 参数1:队列名称
// 参数2:交换机名称
// 参数3:绑定队列的routingKey路由键,direct,routingKey是必填的
channel.queueBind("queue1", "exchangeTest2", "info.user");
channel.queueBind("queue2", "exchangeTest2", "error.user");

  实现方式4:执行交换机类型topic,routingKey是模糊匹配的

        channel.exchangeDeclare("exchangeTest3", BuiltinExchangeType.TOPIC);
// 交换机与队列绑定
// 匹配debug开头,user结尾,中间随机的路由键
channel.queueBind("queue1", "exchangeTest3", "debug.*.user");
// 匹配所有error开头的所有路由键
channel.queueBind("queue2", "exchangeTest3", "error.#");
// 匹配中断是email,前后段随机的路由键
channel.queueBind("queue3", "exchangeTest3", "*.email.*");

2.4 接收消息

  默认接收方式

public static void getMessage() throws Exception {
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
// 第一次连接时还要确认是否创建通道,没有的话使用channel.queueDeclare()方法创建
// 定义消费者,传入channel
DefaultConsumer consumer = new DefaultConsumer(channel){
/**
* 服务的监听器
* @param consumerTag 消费者标识
* @param envelope 消息详细信息:包括交换机,路由键,消息标识
* @param properties 消息配置
* @param body 消息内容
*/
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
// 打印消息
System.out.println(new String(body, "UTF-8"));
// 手动确认消息
// 参数1:消费的唯一标识,从envelope内获取
// 参数2:声明是否批量确认
channel.basicAck(envelope.getDeliveryTag(), false);
} };
// 开始消费。指定消费队列的名称,绑定消费者
// 参数1-queue:消费通道名称
// 参数2-autoAck:自动消息确认开关,默认是false,false状态需要手动确认消费消息
// 参数3-callback:消费对象
channel.basicConsume("queue1", false, consumer); // 消费者是不需要关闭连接的,因为要一直监听
}

RabbitMQ学习总结(2)-API的使用的更多相关文章

  1. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

  2. RabbitMQ学习系列(三): C# 如何使用 RabbitMQ

    上一篇已经讲了Rabbitmq如何在Windows平台安装,还不了解如何安装的朋友,请看我前面几篇文章:RabbitMQ学习系列一:windows下安装RabbitMQ服务 , 今天就来聊聊 C# 实 ...

  3. RabbitMQ学习总结 第三篇:工作队列Work Queue

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  4. RabbitMQ学习总结 第二篇:快速入门HelloWorld

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  5. RabbitMQ学习笔记1-hello world

    安装过程略过,一搜一大把. rabbitmq管理控制台:http://localhost:15672/   默认账户:guest/guest RabbitMQ默认监听端口:5672 JAVA API地 ...

  6. RabbitMQ学习在windows下安装配置

    RabbitMQ学习一. 在windows下安装配置 1.下载并安装erlang,http://www.erlang.org/download.html,最新版是R15B01(5.9.1).由于我机器 ...

  7. RabbitMQ学习系列三-C#代码接收处理消息

    RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理 http://www.80iter.com/blog/1438251320680361 http://www. ...

  8. RabbitMQ学习系列二-C#代码发送消息

    RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 http://www.80iter.com/blog/1437455520862503 上一篇已经讲了Rabbi ...

  9. RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理

    上一篇已经讲了Rabbitmq如何在Windows平台安装 不懂请移步: RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 一.理论 .net环境下,C#代码订阅 ...

随机推荐

  1. Bank Hacking题解

    题目: 题意: 有一颗树,你可以断开点(第一个随便断,以后只能是和已经断开的点相临的点),每个点有权值,断开之后,经一条边和两条边可以到达的节点权值加一,问到最后出现过的最大的权值. 分析: 为啥断开 ...

  2. C#联合WINCC之数据通信

    [公众号dotNet工控上位机:thinger_swj] 在工控领域中,WINCC仍然占有很大的市场份额.很多时候我们说学习C#开发上位机可以取代传统的组态软件,两者就像冤家一样,然而,即使是冤家,也 ...

  3. Python 字符串改变

    在Python中,字符串是不可变类型,即无法直接修改字符串的某一位字符. 因此改变一个字符串的元素需要新建一个新的字符串. 常见的修改方法有以下4种. 方法1:将字符串转换成列表后修改值,然后用joi ...

  4. 08 Flask源码剖析之flask拓展点

    08 Flask源码剖析之flask拓展点 1. 信号(源码) 信号,是在flask框架中为我们预留的钩子,让我们可以进行一些自定义操作. pip3 install blinker 2. 根据flas ...

  5. Sympy常用函数总结

    基础 from sympy import * 数学格式输出: init_printing() 添加变量: x, y, z, a, b, c = symbols('x y z a b c') 声明分数: ...

  6. 重装win7时遇到点小问题

         最近装系统的时候有个头疼的事,事情的起因是这样的,我在工作的时候用的win7,破解的时候各种工具都破解不了,说是有未分配的盘符.并且,当时装的是没更新的win7,工作上要用到ie11只能在w ...

  7. java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.CellStyle.setVerticalAlignment(Lorg/apache/poi/ss/usermodel/VerticalAlignment;)V

    项目里引入了两个不同的 POI 版本 ,可能是版本冲突引起的. 但是奇怪的是 用Eclipse在本地就失败,在公共测试 环境就是OK的,同事用的 edea 编译器也是OK的. Caused by: j ...

  8. python+requests实现接口自动化

    1. 前言 今年2月调去支持项目接口测试,测试过程中使用过postman.jmeter工具,基本能满足使用,但是部分情况下使用较为麻烦.比如:部分字段存在唯一性校验或字段间有业务性校验,每次请求均需手 ...

  9. 为Dark模拟做出的一些微小的贡献

    这几周经过liners大佬的指导,发现自己的代码实现能力确实太过于垃圾,所以根据他的指示,我应该去多多练习一下Dark模拟,但是最近刚刚入手Dark模拟的我感到非常的吃力,所以本人今天写博客一篇来讲述 ...

  10. jupyter中%matplotlib inline报错

    学习matplotlib时,使用的jupyter跑代码.报错如上图.大致就是后面的注释不能被识别.我寻思着注释不用识别吧,大概是因为%后跟的语句被全部当成命令行执行了,然后命令行不识别行内注释,导致报 ...