RabbitMQ 入门篇之——Spring整合rabbitmq

目录

第一步:引入依赖

第二步:编写生产者的配置文件 

第三步:编写消费者的代码

第四步:编写消费者的监听器类

单元测试类

监听器类

第五步:编写消费者的配置文件

测试:

1.简单队列

2.fanout类型

3.direct类型

4.topic类型


 

为了后面讲rabbitmq的一些高级特性,这里讲下spring如何整合rabbitmq 

第一步:引入依赖

spring-context、spring-rabbit以及单元测试的相关依赖 

<?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>MyStudy</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>rabbitmq</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.9.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.amqp/spring-rabbit -->
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
            <version>2.2.11.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.hamcrest/hamcrest-core -->
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
            <version>1.3</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.1.7.RELEASE</version>
        </dependency>
    </dependencies>

</project>

编写rabbitmq的连接属性:

rabbitmq.properties

rabbitmq.host=127.0.0.1
rabbitmq.port=5672
rabbitmq.username=cjian
rabbitmq.password=111111
rabbitmq.virtual-host=vhost_cjian

 

第二步:编写生产者的配置文件 

<?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}"/>
    <!--定义管理交换机、队列-->
    <rabbit:admin connection-factory="connectionFactory"/>
    <!--定义rabbitTemple对象-->
    <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory"/>

    <!--定义持久化队列,不存在则自动创建,不绑定交换机则绑定到默认交换机,默认交换机为direct,名字为”“,路由键为队列的名称
    auto-declare:是否自动创建
    -->
    <!--简单队列
    id:bean的名称
    name:queue的名称
    auto-declare:是否自动创建
    durable:是否持久化
    auto-delete:当最后一个消费者和该队列断开连接后,自动删除队列
    -->
    <rabbit:queue id="spring_queue" name ="spring_queue" auto-declare="true" />

    <!--fanout类型的交换机,所有队列都可获得消息-->
    <rabbit:queue id="spring_fanout_queue1" name = "spring_fanout_queue1" auto-declare="true"/>
    <rabbit:queue id="spring_fanout_queue2" name = "spring_fanout_queue2" auto-declare="true"/>
    <!--定义fanout类型交换机,并绑定队列-->
    <rabbit:fanout-exchange id="spring_fanout_exchange" name ="spring_fanout_exchange" auto-declare="true">
        <rabbit:bindings>
            <rabbit:binding queue="spring_fanout_queue1"></rabbit:binding>
            <rabbit:binding queue="spring_fanout_queue2"></rabbit:binding>
        </rabbit:bindings>
    </rabbit:fanout-exchange>

 <!--direct类型-->
    <rabbit:queue id="spring_direct_queue1" name="spring_direct_queue1" auto-delete="true"/>
    <rabbit:queue id="spring_direct_queue2" name="spring_direct_queue2" auto-delete="true"/>
    <rabbit:direct-exchange name="spring_direct_exchange" id="spring_direct_exchange" >
        <rabbit:bindings>
            <rabbit:binding queue="spring_direct_queue1" key="info"></rabbit:binding>
            <rabbit:binding queue="spring_direct_queue2" key="error"></rabbit:binding>
            <rabbit:binding queue="spring_direct_queue2" key="info"></rabbit:binding>
            <rabbit:binding queue="spring_direct_queue2" key="warning"></rabbit:binding>
        </rabbit:bindings>

    </rabbit:direct-exchange>

    <!--topic类型-->
    <rabbit:queue id="spring_topic_queue1" name = "spring_topic_queue1" auto-declare="true" />
    <rabbit:queue id="spring_topic_queue2" name = "spring_topic_queue2" auto-declare="true"/>
    <rabbit:queue id="spring_topic_queue3" name = "spring_topic_queue3" auto-declare="true"/>
    <rabbit:topic-exchange id="spring_topic_exchange" name="spring_topic_exchange">
        <rabbit:bindings>
            <!-- #:0或多个单词  ,*:刚好一个单词-->
            <rabbit:binding pattern="cjian.#" queue="spring_topic_queue1"></rabbit:binding>
            <rabbit:binding pattern="cjian.*" queue="spring_topic_queue2"></rabbit:binding>
            <rabbit:binding pattern="test.#" queue="spring_topic_queue3"></rabbit:binding>
        </rabbit:bindings>
    </rabbit:topic-exchange>


</beans>

第三步:编写消费者的代码

package com.cjian.rabbitmq.spring_rabbit;

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;

/**
 * @description:
 * @author: cWX969834
 * @time: 2021/1/22 16:36
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-rabbitmq-producer.xml")
public class Producer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testSpringQueue() {
        rabbitTemplate.convertAndSend("spring_queue", "hello spring rabbitmq");
    }

    @Test
    public void testSpringFanoutQueue() {
        rabbitTemplate.convertAndSend("spring_fanout_exchange","", "hello spring rabbitmq_fanout");
    }

    @Test
    public void testSpringTopicQueue() {
        //1接收
        //rabbitTemplate.convertAndSend("spring_topic_exchange","cjian.name.age","hello spring rabbitmq_topic");
        //1、2接收
        rabbitTemplate.convertAndSend("spring_topic_exchange","cjian.hello","hello spring rabbitmq_topic");
    }
}

生产者发送消息简单,主要就是配置文件需要配置

第四步:编写消费者的监听器类

这里简单实现下:除了类名不一样外,其他都大同小异了,就不一一贴了

单元测试类

package com.cjian.rabbitmq.spring_rabbit;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @description:
 * @author: CJ
 * @time: 2021/1/25 10:17
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-rabbitmq-consumer.xml")
public class Consumer {
    @Test
    public void test(){
        while(true){

        }
    }

}

监听器类


package com.cjian.rabbitmq.spring_rabbit;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;

/**
 * @description: 需要实现MessageListener接口,并重写onMessage方法
 * @author: CJ
 * @time: 2021/1/25 9:40
 */
public class SpringQueueListener implements MessageListener {
    @Override
    public void onMessage(Message message) {
        System.out.println("简单队列:"new String(message.getBody()));
    }
}

第五步:编写消费者的配置文件

<?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}"/>

    <!--给spring容器注册监听器bean-->
    <!--简单类型-->
    <bean id = "springQueueListener" class="com.cjian.rabbitmq.spring_rabbit.SpringQueueListener"/>
    <!--fanout-->
    <bean id = "springFanoutListener1" class="com.cjian.rabbitmq.spring_rabbit.SpringFanoutListener1"/>
    <bean id = "springFanoutListener2" class="com.cjian.rabbitmq.spring_rabbit.SpringFanoutListener2"/>

    <!--direct-->
    <bean id = "springDirectListener1" class="com.cjian.rabbitmq.spring_rabbit.SpringDirectListener1"/>
    <bean id = "springDirectListener2" class="com.cjian.rabbitmq.spring_rabbit.SpringDirectListener2"/>

    <!--topic-->
    <bean id = "springTopicListener1" class="com.cjian.rabbitmq.spring_rabbit.SpringTopicListener1"/>
    <bean id = "springTopicListener2" class="com.cjian.rabbitmq.spring_rabbit.SpringTopicListener2"/>
    <bean id = "springTopicListener3" class="com.cjian.rabbitmq.spring_rabbit.SpringTopicListener3"/>


    <!--绑定监听器与队列的关系-->
    <rabbit:listener-container connection-factory="connectionFactory" auto-declare="true">
        <!--简单类型-->
        <rabbit:listener ref="springQueueListener" queue-names="spring_queue"/>

        <!--fanout-->
        <rabbit:listener ref="springFanoutListener1" queue-names="spring_fanout_queue1"/>
        <rabbit:listener ref="springFanoutListener2" queue-names="spring_fanout_queue2"/>
        <!--topic-->
        <rabbit:listener ref="springTopicListener1" queue-names="spring_topic_queue1"/>
        <rabbit:listener ref="springTopicListener2" queue-names="spring_topic_queue2"/>
        <rabbit:listener ref="springTopicListener3" queue-names="spring_topic_queue2"/>

        <!--direct 类型-->
        <rabbit:listener ref="springDirectListener1" queue-names="spring_direct_queue1"/>
        <rabbit:listener ref="springDirectListener2" queue-names="spring_direct_queue2"/>
    </rabbit:listener-container>

</beans>

测试:

1.简单队列

发送消息:

收到消息:

2.fanout类型

收到消息:

3.direct类型

收到消息:

4.topic类型

收到消息:

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值