rabbitmq入门安装附带demo教程

RabbitMQ轻量级、易于在本机和云服务器中部署的开源消息代理和队列服务器 。它支持多种消息传递协议。可以部署在分布式和集群配置中,以满足高规模,高可用性要求。

1、安装rabbitmq容器

docker search rabbitmq

说明:
rabbitmq:3-management 带有web控制台管理界面
rabbitmq:latest 则是不带web控制台的,黑皮人在开始时采用该镜像折腾了很久
安装指令:

docker run -d –name myrabbitmq -p 5672:5672 -p 15672:15672 docker.io/rabbitmq:3-management

curl localhost:15672 如有正常html页面返回则表示安装成功。
登入后台管理
PS:请记得开通云服务器后台端口或者使用ssh隧道连接服务器
默认账户名:guest密码:guest

2、rabbitmq Exchange模式fanout,direct,topic介绍

简介:
PS:以下exchange详解原文https://blog.csdn.net/chendaoqiu/article/details/48440633
说明:
RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储 RabbitMQ提供了四种Exchange:fanout,direct,topic,header header模式在实际使用中较少,本文只对前三种模式进行比较。

一.Direct Exchange

RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储 RabbitMQ提供了四种Exchange:fanout,direct,topic,header header模式在实际使用中较少,本文只对前三种模式进行比较。 一.Direct Exchange

任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。
1.一般情况可以使用rabbitMQ自带的Exchange:””(该Exchange的名字为空字符串,下文称其为default Exchange)。
2.这种模式下不需要将Exchange进行任何绑定(binding)操作
3.消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字。
4.如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。

二.Fanout Exchange

任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有Queue上。
1.可以理解为路由表的模式
2.这种模式不需要RouteKey
3.这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个Queue,一个Queue可以同多个Exchange进行绑定。
4.如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃。


三.Topic Exchange

任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue上
1.这种模式较为复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一个“标题”(RouteKey),Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的队列。
2.这种模式需要RouteKey,也许要提前绑定Exchange与Queue。
3.在进行绑定时,要提供一个该队列关心的主题,如“#.log.#”表示该队列关心所有涉及log的消息(一个RouteKey为”MQ.log.error”的消息会被转发到该队列)。
4.“#”表示0个或若干个关键字,“”表示一个关键字。如“log.”能与“log.warn”匹配,无法与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。
5.同样,如果Exchange没有发现能够与RouteKey匹配的Queue,则会抛弃此消息。

3、spring boot demo开发

通过https://start.spring.io/ 创建项目,只需选择rabbitmq即可,为调试方便添加了个web模块。

项目启动后,因个人习惯配置文件修改为yml格式,同时添加配置参数:

spring:
  rabbitmq:
    host: 149.129.123.134
    port: 5672
    virtual-host: /
    username: guest
    password: guest
    publisher-confirms: true
    publisher-returns: true
    template:
      mandatory: true

消息发送组件:

@Component
public class MessageSender {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    public boolean send(String exchange, String routeKey, Object message) {
        boolean result = rabbitTemplate.invoke(operations -> {
            rabbitTemplate.convertAndSend(
                    exchange,
                    routeKey,
                    message
            );
            return rabbitTemplate.waitForConfirms(10 * 1000);
        });
        return result;
    }
}

消息接收组件:

@Component
public class MessageListener {
    /**
     * fanout exchange 模式消息接收
     * @param message
     * @param channel
     * @param tag
     */
    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue(value = MessageExchangeKey.QUEUE_FANOUT_TEST, durable = "true"),
                    exchange = @Exchange(value = MessageExchangeKey.EXCHANGE_FANOUT_TEST, durable = "true", type = ExchangeTypes.FANOUT)
            )
    })
    public void testMessageFANOUTListener(Object message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) {
        System.out.println(String.valueOf(message));
    }

    /**
     * direct exchange 模式消息接收
     * @param message
     * @param channel
     * @param tag
     */
    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue(value = MessageExchangeKey.QUEUE_DIRECT_TEST, durable = "true"),
                    exchange = @Exchange(value = MessageExchangeKey.EXCHANGE_DIRECT_TEST, durable = "true", type = ExchangeTypes.DIRECT),
                    key = MessageExchangeKey.KEY_DIRECT_TEST
            )
    })
    public void testMessageDierctListener(Object message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) {
        System.out.println(String.valueOf(message));
    }
}

在控制器中发送消息:

@Controller
public class MessageController {
    @Autowired
    MessageSender messageSender;

    @RequestMapping(value = "/messageTest", method = RequestMethod.GET)
    @ResponseBody
    public String  messageFanoutTest() {
        //fanout exchange 消息发送
        messageSender.send(MessageExchangeKey.EXCHANGE_FANOUT_TEST, "", "hello happiren, fanout test and there can be a Object"); //该消息需要绑定exchange,但是不要routerkey
        //direct exchange 消息发送
        messageSender.send(MessageExchangeKey.EXCHANGE_DIRECT_TEST, MessageExchangeKey.KEY_DIRECT_TEST, "hello happiren, direct test and  there can be a Object"); //direct 消息,该消息可以不需要绑定exchange,但是需要routerKey
        return "hello,demo of rabbitmq written by happiren";
    }
}

测试:
运行项目,浏览器访问:http://localhost:8080/messageTest 即可通过控制台查看打印的消息。

以下是spring boot完整的rabbitmq demo工程下载地址和github地址:

github地址

enjoy @happiren!

发表评论

电子邮件地址不会被公开。 必填项已用*标注