rabbitmq基础教程(ui,java,springamqp)

简介: 本文提供了RabbitMQ的基础教程,包括如何使用UI创建队列和交换机、Java代码操作RabbitMQ、Spring AMQP进行消息发送和接收,以及如何使用不同的交换机类型(fanout、direct、topic)进行消息路由。

概述:安装看我上篇文章Docker安装rabbitmq

任务一

创建一个队列

这样创建两个队列

在amq.fanout交换机里面发送数据

模拟发送数据

发送消息,发现一下信息:

所以得出理论,消息发送是先到交换机,然后由交换机路由到消息队列

交换机是负责路由和转发消息的,并没有存储的功能。

绑定队列

同理绑定queue2

这时,再在交换机中发消息

查看结果:

数据隔离

在rabbitmq中有虚拟主机的概念。

第一步:新添用户

添加成功后,发现没有虚拟主机,也就是说,我用这个用户登录后,是不可以操作上面的数据的。

又因为,我是超级管理员,所以我能看到这些

所以只能看,不能操作。

第二步:创立自己的虚拟主机

第三步:选自己的虚拟主机

选好后就只能看自己的了。

用Java代码操作

官网:RabbitMQ Tutorials — RabbitMQ

可以看到,官网上有案例,我们大多情况下用的是SpringAmqp,所以也就不讲那么多java简单调用的事情了。

用Spring AMQP操作

第一步:在控制台里面创建一个simple.queue队列

第二步:编写代码

pom文件

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.cyl</groupId>
    <artifactId>test09</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>test09</name>
    <description>test09</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </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-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.13.0</version>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>org.cyl.test09.Test09Application</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

配置mq服务端消息

spring:
  rabbitmq:
    host: 192.168.56.10
    port: 5672
    virtual-host: /cmall
    username: cmall
    password: 123456

发送方:

package org.cyl.test09.demos;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class SendMessageService {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void testSimpleQueue(){
        String queueName="simple.queue";
        String message="hello,spring amqp!";
        rabbitTemplate.convertAndSend(queueName,message);
    }

    public void sendMessage(String exchange, String routingKey, Object message) {
        rabbitTemplate.convertAndSend(exchange, routingKey, message);
    }
}

接收方:

package org.cyl.test09.demos;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

@Service
public class ReceiveMessageService {

    @RabbitListener(queues = "simple.queue")
    public void receiveMessage(String message) {
        System.out.println("接收到的消息: " + message);
    }
}

controller类:

package org.cyl.test09.demos.controller;

import org.cyl.test09.demos.ReceiveMessageService;
import org.cyl.test09.demos.SendMessageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @Autowired
    SendMessageService sendMsgservice;

    @Autowired
    ReceiveMessageService receiveMsgService;

    @GetMapping("/send")
    public String send(){
        sendMsgservice.testSimpleQueue();
        return "ok";
    }

}

展示结果:

Work模型

第一步:创建一个队列

第二步:编写代码

发送:

package org.cyl.test09.demos;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class SendMessageService {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void testSimpleQueue() throws InterruptedException {
        String queueName="work.queue";

        for (int i=1;i<50;i++){
            String message="hello,spring amqp!_"+i;
            rabbitTemplate.convertAndSend(queueName,message);
            Thread.sleep(20);
        }

    }

    public void sendMessage(String exchange, String routingKey, Object message) {
        rabbitTemplate.convertAndSend(exchange, routingKey, message);
    }
}

接收:

package org.cyl.test09.demos;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

@Service
public class ReceiveMessageService {

    @RabbitListener(queues = "work.queue")
    public void receiveMessage1(String message) {
        System.out.println("消费者1接收到的消息: " + message);
    }
    @RabbitListener(queues = "work.queue")
    public void receiveMessage2(String message) {
        System.out.println("消费者2接收到的消息: " + message);
    }
}

结果展示:

消费者一和消费者二是轮询效果。

Fanout交换机

第一步:创建队列

第二步:创建交换机并绑定

第三步:编写代码

发送端:

    public void testFanout() {
        String exchangeName="cmall.fanout";
        String message="hello,spring everyone";
        rabbitTemplate.convertAndSend(exchangeName,null,message);
    }

接收端:

   @RabbitListener(queues = "fanout.queue1")
    public void receiveMessage3(String message) {
        System.out.println("消费者1接收到的消息: " + message);
    }
    @RabbitListener(queues = "fanout.queue2")
    public void receiveMessage4(String message) {
        System.out.println("消费者2接收到的消息: " + message);
    }

展示结果:

私发给不同的人:Direct交换机

第一步:创建两个队列

第二步:声明交换机并绑定

第三步:编写代码

接收方:

   @RabbitListener(queues = "direct.queue1")
    public void receiveMessage5(String message) {
        System.out.println("消费者1接收到的消息: " + message);
    }
    @RabbitListener(queues = "direct.queue2")
    public void receiveMessage6(String message) {
        System.out.println("消费者2接收到的消息: " + message);
    }

发送方:

    public void testDirect1() {
        String exchangeName="cmall.fanout";
        String message="hello,spring everyone";
        rabbitTemplate.convertAndSend(exchangeName,"red",message);
    }

    public void testDirect2() {
        String exchangeName="cmall.fanout";
        String message="hello,spring blue";
        rabbitTemplate.convertAndSend(exchangeName,"blue",message);
    }

    public void testDirect3() {
        String exchangeName="cmall.fanout";
        String message="hello,spring yellow";
        rabbitTemplate.convertAndSend(exchangeName,"yellow",message);
    }

Topic交换机

这个示例代码就懒得写了。

声明交换机和队列1

绑定队列到哪个交换机里面。

一般建立关系都是在消费者这边的。

声明交换机和队列2

基于注解式声明队列和交换机。

消息转换器

字节码可变,会有安全问题。

搞完以上东西,代码不用变,在发一次,即可为json。

好了,基础讲完。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
28天前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
12天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
12天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
12天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
18天前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
70 8
|
21天前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
51 2
|
28天前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
|
1月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
本系列教程笔记详细讲解了Kotlin语法,适合希望深入了解Kotlin的开发者。对于需要快速学习Kotlin的小伙伴,推荐查看“简洁”系列教程。本篇笔记重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android库开发建议以及相互调用时的注意事项。
23 3
|
1月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
21 3
|
1月前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(2)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(2)