六、 Spring 整合RabbitMQ

## 6.1. 搭建生产者工程

### 6.1.1. 创建工程spring_rabbitmq_producer

### 6.1.2. 添加依赖

修改pom.xml文件内容为如下:

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

    <**modelVersion**>4.0.0</**modelVersion**>

    <**groupId**>com.atguigu</**groupId**>

    <**artifactId**>spring-rabbitmq-producer</**artifactId**>

    <**version**>1.0-SNAPSHOT</**version**>

    <**dependencies**>

        <**dependency**>

            <**groupId**>org.springframework</**groupId**>

            <**artifactId**>spring-context</**artifactId**>

            <**version**>5.1.7.RELEASE</**version**>

        </**dependency**>

        <**dependency**>

            <**groupId**>org.springframework.amqp</**groupId**>

            <**artifactId**>spring-rabbit</**artifactId**>

            <**version**>2.1.8.RELEASE</**version**>

        </**dependency**>

        <**dependency**>

            <**groupId**>junit</**groupId**>

            <**artifactId**>junit</**artifactId**>

            <**version**>4.12</**version**>

        </**dependency**>

        <**dependency**>

            <**groupId**>org.springframework</**groupId**>

            <**artifactId**>spring-test</**artifactId**>

            <**version**>5.1.7.RELEASE</**version**>

        </**dependency**>

    </**dependencies**>

    

     <**build**>

        <**plugins**>

            <**plugin**>

                <**groupId**>org.apache.maven.plugins</**groupId**>

                <**artifactId**>maven-compiler-plugin</**artifactId**>

                <**version**>3.8.0</**version**>

                <**configuration**>

                    <**source**>1.8</**source**>

                    <**target**>1.8</**target**>

                </**configuration**>

            </**plugin**>

        </**plugins**>

    </**build**>

</**project**>

### 6.1.3. 配置整合

1 创建rabbitmq.properties连接参数等配置文件;

rabbitmq.host=192.168.137.118

rabbitmq.port=5672

rabbitmq.username=admin

rabbitmq.password=123456

rabbitmq.virtual-host=/

2 创建 spring-rabbitmq.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}"/>

    <!--定义管理交换机、队列-->

    <**rabbit:admin** **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** **id**="spring_fanout_exchange" **name**="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**>

    <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~通配符;*匹配一个单词,#匹配多个单词 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->

    <!--定义广播交换机中的持久化队列,不存在则自动创建-->

    <**rabbit:queue** **id**="spring_topic_queue_star" **name**="spring_topic_queue_star" **auto-declare**="true"/>

    <!--定义广播交换机中的持久化队列,不存在则自动创建-->

    <**rabbit:queue** **id**="spring_topic_queue_well" **name**="spring_topic_queue_well" **auto-declare**="true"/>

    <!--定义广播交换机中的持久化队列,不存在则自动创建-->

    <**rabbit:queue** **id**="spring_topic_queue_well2" **name**="spring_topic_queue_well2" **auto-declare**="true"/>

    <**rabbit:topic-exchange** **id**="spring_topic_exchange" **name**="spring_topic_exchange" **auto-declare**="true">

        <**rabbit:bindings**>

            <**rabbit:binding** **pattern**="atguigu.*" **queue**="spring_topic_queue_star"/>

            <**rabbit:binding** **pattern**="atguigu.#" **queue**="spring_topic_queue_well"/>

            <**rabbit:binding** **pattern**="guigu.#" **queue**="spring_topic_queue_well2"/>

        </**rabbit:bindings**>

    </**rabbit:topic-exchange**>

    <!--定义rabbitTemplate对象操作可以在代码中方便发送消息-->

    <**rabbit:template** **id**="rabbitTemplate" **connection-factory**="connectionFactory"/>

</**beans**>

### 6.1.4. 发送消息

创建测试文件 ProducerTest.java

**package** com.atguigu.rabbitmq;

**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.SpringRunner;

@RunWith(SpringRunner.class)

@ContextConfiguration(locations = "classpath:spring-rabbitmq.xml")

**public** **class** **ProducerTest** {

    @Autowired

    **private** RabbitTemplate rabbitTemplate;

    /**

     * 只发队列消息

     * 默认交换机类型为 direct

     * 交换机的名称为空,路由键为队列的名称

     */

    @Test

    **public** **void** **queueTest**(){

        //路由键与队列同名

        rabbitTemplate.convertAndSend("spring_queue", "只发队列spring_queue的消息。");

    }

    /**

     * 发送广播

     * 交换机类型为 fanout

     * 绑定到该交换机的所有队列都能够收到消息

     */

    @Test

    **public** **void** **fanoutTest**(){

        /**

         * 参数1:交换机名称

         * 参数2:路由键名(广播设置为空)

         * 参数3:发送的消息内容

         */

        rabbitTemplate.convertAndSend("spring_fanout_exchange", "", "发送到spring_fanout_exchange交换机的广播消息");

    }

    /**

     * 通配符

     * 交换机类型为 topic

     * 匹配路由键的通配符,*表示一个单词,#表示多个单词

     * 绑定到该交换机的匹配队列能够收到对应消息

     */

    @Test

    **public** **void** **topicTest**(){

        /**

         * 参数1:交换机名称

         * 参数2:路由键名

         * 参数3:发送的消息内容

         */

        rabbitTemplate.convertAndSend("spring_topic_exchange", "atguigu.bj", "发送到spring_topic_exchange交换机atguigu.bj的消息");

        rabbitTemplate.convertAndSend("spring_topic_exchange", "atguigu.bj.1", "发送到spring_topic_exchange交换机atguigu.bj.1的消息");

        rabbitTemplate.convertAndSend("spring_topic_exchange", "atguigu.bj.2", "发送到spring_topic_exchange交换机atguigu.bj.2的消息");

        rabbitTemplate.convertAndSend("spring_topic_exchange", "guigu.cn", "发送到spring_topic_exchange交换机guigu.cn的消息");

    }

}

## 6.2. 搭建消费者工程

### 6.2.1. 创建工程spring_rabbitmq_consumer

### 6.2.2. 添加依赖

修改pom.xml文件内容为如下:

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

    <**modelVersion**>4.0.0</**modelVersion**>

    <**groupId**>com.atguigu</**groupId**>

    <**artifactId**>spring-rabbitmq-consumer</**artifactId**>

    <**version**>1.0-SNAPSHOT</**version**>

    <**dependencies**>

        <**dependency**>

            <**groupId**>org.springframework</**groupId**>

            <**artifactId**>spring-context</**artifactId**>

            <**version**>5.1.7.RELEASE</**version**>

        </**dependency**>

        <**dependency**>

            <**groupId**>org.springframework.amqp</**groupId**>

            <**artifactId**>spring-rabbit</**artifactId**>

            <**version**>2.1.8.RELEASE</**version**>

        </**dependency**>

        <**dependency**>

            <**groupId**>junit</**groupId**>

            <**artifactId**>junit</**artifactId**>

            <**version**>4.12</**version**>

        </**dependency**>

        <**dependency**>

            <**groupId**>org.springframework</**groupId**>

            <**artifactId**>spring-test</**artifactId**>

            <**version**>5.1.7.RELEASE</**version**>

        </**dependency**>

    </**dependencies**>

    

     <**build**>

        <**plugins**>

            <**plugin**>

                <**groupId**>org.apache.maven.plugins</**groupId**>

                <**artifactId**>maven-compiler-plugin</**artifactId**>

                <**version**>3.8.0</**version**>

                <**configuration**>

                    <**source**>1.8</**source**>

                    <**target**>1.8</**target**>

                </**configuration**>

            </**plugin**>

        </**plugins**>

    </**build**>

</**project**>

### 6.2.3. 配置整合

创建rabbitmq.properties连接参数等配置文件;

rabbitmq.host=192.168.137.118

rabbitmq.port=5672

rabbitmq.username=admin

rabbitmq.password=123456

rabbitmq.virtual-host=/

创建spring-rabbitmq.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}"/>

    <**bean** **id**="springQueueListener" **class**="com.atguigu.rabbitmq.listener.SpringQueueListener"/>

    <**bean** **id**="fanoutListener1" **class**="com.atguigu.rabbitmq.listener.FanoutListener1"/>

    <**bean** **id**="fanoutListener2" **class**="com.atguigu.rabbitmq.listener.FanoutListener2"/>

    <**bean** **id**="topicListenerStar" **class**="com.atguigu.rabbitmq.listener.TopicListenerStar"/>

    <**bean** **id**="topicListenerWell" **class**="com.atguigu.rabbitmq.listener.TopicListenerWell"/>

    <**bean** **id**="topicListenerWell2" **class**="com.atguigu.rabbitmq.listener.TopicListenerWell2"/>

    <**rabbit:listener-container** **connection-factory**="connectionFactory" **auto-declare**="true">

        <**rabbit:listener** **ref**="springQueueListener" **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**="topicListenerStar" **queue-names**="spring_topic_queue_star"/>

        <**rabbit:listener** **ref**="topicListenerWell" **queue-names**="spring_topic_queue_well"/>

        <**rabbit:listener** **ref**="topicListenerWell2" **queue-names**="spring_topic_queue_well2"/>

    </**rabbit:listener-container**>

</**beans**>

### 6.2.4. 消息监听器

#### 1)队列监听器

创建SpringQueueListener.java

**package** com.atguigu.rabbitmq.listener;

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

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

**public** **class** **SpringQueueListener** **implements** **MessageListener** {

    **public** **void** **onMessage**(Message message) {

        **try** {

            String msg = **new** String(message.getBody(), "utf-8");

            System.out.printf("接收路由名称为:%s,路由键为:%s,队列名为:%s的消息:%s \n",

                    message.getMessageProperties().getReceivedExchange(),

                    message.getMessageProperties().getReceivedRoutingKey(),

                    message.getMessageProperties().getConsumerQueue(),

                    msg);

        } **catch** (Exception e) {

            e.printStackTrace();

        }

    }

}

添加一个测试类,进行测试

**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:spring-rabbitmq.xml")

**public** **class** **ConsumerTest** {

    @Test

    **public** **void** **test1**(){

        **boolean** flag = **true**;

        **while** (flag){

        }

    }

}

#### 2)广播监听器1

创建 FanoutListener1.java

**public** **class** **FanoutListener1** **implements** **MessageListener** {

    **public** **void** **onMessage**(Message message) {

        **try** {

            String msg = **new** String(message.getBody(), "utf-8");

            System.out.printf("广播监听器1:接收路由名称为:%s,路由键为:%s,队列名为:%s的消息:%s \n",

                    message.getMessageProperties().getReceivedExchange(),

                    message.getMessageProperties().getReceivedRoutingKey(),

                    message.getMessageProperties().getConsumerQueue(),

                    msg);

        } **catch** (Exception e) {

            e.printStackTrace();

        }

    }

}

#### 3)广播监听器2

创建 FanoutListener2.java

**public** **class** **FanoutListener2** **implements** **MessageListener** {

    **public** **void** **onMessage**(Message message) {

        **try** {

            String msg = **new** String(message.getBody(), "utf-8");

            System.out.printf("广播监听器2:接收路由名称为:%s,路由键为:%s,队列名为:%s的消息:%s \n",

                    message.getMessageProperties().getReceivedExchange(),

                    message.getMessageProperties().getReceivedRoutingKey(),

                    message.getMessageProperties().getConsumerQueue(),

                    msg);

        } **catch** (Exception e) {

            e.printStackTrace();

        }

    }

}

#### 4)星号通配符监听器

创建TopicListenerStar.java

**public** **class** **TopicListenerStar** **implements** **MessageListener** {

    public *void onMessage (Message message) {

        **try** {

            String msg = new  String(message.getBody(), "utf-8");

            System.out.printf("通配符*监听器:接收路由名称为:%s,路由键为:%s,队列名为:%s的消息:%s \n",

                    message.getMessageProperties().getReceivedExchange(),

                    message.getMessageProperties().getReceivedRoutingKey(),

                    message.getMessageProperties().getConsumerQueue(),

                    msg);

        } catch  (Exception e) {

            e.printStackTrace();

        }

    }

}

#### 5)井号通配符监听器

创建TopicListenerWell.java

 public class TopicListenerWell implements  MessageListener  {

     public  **void** **onMessage**(Message message) {

        **try** {

            String msg =  new  String(message.getBody(), "utf-8");

            System.out.printf("通配符#监听器:接收路由名称为:%s,路由键为:%s,队列名为:%s的消息:%s \n",

                    message.getMessageProperties().getReceivedExchange(),

                    message.getMessageProperties().getReceivedRoutingKey(),

                    message.getMessageProperties().getConsumerQueue(),

                    msg);

        }  catch  (Exception e) {

            e.printStackTrace();

        }

    }

}

#### 6)井号通配符监听器2

创建TopicListenerWell2.java

**public** **class** **TopicListenerWell2** **implements** **MessageListener** {

    public void onMessage (Message message) {

        **try** {

            String msg = **new** String(message.getBody(), "utf-8");

            System.out.printf("通配符#监听器2:接收路由名称为:%s,路由键为:%s,队列名为:%s的消息:%s \n",

                    message.getMessageProperties().getReceivedExchange(),

                    message.getMessageProperties().getReceivedRoutingKey(),

                    message.getMessageProperties().getConsumerQueue(),

                    msg);

        }  catch  (Exception e) {

            e.printStackTrace();

        }

    }

}

(代码中*是自动生成,忽略就好)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值