【RabbitMQ】Java操作RabbitMQ之入门Demo

news2024/12/23 10:54:13

目录

一、项目创建

二、生产者

三、消费者

一、项目创建

我们先在idea里创建两个Maven项目一个项目作为生产者,另一个作为消费者。创建完成后,在各自的pom.xml文件里引入Java使用RabbitMQ的依赖

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

然后在对应的项目里创建 消费者类与生产者类

二、生产者

由之前文章里我们了解到RabbitMQ的通信如下图,我们要想将生产者生产的消息存入队列,我们就一个先获得Connection(连接)然后通过连接获取到channel,然后选择虚拟机交换机以及队列等最后关闭连接【RabbitMQ】RabbitMQ的简介_1373i的博客-CSDN博客icon-default.png?t=N2N8https://blog.csdn.net/qq_61903414/article/details/130139970?spm=1001.2014.3001.5501

 我们获取连接是通过连接工厂进行获取的所以此时我们先要去创建连接工厂并给他配置相应的信息

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Producer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.获取配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");
    }
}

此时我们可以通过连接工厂获取到连接connection,然后获取到channel

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Producer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.获取配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
    }
}

此时我们需要去在MQ里创建队列,通过channel里的queueDelclare方法来创建该方法有以下参数

参数说明
queue要创建队列的名称
durable该队列里的消息是否持久化
exclusive1》是否只允许一个消费者监听消费2》当连接关闭时是否销毁该队列
autoDelete没有consumer是否自动删除
arguments在后续文章里会详细讲到
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Producer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.获取配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.创建队列
        channel.queueDeclare("EmailQueue",true,false,false,null);
    }
}

此时我们就可以通过channel里的basicPublish方法进行发送消息,该方法有以下参数

参数说明
exchange交换机(后续详细讲到,此处使用默认交换机)
routingKey路由名称(后续讲到,由于此处使用默认交换机所以路由名称为队列名)
props相关的配置信息
body要发送的消息
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Producer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.获取配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.创建队列
        channel.queueDeclare("EmailQueue",true,false,false,null);

        // 4.发送消息
        channel.basicPublish("","EmailQueue",null,"hello mq".getBytes());
        
        // 5.关闭连接
        channel.close();
        connection.close();
    }
}

 发送完成后关闭连接即可,运行程序后此时mq队列里存在了一条消息

 

三、消费者

在实现消费者时,我们也需要先建立连接所以前个步骤与生产者相同

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Consumer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.获取配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

    }
}

此时建立连接后我们通过basicConsume该方法进行获取消息,参数如下

参数说明
queue从哪个队列获取消息
autoAck获取到信息后是否自动给MQ服务器发送确认收到
callback收到消息后的回调对象,需要手动实现
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Consumer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.获取配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.获取消息
        channel.basicConsume("EmailQueue",true,consumer);
    }
}

我们此时还需要去手动实现回调对象,通过匿名内部类实现回调对象的回调方法

import com.rabbitmq.client.*;
import com.rabbitmq.client.Consumer;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Consumer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.获取配置连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/DemoVirtualHost");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 2.建立连接
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        // 3.获取消息
        Consumer consumer = new DefaultConsumer(channel) {
            /**
             * 回调方法 收到信息后自动执行该方法
             * @param consumerTag 消息唯一标识
             * @param envelope    获取信息
             * @param properties  获取配置信息
             * @param body        消息
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("consumerTag :" + consumerTag);
                System.out.println("exchange :" + envelope.getExchange());
                System.out.println("routingKey ;" + envelope.getRoutingKey());
                System.out.println("properties :"+ properties);
                System.out.println("consumer 消费消息 :" + new String(body));
            }
        };
        channel.basicConsume("EmailQueue",true,consumer);
    }
}

运行代码此时就可以获得存入的消息

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 单位和尺寸 以及ViewPager的使用

一 px 和 pt 1 px pixels 像素点 2 pt point 一个标准的长度单位&#xff0c;1pt 1/72英寸&#xff0c;用于印刷业&#xff0c;非常简单易用。 二 dp 和 sp 1 dp 就是 dip device independent pixels(设备独立像素) 不同设备有不同的显示效果。这个和设备硬件有关系&…

【数学推导找规律】全排列的价值【蓝桥杯13届】

欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#xff1a;重难点★✔ 蓝色文字表示&#…

ChatGPT资讯—2023.4.14

一、 最新资讯 1. 国内大模型&#xff1a; 4月8日&#xff0c;华为云人工智能领域首席科学家田奇首次介绍了华为“盘古大模型”的进展及其应用。 紧接着4月10日&#xff0c;一天内三个大模型争相“官宣”&#xff0c;包括搜狗创始人王小川宣布即将投入创业的大模型产品名为“…

机器学习 day04(梯度下降算法,学习率,偏导数)

梯度下降 我们可以用一种更系统的方法&#xff0c;来找到一组w&#xff0c;b&#xff0c;使成本函数的值最小。这个方法叫梯度下降算法&#xff0c;它可用于最小化任何函数&#xff0c;不仅仅包括线性回归的成本函数&#xff0c;也包括两个以上参数的其他成本函数在线性回归中…

2023最新面试题-Java-4

Date相关 1. java8的Date相关API&#xff1a; 常用 api 1、 获取当前日期 LocalDate.now() 2、创建日期 LocalDate date LocalDate.of(2020, 9, 21) 3、获取年份 date.getYear()//通过 TemporalField 接口的实现枚举类 ChronoField.YEAR 获取年份 date.get(ChronoFie…

车载通信——J1939 DM1

诊断故障代码&#xff08;DTC&#xff09;由4 个独立域构成&#xff1a; a. 可疑参数的编号(SPN) 19位 b. 故障模式标志(FMI) 5位 c. 发生次数(OC) 7位 d. 可疑参数编号的转化方式(CM) 1 位 Byte1 – Lamp Status Bits1 – 2 Protection Lamp 保护灯状态 …

基于 NIOSII 软核的流水灯实验

文章目录一、硬件部分设计1、进行 Qsys 系统设计二、逻辑连接三、软件设计四、总结一、硬件部分设计 1、进行 Qsys 系统设计 新建kernel.qsys文件&#xff1a; 设置clk时钟&#xff1a; 添加 Nios II 其余选项保持默认 添加 jtag uart 接口 添加片上存储器 On-Chip Memory(R…

【C++高级】手写线程池项目-经典死锁问题分析-简历项目输出指导

作为五大池之一&#xff0c; 线程池的应用非常广 泛&#xff0c;不管是客户端程序&#xff0c;还是后台服务程序&#xff0c;掌握线程池&#xff0c;是提高业务处理能力的必备模块 本课程将带你从零开始&#xff0c;设计一个支持fixed和cached模式的线程池&#xff0c;玩转C11、…

使用FRP(快速反向代理)实现内网穿透——以腾讯云服务器为例

一、FRP简介 FRP&#xff0c;即快速反向代理技术&#xff08;fast reverse proxy&#xff09;。本文的FRP程序是基于github开源项目GitHub - fatedier/frp。当前&#xff0c;该程序可实现&#xff1a;“将位于 NAT 或防火墙后面的本地服务器暴露给互联网”。它目前支持 TCP 和…

金山衍生新软件,wps,excel用户已在用,Access用户:以后就它了

我们常会用到微软的办公软件Word、Excel、PPT、Outlook&#xff0c;但在数据处理方面还是得看Access。Access用简短的表述来说就是微软开发的一个关系数据库管理系统。★好用&#xff0c;可门槛高&#xff0c;够不着 为啥说数据处理得看Access呢&#xff1f;举个例子&#xff0…

如何实现视觉识别形状

1. 功能说明 通过摄像头识别圆形及矩形两种形状。 2. 电子硬件 本实验中采用了以下硬件&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09; 扩展板 Bigfish2.1 电池7.4V锂电池通信2510通信转接板WiFi路由器 其它 摄像头 配置OpenCV的Visual Studio 2015.…

深入了解网络通信原理

同一个 vlan 同一个网段的 ip 地址能够直接互通&#xff0c;那么同一个 vlan 不同的网段能不能互通呢&#xff1f;海翎光电的小编整理了一篇文章&#xff0c;可以解决大家在网络中遇到的一些奇怪的问题&#xff0c;也是可以加深对网络的理解。 一、同 VLAN 不同网段能否 Ping 通…

Linux基本背景介绍与应用场景,Linux两条版本线,创建删除用户与修改密码的指令

TIPS Linux是一款叫做操作系统的软件&#xff0c;比如说你买了一个笔记本&#xff0c;你以为你只买了一个笔记本&#xff0c;实际上笔记本里面还搭建了一个非常重要的软件&#xff1a;操作系统。正是因为有了操作系统的存在&#xff0c;所以说有一个行为&#xff1a;开机就诞生…

再摘一枚重要奖项!腾讯安全获得云安全联盟CSA 2022安全金盾奖

4月13日&#xff0c;第六届云安全联盟大中华区大会&#xff08;CSA GCR Congress&#xff09;在上海举办&#xff0c;大会由联合国数字安全联盟、上海市经济和信息化委员会、上海市委网络安全和信息化委员会办公室、上海市普陀区人民政府指导&#xff0c;云安全联盟大中华区主办…

【开源项目】BallCat 项目脚手架

简介 &#x1f389;&#x1f389;&#x1f389; 基于 React 和 Ant Design 版本的前端 ballcat-ui-react 已发布&#xff0c;欢迎大家尝鲜使用 BallCat 组织旨在为项目快速开发提供一系列的基础能力&#xff0c;方便使用者根据项目需求快速进行功能拓展。 在以前使用其他后台管…

开源协议 GPL、BSD、MIT、Mozilla、Apache和LGPL的区别

一、GPL、BSD、MIT、Mozilla、Apache和LGPL的总体结构图如下&#xff1a; 二、协议详细说明 LGPL开源许可证&#xff1a; LGPL 是GPL的一个为主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。LGPL 允许商业软件通过类库引用…

Python学习笔记--文件操作

&#xff08;一&#xff09; 文件的编码 1. 编码 编码是一种规则集合&#xff0c;记录了内容和二进制间进行相互转换的逻辑 编码有许多种&#xff0c;最常用的是utf-8 2. 使用编码的原因 计算机只能识别二进制数&#xff0c;因此要将文件的内容翻译为二进制数&#xff0c;才能保…

【K8S系列】深入解析有状态服务

目录 序言 1 基本介绍 2 使用介绍 2.1 Headless Service 2.2 PersistentVolume 2.3 StatefulSet 2.4 Init Containers 3 问题 4 投票 序言 在你想要放弃的时候&#xff0c;想想是什么让你当初坚持走到了这里。 Kubernetes (k8s) 是一个容器编排平台&#xff0c;允许在…

RISC-V Linux 编译设备树

RISC-V Linux 编译设备树 flyfish 设备树是一种描述硬件资源的数据结构 引入设备树的主要目的 曾经 Linux内核中夹杂着大量的设备信息&#xff0c;影响Linux驱动开发效率&#xff0c;因为外部设备发生任何改动&#xff0c;需要重新编写和编译驱动代码。 现在 设备驱动程…

VSCode使用Remote SSH远程连接Linux服务器【远程开发】

文章目录前言视频教程1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar4.2 创建隧道映射4.3 测试公网远程连接5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程转发自CSDN远…