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 条评论
登录 后参与评论

相关文章

来自专栏木头编程 - moTzxx

Laravel5.0+ 邮件发送功能实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

832
来自专栏散尽浮华

linux下sendmail邮件系统安装操作记录

电子邮件系统的组成: 1)邮件用户代理(Mail User Agent , MUA),MUA是一个邮件系统的客户端程序,它提供了阅读,发送和接受电子邮件的用户接...

2669
来自专栏后端技术探索

常用nginx配置项详解(一个简单的例子)

核心提示:Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器...

681
来自专栏linux系统运维

Apache用户认证,域名跳转,Apache访问日志

1465
来自专栏yl 成长笔记

消息队列的使用 RabbitMQ(一): 安装与总体介绍

RabbitMQ 是一款开源且比较流行的消息中间件。但用起来还是比较麻烦,有人封装了一层, 这就是 EasyNetQ 。

652
来自专栏张善友的专栏

TCPView for Windows

TCPView是一个用来显示系统中所有的TCP和UDP端点(endpoint)列表的Windows程序,包括本地和远程的网络地址,以及TCP连接的状态。在Win...

1787
来自专栏大魏分享(微信公众号:david-share)

一个小实验,验证一个大受欢迎数据库的容器化

时下大受欢迎的数据库 笔者在IBM工作期间,曾进行过大量Oracle RAC的功能性测试,尤其是与双活存储的配合问题。而时下,随着技术的发展,分布式数据库越来越...

4076
来自专栏北京马哥教育

使用 Nginx 提升网站访问速度

本文主要介绍如何在 Linux 系统上安装高性能的 HTTP 服务器 —— Nginx、并在不改变原有网站结构的条件下用 Nginx 来提升网站的访问速度。 N...

3538
来自专栏FreeBuf

渗透测试:内网DNS投毒技术劫持会话

本文仅供渗透测试技术学习及教学用途,禁止非法使用 最近一段时间一直在研究内网中嗅探的一些方法,各种方式的尝试,才找到一个比较靠谱的一种方式。dns投毒与中间人。...

1986
来自专栏北京马哥教育

MySQL Master High Available 理论篇(一)

一、概况 MHA 提供自动master故障转移以及在最短的时间内(10~30秒)提升slave为new master MHA 解决了切换后的数据不一致问题 所有...

3247

扫码关注云+社区