docker安装rabbitmq及使用

news/2024/7/4 7:41:44

一、docker安装下载

1、docker下载并运行rabbitmq

docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management

注:

4369, 25672 (Erlang发现&集群端口)

5672, 5671 (AMQP端口[服务端口])

15672 (web管理后台端口)

61613, 61614 (STOMP协议端口)

1883, 8883 (MQTT协议端口)

2、设置开机启动

docker update rabbitmq --restart=always

3、登录管理界面

URL:IP+15672

默认账号名密码:guest

二、java项目中使用

1、 首先 pom.xml 文件引入 rabbitMq 依赖。

自行查找合适的版本:spring-boot-starter-amqp

<dependency>         
    <groupId>org.springframework.boot</groupId>         
    <artifactId>spring-boot-starter-amqp</artifactId>     
</dependency>

2、在 application.yml 或 application.properties 文件配置 rabbitMq的数据源

spring:   
    rabbitmq:     
        #账号     
        username: guest     
        #密码     
        password: guest     
        #地址     
        addresses: localhost:5672     
        #连接超时时间(秒)     
        connection-timeout: 3

3、定义三个常量:交换机,路由key,队列名

/**
 * rabbitMq 常量配置
 * @author zhanli
 */
public interface RabbitMqConstant {

    String USER_EXCHANGE = "user_exchange";
    String USER_ROUTING_KEY = "user_routing_key";
    String USER_QUEUE = "user_queue";
}

4、创建配置初始化类

这里创建一个队列配置初始化类: UserQueueConfig 。项目启动时会同时创建 交换机和队列,如该交换机或队列存在则不会创建。在提测或环境移植时,可减少手动或忘记创建带来的麻烦。

如果不想交换机和队列通过 routing_key 绑定在一起,可以将常量 USER_ROUTING_KEY 的值设为 "" (空字符串)。

package com.sczc.modules.equipment.rabbitmq;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 初始化 交换机和队列,并将队列绑定在交换机上
 * @author zhanli
 */
@Configuration
@Slf4j
public class UserQueueConfig {

    @Bean
    public Queue userMassageQueue() {
        log.info("userMassageQueue init");
        return new Queue(RabbitMqConstant.USER_QUEUE);
    }

    @Bean
    public DirectExchange userMassageExchange() {
        log.info("userMassageExchange init");
        return new DirectExchange(RabbitMqConstant.USER_EXCHANGE);
    }

    @Bean
    public Binding queueBindingExchange() {log.info("queueBindingExchange init");
        return BindingBuilder.bind(userMassageQueue())
                .to(userMassageExchange())
                .with(RabbitMqConstant.USER_ROUTING_KEY);
    }
}

5、 一个接口类 RabbitMqService:

package com.sczc.modules.equipment.rabbitmq.service;

/**
 * rabbiMq 服务接口
 * @author zhanli
 */
public interface RabbitMqService {

    /**
     * 统一发送mq
     * @param exchange 交换机
     * @param routingKey 路由key
     * @param data 数据
     */
    void send(String exchange, String routingKey, Object data);
}

6、 一个实现类 RabbitMqServiceImpl:

package com.sczc.modules.equipment.rabbitmq.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.sczc.modules.equipment.rabbitmq.service.RabbitMqService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * rabbitmq服务
 * @author zhanli
 */
@Service
public class RabbitMqServiceImpl implements RabbitMqService {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Override
    public void send(String exchange, String routingKey, Object data) {
        rabbitTemplate.convertAndSend(exchange, routingKey, JSONObject.toJSONString(data));
    }
}

7、测试类

@SpringBootTest
class RabbitMqServiceImplTest {
 
    @Autowired
    private RabbitMqService rabbitMqService;
 
    @Test
    public void sendTest() {
 
        Map<String,Object> user = new HashMap<>();
        user.put("name", "张三");
        user.put("age", 18);
        user.put("course", "Java RabbitMq");
 
        rabbitMqService.send(RabbitMqConstant.USER_EXCHANGE, RabbitMqConstant.USER_ROUTING_KEY, user);
    }
}

8、 RabbitMq 后台查看

在 RabbitMq 后台可以看到已经创建了:user_exchange 和 user_queue ,且两者有绑定关系,队列里面也接收到的 json 数据。

9、创建消费者

最后写一个消费者 UserConsumer, 加入 Component 注释后,项目启动时即可自动开始消费。

消息可在发送时,使用构建好的实体类或DTO,消费时直接解析成生产时的实体类或DTO更加方便,再做相应的逻辑操作。

import com.alibaba.fastjson.JSONObject;
import com.demo.www.constant.RabbitMqConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
 
import java.util.Map;
 
/**
 * rabbitMq 消费者
 * @author zhanli
 */
 
@Component
@Slf4j
public class UserConsumer {
 
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = RabbitMqConstant.USER_QUEUE, durable = "true"),
            exchange = @Exchange(value = RabbitMqConstant.USER_EXCHANGE)
    ))
    public void onMassageUser(Message message) {
        log.info("-------开始消费-------");
        Map map = JSONObject.parseObject(new String(message.getBody()), Map.class);
        log.info("姓名:{},年龄:{}, 课程:{}", map.get("name"), map.get("age"), map.get("course"));
        log.info("-------消费完成-------");
    }
}

10、控制台输出

借鉴原作者出处:Docker中安装rabbitmq并运行 - WlliamLiu - 博客园 (cnblogs.com)

Java 简单操作 RabbitMq - 安逺 - 博客园 (cnblogs.com)


http://www.niftyadmin.cn/n/2436255.html

相关文章

SpringMVC中利用@InitBinder来对页面数据进行解析绑定

同步发布&#xff1a;http://www.yuanrengu.com/index.php/springmvc-user-initbinder.html 在使用SpingMVC框架的项目中&#xff0c;经常会遇到页面某些数据类型是Date、Integer、Double等的数据要绑定到控制器的实体&#xff0c;或者控制器需要接受这些数据&#xff0c;如果这…

躺玩手机险些酿成大祸 你知道危害有多大吗?

最近&#xff0c;浙江一名小伙子&#xff0c;他到朋友家玩&#xff0c;躺在朋友家床上&#xff0c;举着手机。突然间他不自觉地手一松&#xff0c;手机“啪嗒”掉下来&#xff0c;刚好砸进他角膜移植后的右眼&#xff0c;险些失明。还好及时送进医院救治&#xff0c;脱离了危险…

spring aop 创建代理

为什么80%的码农都做不了架构师&#xff1f;>>> spring aop 创建代理 我们知道spring org\springframework\aop\framework\DefaultAopProxyFactory.java#createAopProxy的方法返回的JdkDynamicAopProxy 或 CglibProxyFactory 实现了创建代理类的逻辑&#xff0c;分…

BZOJ 3542 [Poi2014]Couriers ——可持久化线段树

【题目分析】 查找区间内出现次数大于一半的数字。 直接用主席树&#xff0c;线段树上维护区间大小&#xff0c;由于要求出现次数大于一半&#xff0c;每到一个节点可以分治下去。 时间复杂度(NQ)logN 【代码】 #include <cstdio> #include <cstring> #include <…

Linux系统从指定目录下的所有文件中查找某个关键字

2019独角兽企业重金招聘Python工程师标准>>> 命令 find test/ -name *.* | xargs grep "hello" 该命令主要应用于仅记住了某个文件中的部分内容&#xff0c;但已不记得该文件的具体名字&#xff0c;或者所在路径&#xff0c;那么可以使用此命令根据 记住的…

JAVA NIO简单实现Socket Server

为什么80%的码农都做不了架构师&#xff1f;>>> 使用JAVA NIO简单实现Socket Server package com.flyer.cn.javaIO;import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.nio.ByteBuffer; import java.nio…

LeetCode-448. Find All Numbers Disappeared in an Array C#

Given an array of integers where 1 ≤ a[i] ≤ n (n size of array), some elements appear twice and others appear once. Find all the elements of [1, n] inclusive that do not appear in this array. Could you do it without extra space and in O(n) runtime? You…

MyBatisPlus 入门学习笔记(版本:3.4.3)

文章目录学习辅助资料MyBatisPlus概述1. MyBatisPlus是什么2. 特性快速开始1. 创建数据库 mybatis_plus2. 导入相关依赖3. 数据源配置3. 快速开始3.1 User实体类编写3.2 mapper编写3.3 启动类设置3.4 测试配置日志Mapper层自带的的CRUD方法1. Insert插入操作1.1 产生奇妙ID的原…