zoukankan      html  css  js  c++  java
  • 【RabbitMQ】06 Spring整合RabbitMQ

    首先生产者和消费者需要的Maven依赖是一样的

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>RabbitMQ</artifactId>
            <groupId>cn.dzz</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>Spring-RabbitMQ-Producer</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.3.10</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.amqp</groupId>
                <artifactId>spring-rabbit</artifactId>
                <version>2.1.8.RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>5.3.10</version>
            </dependency>
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13.2</version>
                <scope>test</scope>
            </dependency>
    
        </dependencies>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
        </properties>
    
    </project>

    其次的RabbitMQ连接信息也是一致的

    rabbitmq.properties

    rabbitmq.host = 192.168.2.121 # 换成你的ip
    rabbitmq.port = 5672
    rabbitmq.username = test # 你的账号和密码
    rabbitmq.password = 123456 # 你的账号和密码
    rabbitmq.virtual-host = /dzz # 你设置的虚拟主机

    生产者服务Spring整合:

    生产者定义的Spring.xml文件(文件名随意 这里我取的是producer-config.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:rabbit="http://www.springframework.org/schema/rabbit"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           https://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/rabbit
           http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
        <!--加载配置文件-->
        <context:property-placeholder location="classpath:rabbitmq.properties"/>
    
        <!-- 定义rabbitmq connectionFactory -->
        <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
                                   port="${rabbitmq.port}"
                                   username="${rabbitmq.username}"
                                   password="${rabbitmq.password}"
                                   virtual-host="${rabbitmq.virtual-host}"
                                   publisher-confirms="true"
                                   publisher-returns="true"
        />
        <!--定义管理交换机、队列-->
        <rabbit:admin connection-factory="connectionFactory"/>
    
        <!--定义rabbitTemplate对象操作可以在代码中方便发送消息-->
        <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory"/>
    
        <!-- 简单模式队列 不存在时自动创建 交换机默认DIRECT 名字 “” 路由键就是队列的名称  -->
        <rabbit:queue id="spring-queue" name="spring-queue" auto-declare="true" />
    
        <!--  广播订阅模式队列 -->
        <rabbit:queue id="spring-fanout-queue-1" name="spring-fanout-queue-1" auto-declare="true" />
        <rabbit:queue id="spring-fanout-queue-2" name="spring-fanout-queue-2" auto-declare="true" />
        <rabbit:fanout-exchange name="spring-fanout-exchange" id="spring-fanout-exchange" auto-declare="true">
            <rabbit:bindings>
                <rabbit:binding queue="spring-fanout-queue-1"/>
                <rabbit:binding queue="spring-fanout-queue-2"/>
            </rabbit:bindings>
        </rabbit:fanout-exchange>
    
        <!-- 通配符Topic模式队列 -->
        <rabbit:queue id="spring-topic-queue-1" name="spring-topic-queue-1" auto-declare="true" />
        <rabbit:queue id="spring-topic-queue-2" name="spring-topic-queue-2" auto-declare="true" />
        <rabbit:queue id="spring-topic-queue-3" name="spring-topic-queue-3" auto-declare="true" />
        <rabbit:topic-exchange name="spring-topic-exchange" id="spring-topic-exchange" auto-declare="true">
            <rabbit:bindings>
                <rabbit:binding pattern="heima.*" queue="spring-topic-queue-1"/>
                <rabbit:binding pattern="heima.#" queue="spring-topic-queue-2"/>
                <rabbit:binding pattern="itcast.#" queue="spring-topic-queue-3"/>
            </rabbit:bindings>
        </rabbit:topic-exchange>
    
    </beans>

    然后编写对应的测试类:

    注意测试类编写要注入xml文件,文件名称别写错

    package cn.dzz;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.amqp.rabbit.core.RabbitTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath*:producer-config.xml")
    public class SpringProducerTest {
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        /**
         * 简单模式消息发送
         */
        @Test
        public void simpleTest() {
            rabbitTemplate.convertAndSend("spring-queue", "hello spring integrate rabbitmq ....");
        }
    
        /**
         * fanout广播订阅消息发送
         */
        @Test
        public void fanoutTest() {
            rabbitTemplate.convertAndSend("spring-fanout-exchange", "", "hello spring integrate rabbitmq ....");
        }
    
        /**
         * topic通配符消息发送
         */
        @Test
        public void topicTest() {
            rabbitTemplate.convertAndSend("spring-topic-exchange", "itcast.info", "hello spring integrate rabbitmq ....");
        }
    }

    依次执行之后就会在RabbitMQ中加载相应的交换机和队列信息:

     

     

    消费者服务Spring整合:

    消费者的Spring.xml配置信息(consumer-config.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:rabbit="http://www.springframework.org/schema/rabbit"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           https://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/rabbit
           http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
        <!--加载配置文件-->
        <context:property-placeholder location="classpath:rabbitmq.properties"/>
    
        <!-- 定义rabbitmq connectionFactory -->
        <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
                                   port="${rabbitmq.port}"
                                   username="${rabbitmq.username}"
                                   password="${rabbitmq.password}"
                                   virtual-host="${rabbitmq.virtual-host}"/>
    
        <context:component-scan base-package="cn.dzz.rabbitmq.listener" />
    
        <!--定义监听器容器-->
        <rabbit:listener-container connection-factory="connectionFactory" auto-declare="true">
            <rabbit:listener ref="simpleQueueListener" queue-names="spring-queue" />
    
            <rabbit:listener ref="fanoutListener1" queue-names="spring-fanout-queue-1" />
            <rabbit:listener ref="fanoutListener2" queue-names="spring-fanout-queue-2" />
    
            <rabbit:listener ref="topicListener1" queue-names="spring-topic-queue-1" />
            <rabbit:listener ref="topicListener2" queue-names="spring-topic-queue-2" />
            <rabbit:listener ref="topicListener3" queue-names="spring-topic-queue-3" />
        </rabbit:listener-container>
    
    </beans>

    这个监听器编写太累了,一个监听器就要写一个类来实现:

    其余的广播监听器和通配符监听器都是一样的,不重复贴上来了

    package cn.dzz.rabbitmq.listener;
    
    import org.springframework.amqp.core.Message;
    import org.springframework.amqp.core.MessageListener;
    import org.springframework.stereotype.Component;
    
    import java.nio.charset.StandardCharsets;
    @Component
    public class SimpleQueueListener implements MessageListener {
        @Override
        public void onMessage(Message message) {
    
            // 监听到消息之后要触发的回调逻辑
            byte[] body = message.getBody();
            System.out.println("简单模式队列1监听:" + new String(body, StandardCharsets.UTF_8));
        }
    }

    消费者测试类编写:

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath*:consumer-config.xml")
    public class SpringConsumerTest {
    
        @Test
        public void simpleListenerTest() {
            System.out.println("监听测试");
        }
    }

    这里很奇怪,和视频不太一样,视频里面程序跑起来不需要停止就能收到简单模式的消息

    但是在我这里只能在程序结束以后看到:

    "C:Program Files (x86)Javajdk1.8.0_291injava.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1libidea_rt.jar=64697:C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1in" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1libidea_rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1pluginsjunitlibjunit5-rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2021.2.1pluginsjunitlibjunit-rt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibcharsets.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibdeploy.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextaccess-bridge-32.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextcldrdata.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextdnsns.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextjaccess.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextjfxrt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextlocaledata.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibext
    ashorn.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunec.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunjce_provider.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunmscapi.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextsunpkcs11.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibextzipfs.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjavaws.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjce.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjfr.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjfxswt.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibjsse.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibmanagement-agent.jar;C:Program Files (x86)Javajdk1.8.0_291jrelibplugin.jar;C:Program Files (x86)Javajdk1.8.0_291jrelib
    esources.jar;C:Program Files (x86)Javajdk1.8.0_291jrelib
    t.jar;C:UsersAdministratorIdeaProjectsRabbitMQSpring-RabbitMQ-Consumer	arget	est-classes;C:UsersAdministratorIdeaProjectsRabbitMQSpring-RabbitMQ-Consumer	argetclasses;C:UsersAdministrator.m2
    epositoryorgspringframeworkspring-context5.3.10spring-context-5.3.10.jar;C:UsersAdministrator.m2
    epositoryorgspringframeworkspring-aop5.3.10spring-aop-5.3.10.jar;C:UsersAdministrator.m2
    epositoryorgspringframeworkspring-beans5.3.10spring-beans-5.3.10.jar;C:UsersAdministrator.m2
    epositoryorgspringframeworkspring-core5.3.10spring-core-5.3.10.jar;C:UsersAdministrator.m2
    epositoryorgspringframeworkspring-jcl5.3.10spring-jcl-5.3.10.jar;C:UsersAdministrator.m2
    epositoryorgspringframeworkspring-expression5.3.10spring-expression-5.3.10.jar;C:UsersAdministrator.m2
    epositoryorgspringframeworkamqpspring-rabbit2.1.8.RELEASEspring-rabbit-2.1.8.RELEASE.jar;C:UsersAdministrator.m2
    epositoryorgspringframeworkamqpspring-amqp2.1.8.RELEASEspring-amqp-2.1.8.RELEASE.jar;C:UsersAdministrator.m2
    epositoryorgspringframework
    etryspring-retry1.2.4.RELEASEspring-retry-1.2.4.RELEASE.jar;C:UsersAdministrator.m2
    epositorycom
    abbitmqamqp-client5.4.3amqp-client-5.4.3.jar;C:UsersAdministrator.m2
    epositoryorgslf4jslf4j-api1.7.25slf4j-api-1.7.25.jar;C:UsersAdministrator.m2
    epositoryorgspringframeworkspring-messaging5.1.9.RELEASEspring-messaging-5.1.9.RELEASE.jar;C:UsersAdministrator.m2
    epositoryorgspringframeworkspring-tx5.1.9.RELEASEspring-tx-5.1.9.RELEASE.jar;C:UsersAdministrator.m2
    epositoryorgspringframeworkspring-test5.3.10spring-test-5.3.10.jar;C:UsersAdministrator.m2
    epositoryjunitjunit4.13.2junit-4.13.2.jar;C:UsersAdministrator.m2
    epositoryorghamcresthamcrest-core1.3hamcrest-core-1.3.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 SpringConsumerTest,simpleListenerTest
    SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
    广播模式队列1监听:hello spring integrate rabbitmq ....
    简单模式队列1监听:hello spring integrate rabbitmq ....
    广播模式队列2监听:hello spring integrate rabbitmq ....
    Topic通配符模式队列3监听:hello spring integrate rabbitmq ....
    监听测试
    
    Process finished with exit code 0
  • 相关阅读:
    网页素材收集
    【转】你离顶尖 Java 程序员,只差这11本书的距离
    Jetbrains 破解 2017
    WebStorm的常用操作
    浅谈MySQL主从复制
    Lombok注解指南
    【我的《冒号课堂》学习笔记】设计模式(3)行为模式
    【我的《冒号课堂》学习笔记】设计模式(2)结构模式
    【我的《冒号课堂》学习笔记】设计模式(1)创建模式
    【我的《冒号课堂》学习笔记】设计原则(4)保变原则
  • 原文地址:https://www.cnblogs.com/mindzone/p/15374684.html
Copyright © 2011-2022 走看看