• RabbitMQ与SpringBoot整合(个人技术博客)


    一、RabbitMQ的介绍

    RabbitMQ是消息中间件的一种,消息中间件即分布式系统中完成消息的发送和接收的基础软件.这些软件有很多,包括ActiveMQ(apache公司的),RocketMQ(阿里巴巴公司的,现已经转让给apache).

    消息中间件的工作过程可以用生产者消费者模型来表示.即,生产者不断的向消息队列发送信息,而消费者从消息队列中消费信息.具体过程如下:

    图片

    从上图可看出,对于消息队列来说,生产者,消息队列,消费者是最重要的三个概念,生产者发消息到消息队列中去,消费者监听指定的消息队列,并且当消息队列收到消息之后,接收消息队列传来的消息,并且给予相应的处理.消息队列常用于分布式系统之间互相信息的传递.

    对于RabbitMQ来说,除了这三个基本模块以外,还添加了一个模块,即交换机(Exchange).它使得生产者和消息队列之间产生了隔离,生产者将消息发送给交换机,而交换机则根据调度策略把相应的消息转发给对应的消息队列.

    二、Direct模式

    首先创建两个maven工程,这是为了模拟分布式应用系统中,两个应用之间互相交流的过程,一个发送者(Sender),一个接收者(Receiver)

    图片

    紧接着,配置pom.xml文件,注意其中用到了springboot对于AMQP(高级消息队列协议,即面向消息的中间件的设计)

    <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.4.0.RELEASE</version>
        </parent>
        <properties>
            <java.version>1.7</java.version>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <optional>true</optional>
                <scope>true</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <!-- 添加springboot对amqp的支持 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-amqp</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-jasper</artifactId>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    

    紧接着,我们编写发送者相关的代码.首先毫无疑问,要书写启动类:

    @SpringBootApplication
    public class App{
        public static void main(String[] args) {
            SpringApplication.run(App.class, args);
        }
    }
    

    接着在application.properties中,去编辑和RabbitMQ相关的配置信息,配置信息的代表什么内容根据键就能很直观的看出了.这里端口是5672,不是15672...15672是管理端的端口!

    spring.application.name=spirng-boot-rabbitmq-sender
    spring.rabbitmq.host=127.0.0.1
    spring.rabbitmq.port=5672
    spring.rabbitmq.username=guest
    spring.rabbitmq.password=guest
    

    随后,配置Queue(消息队列).那注意由于采用的是Direct模式,需要在配置Queue的时候,指定一个键,使其和交换机绑定.

    @Configuration
    public class SenderConf {
         @Bean
         public Queue queue() {
              return new Queue("queue");
         }
    }
    

    接着就可以发送消息啦!在SpringBoot中,我们使用AmqpTemplate去发送消息!代码如下:

    @Component
    public class HelloSender {
        @Autowired
        private AmqpTemplate template;
    
        public void send() {
        template.convertAndSend("queue","hello,rabbit~");
        }
    }
    

    编写测试类

    @SpringBootTest(classes=App.class)
    @RunWith(SpringJUnit4ClassRunner.class)
    public class TestRabbitMQ {
    
        @Autowired
        private HelloSender helloSender;
    
        @Test
        public void testRabbit() {
            helloSender.send();
        }
    }
    

    接着我们编写接收端.接收端的pom文件,application.properties(修改spring.application.name),Queue配置类,App启动类都是一致的!这里省略不计.主要在于我们需要配置监听器去监听绑定到的消息队列,当消息队列有消息的时候,予以接收,代码如下:

    @Component
    public class HelloReceive {
    
        @RabbitListener(queues="queue")    //监听器监听指定的Queue
        public void processC(String str) {
            System.out.println("Receive:"+str);
        }
    
    }
    

    实际上RabbitMQ还可以支持发送对象:当然由于涉及到序列化和反序列化,该对象要实现Serilizable接口.HelloSender做出如下改写:

    public void send() {
    
            User user=new User();    //实现Serializable接口
            user.setUsername("hlhdidi");
            user.setPassword("123");
            template.convertAndSend("queue",user);
    }
    

    HelloReceiver做出如下改写:

    @RabbitListener(queues="queue")    //监听器监听指定的Queue
        public void process1(User user) {    //用User作为参数
            System.out.println("Receive1:"+user);
        }
    
  • 相关阅读:
    如何成为一名数据科学家
    暑假反思
    暑假计划(7月23日-8月21日)
    ACM数论模板
    Nelder–Mead method
    Introduction to Data Mining
    51_1037最长循环节 (miller rabin算法 pollard rho算法 原根)
    乘法逆元(转)
    51_1228 序列求和(伯努利数)(转)
    清除input中内容的简单方法
  • 原文地址:https://www.cnblogs.com/hsx479/p/13781923.html
Copyright © 2020-2023  润新知