普通Maven项目使用RabbitMQ

这篇具有很好参考价值的文章主要介绍了普通Maven项目使用RabbitMQ。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

普通Maven项目使用RabbitMQ

一、简单模式

一个服务者对应一个消费者

  1. 创建BaseProject父maven项目,在父项目底下创建maven模块producer

    maven 引入rabbitmq依赖报错,java-rabbitmq,rabbitmq,java

  2. 导入相关依赖

		<!-- rabbitmq依赖 -->
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.9.0</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.3.2</version>
        </dependency>

        <!-- 整合到spring项目需要导入此依赖 -->
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
            <version>2.3.10</version>
        </dependency>
  1. 在resource目录下创建log4j.properties
log4j.rootLogger=DEBUG,A1 log4j.logger.com.taotao = DEBUG 
log4j.logger.org.mybatis = DEBUG
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
  1. 创建RabbitMqUtil工具类
    private static ConnectionFactory factory;

    public static Connection getConnection() throws IOException, TimeoutException {
        //创建mq的连接工厂对象
        factory = new ConnectionFactory();
        //设置连接rabbit的主机地址
        factory.setHost("主机ip");
        //设置连接端口
        factory.setPort(5672);
        //设置连接哪个虚拟主机
        factory.setVirtualHost("host1");
        //设置虚拟主机的用户名和密码
        factory.setUsername("zhangsan");
        factory.setPassword("123");
        Connection connection = factory.newConnection();
        return connection;
    }
  1. 服务提供者类发送消息

    向队列queue1发送消息,如果该消息没被消费者消费,消息是不会消失的。

public class SendMsg {

    public static void main(String[] args) {

        String msg = "hello RabbitMq123!";

        Connection connection = null;

        try {
            //获取连接,相当于JDBC的获取数据库连接
            connection = MQUtil.getConnection();
            /**
             * 相当于JDBC的statement
             * 声明(创建)队列,如果存在就不创建,不存在就创建
             * 参数1 队列名,
             * 参数2 durable: 是否持久化, 默认是存放到内存中,如果rabbitmq重启会丢失,如果想重启之后还存在就要使队列持久化,保存到Erlang自带的Mnesia数据库中,当rabbitmq重启之后会读取该数据库
             * 参数3 exclusive:是否排外的,当当前链接关闭时,是否删除这个队列
             * 参数4 autoDelete:是否自动删除,当最后一个消费者断开连接之后队列是否自动被删除(无论队列中是否有数据)
             * 参数5 arguments: 参数
             * channel.queueDeclare("queue1", false, false, true, null);
             */
            Channel channel = connection.createChannel();
            /**
             * 四个参数:
             * 参数1 : 交换机名称,
             * 参数2 : 目标队列名称,
             * 参数3 : 设置当前这条消息的属性(比如设置超时时间)
             * 参数4 : 消息内容
             */
            channel.basicPublish("","queue1",null,msg.getBytes());
            System.out.println("发送--->" + msg);

            //关闭
            channel.close();
            connection.close();

        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }

    }
  1. 创建服务消费者模块consumer

导包、log4j配置、MQUtil工具类,与上述一样。

消费消息,消息消费过后,队列中的消息会清空。

//接受消息
public class ReceiveMsg {

    public static void main(String[] args) {

        Connection connection = null;

        //获取连接,相当于JDBC的获取数据库连接
        try {
            connection = MQUtil.getConnection();
            Channel channel = connection.createChannel();

            //声明要关注的队列
            //channel.queueDeclare("queue1", false, false, false, null);
            //DefaultConsumer类实现了Consumer接口,通过传入一个频道,
            // 告诉服务器我们需要那个频道的消息,如果频道中有消息,就会执行回调函数handleDelivery
            Consumer consumer = new DefaultConsumer(channel) {
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    String message = new String(body, "UTF-8");
                    System.out.println("消费者消费消息:'" + message + "'");
                }
            };
            //自动回复队列应答 -- RabbitMQ中的消息确认机制
            channel.basicConsume("queue1", true, consumer);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }

    }
}

总结:发送消息:channel.basicPublish()

​ 接收消息:channel.basicConsume()


二、工作模式(一对多)

一个服务者对应多个消费者

在简单模式的基础上多加一个消费者,即创建模块consumer2,所有配置信息与consumer1一致。这里需要注意的是,consumer1和consumer2接收的队列、producer发送的目标队列都应为同一队列。

maven 引入rabbitmq依赖报错,java-rabbitmq,rabbitmq,java

然后启动consumer1和consumer2,再启动producer,可以实时的看到,发送的消息,由两个消费者随机消费。


三、订阅模式

一个服务者对应多个消费者,但是中间由交换机转发。服务者发送消息->交换机->同时发给多个消费者。

准备工作:在测试之前,先确保两个队列在同一个交换机底下(本次模拟交换机为exc1,队列为queue1和queue2)

maven 引入rabbitmq依赖报错,java-rabbitmq,rabbitmq,java

在工作模式的基础上做小修改:

consumer1模块接收队列queue1的消息、consumer2模块接收队列queue2的消息。如下图:

maven 引入rabbitmq依赖报错,java-rabbitmq,rabbitmq,java
maven 引入rabbitmq依赖报错,java-rabbitmq,rabbitmq,java


注明消息生产者的交换机名称:

maven 引入rabbitmq依赖报错,java-rabbitmq,rabbitmq,java

然后启动consumer1和consumer2,再启动producer,可以实时的看到,发送的消息,由两个消费者共同消费,服务者发送的任何消息,所有的消费者都能接收到。


四、路由模式

一个服务者对应多个消费者,中间由交换机转发,交换机有对应的key,指定到对应key的队列。服务者发送消息(指定key)->交换机(根据key转发)->由key发给对应的消费者。

准备工作:在测试之前,先确保两个队列在同一个交换机底下,并且每个队列都有对应的routing key(本次模拟交换机为exc1,队列为queue1和queue2,queue1的key为a,queue2的key为b)

maven 引入rabbitmq依赖报错,java-rabbitmq,rabbitmq,java


在订阅模式的基础上做小修改:

producer发送消息时指定对应的key:

//发送消息
public class SendMsg {

    public static void main(String[] args) {
        System.out.println("请输入消息:");
        Scanner input = new Scanner(System.in);
        String msg = input.nextLine();

//        String msg = "hello RabbitMq123!";

        Connection connection = null;

        try {
            //获取连接,相当于JDBC的获取数据库连接
            connection = MQUtil.getConnection();
            /**
             * 相当于JDBC的statement
             * 声明(创建)队列,如果存在就不创建,不存在就创建
             * 参数1 队列名,
             * 参数2 durable: 是否持久化, 默认是存放到内存中,如果rabbitmq重启会丢失,如果想重启之后还存在就要使队列持久化,保存到Erlang自带的Mnesia数据库中,当rabbitmq重启之后会读取该数据库
             * 参数3 exclusive:是否排外的,当当前链接关闭时,是否删除这个队列
             * 参数4 autoDelete:是否自动删除,当最后一个消费者断开连接之后队列是否自动被删除(无论队列中是否有数据)
             * 参数5 arguments: 参数
             * channel.queueDeclare("queue1", false, false, true, null);
             */
            Channel channel = connection.createChannel();
            /**
             * 四个参数:
             * 参数1 : 交换机名称,
             * 参数2 : 目标队列名称,
             * 参数3 : 设置当前这条消息的属性(比如设置超时时间)
             * 参数4 : 消息内容
             */
            if (msg.startsWith("a")){
                channel.basicPublish("exc1","a",null, msg.getBytes());
            } else if (msg.startsWith("b")){
                channel.basicPublish("exc1","b",null, msg.getBytes());
            }

            System.out.println("发送--->" + msg);

            //关闭
            channel.close();
            connection.close();

        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
    }
}

则消费者只接收到自己key的消息。文章来源地址https://www.toymoban.com/news/detail-624628.html

到了这里,关于普通Maven项目使用RabbitMQ的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 项目引入多个连接池,导致使用其他连接池,maven分析学习

    第一步在命令行中执行 如果你的settings文件不是项目使用的setting配置,那么就使用下面的命令 然后打开这个输出的 excludeParentstart.log文件 然后得到了一堆密密麻麻的文件 这个玩意怎么看呢?我们得先知道依赖加载顺序 执行命令 mvn dependency:tree 会输出Maven项目的依赖树,展示

    2024年02月11日
    浏览(39)
  • maven根据操作系统的不同打包时引入不同的依赖(jar)

    在进行java开发时经常遇到一种情况,就是 windows 下和 linux 下需要引入的jar包是不一样的。 比如说我们需要使用java来操作 OpenGL 库,我们就需要通过 maven 引入 JOGL 的依赖, 然而在 window 下和在 linux 下需要引入 JOGL 的依赖是不一样的: 在 window 下,需要引入 JOGL 的 -win 版本的

    2024年02月09日
    浏览(42)
  • Java项目导入依赖(普通java项目)

    (1)创建lib文件夹 普通项目是没有lib文件夹的,可以在项目里面手动添加一个lib文件夹,和src文件夹同级 (2)下载jar包 !!这里的下载的jar包仅是示例,选择你自己要下载的包 apache官网(慢):http://ftp.cuhk.edu.hk/pub/packages/apache.org/ maven官网(推荐):http://www.mvnrepository.

    2024年02月11日
    浏览(39)
  • Maven 打包时,依赖配置正确,但是类引入出现错误,一般是快照(Snapshot)依赖拉取策略问题

    问题描述 : 项目打包时,类缺少依赖,操作 pom.xml - Maven - Reload project ,还是不生效,但是同事(别人)那里正常。 问题出现的环境 : 可能项目是多模块项目,结构例如: 可能继承另一个项目(项目是快照版本),例如: 可能依赖是快照版本,例如: 问题分析 : Maven 查

    2024年01月23日
    浏览(37)
  • 2. 使用IDEA创建Spring Boot Hello项目并管理依赖——Maven入门指南

    前言:本文将介绍如何使用IDEA创建一个Spring Boot Hello项目,并通过Maven来管理项目的依赖。我们从项目的创建到代码的编写,再到项目的构建和运行,一步步演示了整个过程。 🚀 作者简介:作为某云服务提供商的后端开发人员,我将在这里与大家简要分享一些实用的开发小

    2024年02月10日
    浏览(56)
  • idea将普通项目更改为maven项目的两种方式

    今天写demo的时候发现自己建的项目不是maven项目,建时忘记了,demo已经写了很多了,于是找了几种普通项目更改成maven项目的方法。 右键工程文件,新建文件pom.xml,并填写好内容。 在pom.xml 文件上右键 Add as Maven Project。 3.idea自己导入maven。

    2024年02月15日
    浏览(45)
  • 解决引入spire.doc.free-3.9.0.jar导致spring boot项目无法使用maven的install问题

    问题背景: 在一个项目中需求中需要导出一个word模板,那之前有做过一个这个类似需求,这次使用的是freemarker模版。在引入spire.doc.free-3.9.0.jar依赖的时候发现maven依赖报红色,悬浮提示aliyun找不到改包,没有太在意这个部分,本地能够正常使用。本地仓库存在这个jar包,并

    2024年02月15日
    浏览(51)
  • maven引入本地项目

    在项目中有时会用到本地的另一个项目,这个时候需要通过Maven引入本地项目 假设A项目需要调用B项目中的类,将B项目引入到A项目中的pom中 具体操作如下: 第一步:设置B项目的pom 第二步:在项目根目录下执行 mvn install ,将项目引入到本地maven库中,如下图,可以在本地maven中看到项目

    2024年02月14日
    浏览(34)
  • <Maven>项目依赖导入Maven本地仓库命令

    项目工程pom.xml文件打开:查看报错的依赖, 将jar包放在D盘(或者其它路径都可)根目录下,在windows黑窗口执行以下命令; 举例:jar包名称: 1.api-1.0-SNAPSHOT102.jar 2.coms-cache-1.0-SNAPSHOT.jar 命令:

    2024年02月14日
    浏览(38)
  • 将springboot项目生成可依赖的jar,并引入到项目中

    SpringBoot项目默认打包的是可运行jar包,也可以打包成不可运行的jar包。 能打成可运行的jar包是因为,Spring Boot 项目引入了 spring-boot-maven-plugin 依赖包。 spring-boot-maven-plugin具有repackage 功能,就是在打包的时候,多做一点额外的事情: (1)首先 mvn package 命令 对项目进行打包,

    2024年02月17日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包