使用Java原生的方式使用RabbitMQ现在已经较少,但这是基础,还是有必要了解的。

  1. 引入依赖。

    <dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.16.0</version>
    </dependency>
  2. 实现生产者。

    // 使用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交换机进行绑定:

  3. 实现消费者。

    // 使用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操作的更多相关文章

  1. RabbitMQ入门-Routing直连模式

    Hello World模式,告诉我们如何一对一发送和接收消息: Work模式,告诉我们如何多管齐下高效的消费消息: Publish/Subscribe模式,告诉我们如何广播消息 那么有没有灵活强一点的 ...

  2. java操作rabbitmq实现简单的消息发送(socket编程的升级)

    准备: 1.下载rabbitmq并搭建环境(和python那篇一样:http://www.cnblogs.com/g177w/p/8176797.html) 2.下载支持的jar包(http://re ...

  3. 手把手一起入门 RabbitMQ 的六大使用模式(Java 客户端)

    原文地址:手把手一起入门 RabbitMQ 的六大使用模式(Java 客户端) 为什么使用 MQ? 在这里我就不多说了,无非就是削峰.解耦和异步.这里没有很多关于 MQ 的理论和概念,只想手把手带你一 ...

  4. RabbitMQ详解(三)------RabbitMQ的五种模式

    RabbitMQ详解(三)------RabbitMQ的五种模式 1.简单队列(模式) 上一篇文章末尾的实例给出的代码就是简单模式. 一个生产者对应一个消费者!!! pom.xml ​ 必须导入Rab ...

  5. Java操作队列

    Java操作队列 常见的几种模式:   1 简单队列simple 模型:(p + 队列 + c) P:生产者producer,将消息发送到队列 红色:消息队列 C:消费者consumer,从队列消费消 ...

  6. Redis-基本概念、java操作redis、springboot整合redis,分布式缓存,分布式session管理等

    NoSQL的引言 Redis数据库相关指令 Redis持久化相关机制 SpringBoot操作Redis Redis分布式缓存实现 Resis中主从复制架构和哨兵机制 Redis集群搭建 Redis实 ...

  7. SpringBoot整合RabbitMQ实现六种工作模式

    RabbitMQ主要有六种种工作模式,本文整合SpringBoot分别介绍工作模式的实现. 前提概念 生产者 消息生产者或者发送者,使用P表示: 队列 消息从生产端发送到消费端,一定要通过队列转发,使 ...

  8. 状态模式 java && php

    状态模式 java && php     状态模式 输入信号是事件:输出是状态结果,状态模式状态机就是一个黑盒子.状态模式主要突出了两个字:”改变”,对象的状态决定了状态的行为,事物的 ...

  9. WMware 10 Ubuntu 12.04 进入Unity模式

    /********************************************************************* * WMware 10 Ubuntu 12.04 进入Un ...

  10. 【WCF--初入江湖】04 WCF通信模式

    04 WCF通信模式 WCF的通信模式有三种 [1]请求响应模式: 只能是客户端调用服务器; 客户端请求并等待服务器的响应后才继续执行后续操作(异步调用除外) [2]单工模式: 只能是客户端调用服务器 ...

随机推荐

  1. Visual Studio部署C++环境下OpenCV库

      本文介绍在Visual Studio 2022中配置.编译C++计算机视觉库OpenCV的方法. 1 OpenCV库配置   首先,我们进行OpenCV库的下载与安装.作为一个开源的库,我们直接在 ...

  2. uni-app实现公众号登陆实现

    公众号实现登陆流程思路: 1. 创建一个页面用于登陆,页面上需要有输入账号和密码的表单,以及登陆按钮.2. 在登陆按钮的点击事件中,调用后端接口进行账号密码校验.如果校验通过,则将后端返回的用户信息保 ...

  3. 多个 .NET Core SDK 版本之间进行切换 global.json

    由于同一台电脑可以安装多个版本的.NET Core SDK. 当安装了许多不同版本的.NET Core SDK 之后,要如何才能使用旧版dotnet 命令,执行dotnet new 或dotnet b ...

  4. Mac下使用Docker快速布署FastGPT实现AI私有知识库

    FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理.模型调用等能力.同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景! 官网地址为:https: ...

  5. .NET集成DeveloperSharp实现强大的AOP

    (适用于.NET/.NET Core/.NET Framework)[目录]0.前言1.第一个AOP程序2.Aspect横切面编程3.一个横切面程序拦截多个主程序4.多个横切面程序拦截一个主程序5.优 ...

  6. 华为sound x智能音箱初体验

    外观颜值   在这个网红遍地的年代,好看的皮囊是那么的重要.很多东西,买与不买,只是你在电脑的橱上看它一眼.颜值对一个消费电子产品来说,在这个虚拟的互联网世界中是那么的重要.sound x的初次看来, ...

  7. C++ 赋值操作和assign()的区别(转自stack overflow)

    https://stackoverflow.com/questions/19735395/stl-assignment-operator-vs-assign-member-function assig ...

  8. 今日头条Linux 运维工程师面试真题

    今日头条Linux 运维工程师面试真题 首先我们来看下今日头条 Linux 运维工程师招聘岗位要求: [岗位定义]系统运维工程师 [岗位薪资]10K-24K [基本要求]北京 / 经验 3-5 年 / ...

  9. 3DCAT+上汽奥迪:打造新零售汽车配置器实时云渲染解决方案

    在 5G.云计算等技术飞速发展的加持下,云渲染技术迎来了突飞猛进的发展.在这样的背景下,3DCAT应运而生,成为了业内知名的实时云渲染服务商之一. 交互式3D实时云看车作为云渲染技术的一种使用场景,也 ...

  10. 3DCAT将携Cloud3D/XR解决方案亮相视博会

    2021年05月10日-12日,亚洲视觉智能与沉浸式产业博览会将在广州·中国进出口商品交易会展展馆隆重开幕!届时,3DCAT实时渲染云将携Cloud3D.CloudXR解决方案惊艳亮相,4.2号展馆H ...