docker安装rabbitmq及使用

一、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)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值