Spring Cloud_27_消息驱动/RabbitMQ的使用

转载自 版权声明:本文为博主原创文章,艾特米工作室,欢迎转载 https://blog.csdn.net/zhaozao5757/article/details/79693670

消息驱动/RabbitMQ的使用

1、RabbitMQ服务器安装

这一章所使用的RibbitMQ的服务器版本是3.6.11(Windows版本),RibbitMQ的服务器要使用Erlang语言,所以需要先下载Erlang(20.4 64bit)

1.1、安装Erlang

1.2、安装RabbitMQ-Server

  • 消息代理中间件
  • 傻瓜式安装
  • 安装完成后,管理器中能看到服务

1.3、查看插件

  • 进入rabbitmq的sbin目录下,按下shift键,鼠标右键

  • 查看插件:rabbitmq-plugins list

1.4、开启插件

  • 开启管理插件 :rabbitmq-plugins enable rabbitmq_management

1.5、访问RabbitMQ

2、消息生产者

  • 消息的生产者/消费者都属于客户端,均使用AMQP协议与RabbitMQ服务器进行通信
  • 向本机安装的RabbitMQ服务器发送消息
  • 新建Maven项目:atm_rabbitMq_producer

2.1、引入依赖

<!-- AMQP -->
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>4.2.0</version>
</dependency>
<!-- SLF4J日志 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.9</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2.2、main测试

package com.atm.cloud;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class SendMessage {

    public static void main(String[] args) throws Exception {
        /*
         * 1.生产者会发送消息给RabbitMQ服务器。 2.通过渠道叫消息发送给交换器。 3.交换器会发送给队列。 4.队列将消息发送给消费者。
         */

        // 建立连接工厂
        ConnectionFactory factory = new ConnectionFactory();

        // 设置host,其实无需设置,默认为localhost,用户名/密码默认guest,端口默认5671
        // factory.setHost("localhost");

        // 创建新的连接
        Connection connection = factory.newConnection();

        // 通过连接创建渠道(向该渠道发送消息)
        Channel channel = connection.createChannel();

        // 声明交换器(默认绑定),交换器会将消息发送给队列,对列再发送给消费者
        // 直接声明队列,使用默认交换器
        String queueName = "MyQueueName";

        channel.queueDeclare(queueName, false, false, false, null);

        // 创建消息,使用渠道发布消息,""使用默认交换器,本列子中routingKey就使用queueName
        String messageBody = "Hello Wrold!";
        channel.basicPublish("", queueName, null, messageBody.getBytes());

        // 发送之后,关闭渠道等(先关渠道,再关连接)
        channel.close();
        connection.close();

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

3、消息消费者

  • 读取刚刚的队列消息
package com.atm.cloud;

import java.io.IOException;

import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

public class ReadMessage {

    public static void main(String[] args) throws Exception {

        // 建立连接工厂
        ConnectionFactory factory = new ConnectionFactory();

        // 创建新的连接
        Connection connection = factory.newConnection();

        Channel channel = connection.createChannel();

        String queueName = "MyQueueName";

        channel.queueDeclare(queueName, false, false, false, null);

        // 通过队列创建Consumer
        Consumer consumer = new DefaultConsumer(channel) {

            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                    BasicProperties properties, byte[] body) throws IOException {
                String msg = new String(body, "UTF-8");
                System.out.println("接收到的消息:" + msg);
            }

        };

        // 渠道绑定consumer
        channel.basicConsume(queueName, consumer);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

  • 程序是一直处于阻塞状态,连接着渠道去接收消息

  • 目前只需要了解大概流程,以后结合SpringCloud适合,就简单很多了

4、交换器、绑定与队列

  • 消息发送过来,消息自身带着一个routingKey,交换器根据该key进行队列的绑定

4.1、交换器

  • direct:根据生产者传过来的routingKey是否等于bindingkey,来决定将消息发送给哪个队列
  • topic:根据传过来的routingkey是否匹配一定的表达式,来决定消息发送给哪个或者哪些队列
  • fanout:将消息发送给交换器知道的全部队列,这种交换器会忽略掉设置的routingkey(广播机制)

  • headers:根据消息的头消息,来决定将消息发送给哪些队列
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值