RabbitMQ 04 直连模式-Java操作
使用Java原生的方式使用RabbitMQ现在已经较少,但这是基础,还是有必要了解的。
引入依赖。
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.16.0</version>
</dependency>
实现生产者。
// 使用ConnectionFactory创建连接
ConnectionFactory factory = new ConnectionFactory();
// 设置连接信息
factory.setHost("127.0.0.1");
// 注意这里写5672,是amqp协议端口
factory.setPort(5672);
factory.setUsername("admin");
factory.setPassword("admin");
factory.setVirtualHost("/test"); // 创建Connection
Connection connection = factory.newConnection();
// 通过Connection创建新的Channel
Channel channel = connection.createChannel();
try (connection; channel) {
// 声明队列,如果此队列不存在,会自动创建
channel.queueDeclare("test_java", false, false, false, null);
// 将队列绑定到交换机
channel.queueBind("test_java", "amq.direct", "test_java_key");
// 转换为byte[],发布消息
channel.basicPublish("amq.direct", "test_java_key", null, "Hello World!".getBytes());
}
queueDeclare
方法参数如下:queue:队列的名称(默认创建后routingKey和队列名称一致)
durable:是否持久化。
exclusive:是否排他。
如果一个队列被声明为排他队列,该队列仅对首次声明它的连接可见,并在连接断开时自动删除。
排他队列是基于Connection可见,同一个Connection的不同Channel是可以同时访问同一个连接创建的排他队列。
如果一个Connection已经声明了一个排他队列,其他的Connection是不允许建立同名的排他队列的。
即使该队列是持久化的,一旦Connection关闭或者客户端退出,该排他队列都会自动被删除。
autoDelete:是否自动删除。
arguments:设置队列的其他一些参数,这里暂时不需要。
queueBind
方法参数如下:- queue:需要绑定的队列名称。
- exchange:需要绑定的交换机名称。
- routingKey:路由标识。
basicPublish
方法参数如下:- exchange:对应的Exchange名称,这里就使用第二个直连交换机。
- routingKey:这里填写绑定时指定的routingKey,其实和之前在管理页面操作一样。
- props:其他的配置。
- body:消息本体。
执行完成后,可以在管理页面中看到刚刚创建好的消息队列:
并且此消息队列已经成功与
amq.direct
交换机进行绑定:实现消费者。
// 使用ConnectionFactory创建连接
ConnectionFactory factory = new ConnectionFactory();
// 设置连接信息
factory.setHost("127.0.0.1");
// 注意这里写5672,是amqp协议端口
factory.setPort(5672);
factory.setUsername("admin");
factory.setPassword("admin");
factory.setVirtualHost("/test"); // 这里不使用try-with-resource,因为消费者是一直等待新的消息到来,然后按照设定的逻辑进行处理,所以这里不能在定义完成之后就关闭连接
// 创建Connection
Connection connection = factory.newConnection();
// 通过Connection创建新的Channel
Channel channel = connection.createChannel();
// 创建一个基本的消费者
channel.basicConsume("test_java", false, (s, delivery) -> { System.out.println(new String(delivery.getBody()));
/*
确认应答
参数 1:当前的消息标签
参数 2:是否批量处理消息队列中所有的消息,如果为false表示只处理当前消息
*/
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
/*
拒绝应答
参数 1:当前的消息标签
参数 2:倍数
参数 3:是否将当前消息放回队列,如果为false,那么消息就会被丢弃
*/
// channel.basicNack(delivery.getEnvelope().getDeliveryTag(), false, false);
/*
拒绝应答
参数 1:当前的消息标签
参数 2:是否将当前消息放回队列,如果为false,那么消息就会被丢弃
*/
// channel.basicReject(delivery.getEnvelope().getDeliveryTag(), false);
}, s -> {
});
basicConsume
方法参数如下:queue:消息队列名称,直接指定。
autoAck:自动应答。
消费者从消息队列取出数据后,需要跟服务器进行确认应答,当服务器收到确认后,会自动将消息删除,如果开启自动应答,那么消息发出后会直接删除。
deliver:消息接收后的函数回调。
可以在回调中对消息进行处理,处理完成后,需要给服务器确认应答。
cancel:当消费者取消订阅时进行的函数回调,这里暂时用不到。
执行上述代码后,控制台输出:Hello World!
,说明消息消费成功。
- 环境
- JDK 17.0.6
- Maven 3.6.3
- amqp-client 5.16.0
RabbitMQ 04 直连模式-Java操作的更多相关文章
- RabbitMQ入门-Routing直连模式
Hello World模式,告诉我们如何一对一发送和接收消息: Work模式,告诉我们如何多管齐下高效的消费消息: Publish/Subscribe模式,告诉我们如何广播消息 那么有没有灵活强一点的 ...
- java操作rabbitmq实现简单的消息发送(socket编程的升级)
准备: 1.下载rabbitmq并搭建环境(和python那篇一样:http://www.cnblogs.com/g177w/p/8176797.html) 2.下载支持的jar包(http://re ...
- 手把手一起入门 RabbitMQ 的六大使用模式(Java 客户端)
原文地址:手把手一起入门 RabbitMQ 的六大使用模式(Java 客户端) 为什么使用 MQ? 在这里我就不多说了,无非就是削峰.解耦和异步.这里没有很多关于 MQ 的理论和概念,只想手把手带你一 ...
- RabbitMQ详解(三)------RabbitMQ的五种模式
RabbitMQ详解(三)------RabbitMQ的五种模式 1.简单队列(模式) 上一篇文章末尾的实例给出的代码就是简单模式. 一个生产者对应一个消费者!!! pom.xml 必须导入Rab ...
- Java操作队列
Java操作队列 常见的几种模式: 1 简单队列simple 模型:(p + 队列 + c) P:生产者producer,将消息发送到队列 红色:消息队列 C:消费者consumer,从队列消费消 ...
- Redis-基本概念、java操作redis、springboot整合redis,分布式缓存,分布式session管理等
NoSQL的引言 Redis数据库相关指令 Redis持久化相关机制 SpringBoot操作Redis Redis分布式缓存实现 Resis中主从复制架构和哨兵机制 Redis集群搭建 Redis实 ...
- SpringBoot整合RabbitMQ实现六种工作模式
RabbitMQ主要有六种种工作模式,本文整合SpringBoot分别介绍工作模式的实现. 前提概念 生产者 消息生产者或者发送者,使用P表示: 队列 消息从生产端发送到消费端,一定要通过队列转发,使 ...
- 状态模式 java && php
状态模式 java && php 状态模式 输入信号是事件:输出是状态结果,状态模式状态机就是一个黑盒子.状态模式主要突出了两个字:”改变”,对象的状态决定了状态的行为,事物的 ...
- WMware 10 Ubuntu 12.04 进入Unity模式
/********************************************************************* * WMware 10 Ubuntu 12.04 进入Un ...
- 【WCF--初入江湖】04 WCF通信模式
04 WCF通信模式 WCF的通信模式有三种 [1]请求响应模式: 只能是客户端调用服务器; 客户端请求并等待服务器的响应后才继续执行后续操作(异步调用除外) [2]单工模式: 只能是客户端调用服务器 ...
随机推荐
- 教你如何用Keepalived和HAproxy配置高可用 Kubernetes 集群
本文分享自华为云社区<使用 Keepalived 和 HAproxy 创建高可用 Kubernetes 集群>,作者:江晚正愁余. 高可用 Kubernetes 集群能够确保应用程序在运行 ...
- Fasfdfs搭建
目录 介绍 参考 tracker-server: storage-server: group: meta data: 部署 FastDfs服务架构图 本地部署服务 安装 libfastcommon 和 ...
- 【Azure 应用服务】Azure Function App在部署时候遇见 503 ServiceUnavailable
问题描述 在VS Code中编写好 Azure Function App代码后,通过 func azure functionapp publish 部署失败,抛出 503 Service Unava ...
- 【Azure 应用服务】[App Service For Linux(Function) ] Python ModuleNotFoundError: No module named 'MySQLdb'
问题描述 在使用Azure Function创建新的Python Function时,使用MySQLdb连接数据库时候出现 ModuleNotFoundError: No module named ' ...
- 解决celery与django结合后,分别启动celery和django的进程同时调用定时任务的问题
django中引入celery后发现在代码中写如下这样的定时任务,启动celery和django的工程后,他们都会调用这个定时任务导致,任务有的时候会冲突出现奇怪的问题.如何解决请继续看. sched ...
- uniapp同步将本地图片转换为base64,支持微信、H5、APP
接上篇,少了一个方法的源代码. 先上代码: ploadFilePromiseSync = (url) => { return new Promise((resolve, reject) => ...
- Netty笔记(2) - 基本实现与异步模型
示例内容: 服务端监听6668端口 , 客户端连接 并发送信息给服务端 ,服务端收到信息打印 并返回信息给客户端 服务端代码: public class NettyServer { public st ...
- MongoDB可视化compass 连接数据库失败Invalid UTF-8 string in BSON document
An error occurred while loading navigation: Invalid UTF-8 string in BSON document 出现这个问题建议降低compass版 ...
- 记录: OpenAI中转代理API接口服务的使用
由于OpenAI提供服务的地区列表里没有 China,因此想要方便使用OpenAI API的话就需要用到中转服务. 本文介绍的iDataRiver平台便提供这样的API,且比官方OpenAI还要便宜, ...
- Zabbix技术分享——zabbix命令详解
在与IT运维的小伙伴交流过程中不少人问到了zabbix_agentd.zabbix_proxy等命令的具体使用问题,为此这一期内容我们来聊聊Zabbix相关命令,其中包括zabbix_server.z ...