SpringCloud下rabbitMq的使用(一)

背景

使用SpringCloud开发了一个完整的项目,但是从学习SpringCloud到使用SpringCloud进行完整的项目开发,一直没有进行过系统性的学习,最近工作之余开始慢慢的学习,回顾,总结.之后会慢慢的完善一整个学习及使用过程,已及分享一些项目上使用的方式,不好的地方,请小伙伴们多多指正.刚好最近项目上使用的rabbitMq问题频发,那么第一个分享就从rabbitMq开始.

Ubuntu 安装RabbitMQ

不同Ubuntu版本之下安装方式略有差异,但是基本相同.

安装erlang

由于rabbitMq需要erlang语言的支持,在安装rabbitMq之前需要安装erlang,执行命令:

sudo apt-get install erlang-nox

在执行该命令时遇到错误:

The package lists or status file could not be parsed or opened

执行其他安装命令也报该错误,一般情况下是不会出现该问题,应该是之前的误操作导致.

解决方式:

sudo rm /var/lib/apt/lists/* -vf sudo apt-get clean sudo apt-get update

安装rabbitMq:

sudo apt-get update
sudo apt-get install rabbitmq-server

简易操作:

启动、停止、重启、状态rabbitMq命令:

启动:sudo rabbitmq-server start
关闭: sudo rabbitmq-server stop
重启: sudo rabbitmq-server restart
查看状态:sudo rabbitmqctl status

停止服务,修改配置

安装之后默认启动了rabbitmq,但是并不能正常访问rabbitmq管理界面.

进入安装文件夹/usr/lib/rabbitmq/bin,修改rabbitmqctl文件.

HOME=/var/lib/rabbitmq
image.png

安装参考

https://www.cnblogs.com/hongdada/p/7203589.html

rabbitMq基本概念

参考文档:https://blog.csdn.net/dreamchasering/article/details/77653512

rabbitMq使用方式

创建SpringBoot程序,导入依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
        <!-- test -->
        <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-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.9</version>
                <executions>
                    <execution>
                        <id>jacoco-initialize</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>jacoco-site</id>
                        <phase>package</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

基本使用

基础配置

spring:
  application:
    name: pikachu
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    publisher-confirms: true
    virtual-host: /
    listener:
      acknowledge-mode: MANUAL

程序结构

image.png

监听类

@Component
public class MqReceiver {
    @RabbitListener(queues = "pikachu")
    @RabbitHandler
    public void execute(String content){
        System.out.println("content----------->>>"+content);
    }
}

测试类

@RestController
@RequestMapping(value = "/sendmq")
public class TestController {
    @Autowired
    private AmqpTemplate amqpTemplate;

    @GetMapping
    public String sendmq(@RequestParam(name = "content") String content){
        amqpTemplate.convertAndSend("pikachu","send content :"+content);
        return content;
    }
}

运行程序

启动报错

image.png

解决方式:

在管理界面添加队列

image.png
image.png

应用启动成功,发送消息:

image.png
image.png

对于一个生产级的应用来说,每一次新起一个消息队列需要在管理界面添加队列名显然不太合适.

解决方式(一):

 @Bean
    public Queue pikachu() {
        return new Queue("pikachu",true);
    }

解决方式(二):

@Component
public class MqReceiver {

    //@RabbitListener(queues = "pikachu")
    //自动创建队列
    @RabbitListener(queuesToDeclare =@Queue("pikachu"))
    @RabbitHandler
    public void execute(String content){
        System.out.println("content----------->>>"+content);
    }
}

exchanges/queues绑定

为方便测试我们建立两组

 @RabbitHandler
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue("pikachu_q"),
            key = "pikachu_1",
            exchange = @Exchange("pikachu_e")
    ))
    public void execute1(String content){
        System.out.println("execute1----------->>>"+content);
    }

    @RabbitHandler
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue("pikachu_q"),
            key = "pikachu_2",
            exchange = @Exchange("pikachu_e")
    ))
    public void execute2(String content){
        System.out.println("execute2----------->>>"+content);
    }
@GetMapping(value = "/q1")
    public String sendmq1(@RequestParam(name = "content") String content){
        amqpTemplate.convertAndSend("pikachu_e","pikachu_1","send content :"+content);
        return content;
    }
    @GetMapping(value = "/q2")
    public String sendmq2(@RequestParam(name = "content") String content){
        amqpTemplate.convertAndSend("pikachu_e","pikachu_2","send content :"+content);
        return content;
    }
image.png

分别访问q1/q2得到结果如下:

image.png

总结

rabbitMq的初级使用大概就是这些,在下一篇文章中将会讲解spring cloud stream 的使用,已经rabbitMq在多实例的场景下如何消费.

不足之处请小伙伴多多之处,QAQ.

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT笔记

SpringBoot开发案例之整合ActiveMQ实现秒杀队列

在实际生产环境中中,通常生产者和消费者会是两个独立的应用,这样才能通过消息队列实现了服务解耦和广播。因为此项目仅是一个案例,为了方便期间,生产和消费定义在了同一...

7914
来自专栏java工会

推荐几个自己写的Java后端相关的范例项目

2375
来自专栏java、Spring、技术分享

java 日志处理

  common-logging是 apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的loggi...

2253
来自专栏Netkiller

Linux 应用程序开发入门

我会实现一个守护进程,从这个程序你将了解,Linux 应用程序开发基本流程 我们将实现一个远程shell的功能,可以通过tcp协议,运行远程机器上的命令或she...

6797
来自专栏乐沙弥的世界

Linux 6 下编译安装 PHP 5.6

1522
来自专栏Gaussic

使用IntelliJ IDEA开发SpringMVC网站(五)博客文章管理 顶

访问GitHub下载最新源码:https://github.com/gaussic/SpringMVCDemo

1932
来自专栏aoho求索

微服务网关Zuul迁移到Spring Cloud Gateway

在之前的文章中,我们介绍过微服务网关Spring Cloud Netflix Zuul,前段时间有两篇文章专门介绍了Spring Cloud的全新项目Sprin...

2413
来自专栏轻扬小栈

ubuntu debian 百度网盘的Python客户端 bypy

7144
来自专栏Jaycekon

Java消息队列-Spring整合ActiveMq

1、概述 ----   首先和大家一起回顾一下Java 消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了: 消息服务:一个中间件,用于...

4655
来自专栏乐沙弥的世界

基于Linux (RHEL 5.5) 安装Oracle 10g RAC

    本文所描述的是在Red Hat 5.5下使用vmware server 来安装Oracle 10g RAC(OCFS + ASM),本文假定你的RHEL...

1273

扫码关注云+社区