AMQP-RabbitMQ/1/概念/一对一简单模型

简介: JMS,AMQP,MQTT的区别与联系JMS Java消息传递服务(Java Messaging Service )AMQP 高级消息队列协议(Advanced Message Queueing Protocol )MQTT消息队列遥测传输(Message Queueing Telemetry Transport )简单理解:*JMS是专门为Java设计的一套消息服务API,像ActiveMQ就是对它的实现*AMQP为了解决不同平台之间的通信问题,定义了一种名为amqp的通信协议,从而实现平台和语言无关性。

JMS,AMQP,MQTT的区别与联系

  • JMS
    Java消息传递服务(Java Messaging Service )
  • AMQP
    高级消息队列协议(Advanced Message Queueing Protocol
  • MQTT
    消息队列遥测传输(Message Queueing Telemetry Transport )

简单理解:
*JMS是专门为Java设计的一套消息服务API,像ActiveMQ就是对它的实现
*AMQP为了解决不同平台之间的通信问题,定义了一种名为amqp通信协议,从而实现平台和语言无关性。
*MQTT也是一种通信协议。相比于AMQP的复杂性,它简单的多。所以amqp用于处理相对较重的任务,如两个系统平台之间的消息传输。而mqtt因为非常轻量,所以大量应用于物联网

RabbitMQ常用命令

  • 修改密码 rabbitmqctl change_password Username Newpassword
  • 显示所有用户 rabbitmqctl list_users
  • 启动 rabbitmq-server start
  • 关闭 rabbitmqctl stop
  • homebrew安装配置文件地址 /usr/local/etc/rabbitmq/rabbitmq-env.conf
  • 管理平台地址 http://localhost:15672/
    image.png

image.png

1. 简单模型

The simplest thing that does something

  • 模型图示

简单模型

  • 生产者
package com.futao.springmvcdemo.mq.rabbit.simple;

import com.futao.springmvcdemo.mq.rabbit.RabbitMqConnectionTools;
import com.futao.springmvcdemo.mq.rabbit.RabbitMqQueueEnum;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import lombok.Cleanup;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

/**
 * 简单发送者
 *
 * @author futao
 * Created on 2019-04-22.
 */
@Slf4j
public class Send {
    @SneakyThrows
    public static void main(String[] args) {
        @Cleanup
        Connection connection = RabbitMqConnectionTools.getConnection();
        @Cleanup
        Channel channel = connection.createChannel();
        //定义一个队列
        channel.queueDeclare(RabbitMqQueueEnum.SIMPLE.getQueueName(), false, false, false, null);
        String msg = "Hello RabbitMq!";
        channel.basicPublish("", RabbitMqQueueEnum.SIMPLE.getQueueName(), null, msg.getBytes());
        log.info("Send msg:[{}] success", msg);
    }
}
  • 消费者
package com.futao.springmvcdemo.mq.rabbit.simple;

import com.futao.springmvcdemo.mq.rabbit.RabbitMqConnectionTools;
import com.futao.springmvcdemo.mq.rabbit.RabbitMqQueueEnum;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

/**
 * 简单消费者
 *
 * @author futao
 * Created on 2019-04-22.
 */
@Slf4j
public class Recv {
    @SneakyThrows
    public static void main(String[] args) {
        Channel channel = RabbitMqConnectionTools.getChannel();
        channel.queueDeclare(RabbitMqQueueEnum.SIMPLE.getQueueName(), false, false, false, null);
        log.info("Waiting for message...");
        DeliverCallback deliverCallback = ((consumerTag, message) -> {
            log.info("收到消息:[{}],tag:[{}]", new java.lang.String(message.getBody()), consumerTag);
        });
        channel.basicConsume(RabbitMqQueueEnum.SIMPLE.getQueueName(), true, deliverCallback, consumerTag -> {
        });
    }
}
  • 特点:一对一。一个生产者,一个消费者。

通用代码

  • 工具类 - 链接工厂
package com.futao.springmvcdemo.mq.rabbit;

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

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * rabbitMq配置类
 *
 * @author futao
 * Created on 2019-04-19.
 */
public class RabbitMqConnectionTools {
    /**
     * 获取链接
     *
     * @return
     * @throws IOException
     * @throws TimeoutException
     */
    public static Connection getConnection() {
        try {
            return getConnectionFactory().newConnection();
        } catch (IOException | TimeoutException e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    /**
     * 连接工厂
     *
     * @return
     */
    private static ConnectionFactory getConnectionFactory() {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("futao");
        factory.setPassword("123456");
        factory.setVirtualHost("/springmvc");
        return factory;
    }

    /**
     * 创建并获取通道
     *
     * @return
     */
    @SneakyThrows
    public static Channel getChannel() {
        Connection connection = RabbitMqConnectionTools.getConnection();
        return connection.createChannel();
    }
}
  • 枚举类 - RabbitMqQueueEnum队列名称
package com.futao.springmvcdemo.mq.rabbit;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * queue名称枚举
 *
 * @author futao
 * Created on 2019-04-19.
 */
@Getter
@AllArgsConstructor
public enum RabbitMqQueueEnum {

    /**
     * 简单queue
     */
    SIMPLE("simple-queue"),
    /**
     * WorkQueue 工作队列
     */
    WORK_QUEUE("work-queue"),
    /**
     * 发布订阅-fanout
     */
    EXCHANGE_QUEUE_FANOUT_ONE("exchange-queue-fanout-1"),

    EXCHANGE_QUEUE_FANOUT_TWO("exchange-queue-fanout-2"),

    EXCHANGE_QUEUE_DIRECT_ONE("exchange-queue-direct-1"),
    EXCHANGE_QUEUE_DIRECT_TWO("exchange-queue-direct-2"),

    EXCHANGE_QUEUE_TOPIC_ONE("exchange-queue-topic-1"),
    EXCHANGE_QUEUE_TOPIC_TWO("exchange-queue-topic-2"),
    EXCHANGE_QUEUE_TOPIC_THREE("exchange-queue-topic-3"),
    EXCHANGE_QUEUE_TOPIC_FOUR("exchange-queue-topic-4"),

    /**
     * RPC队列
     */
    RPC_QUEUE("rpc-queue");


    /**
     * queue名称
     */
    private String queueName;
}
相关实践学习
消息队列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
目录
相关文章
|
4月前
|
消息中间件 测试技术 Kafka
Apache RocketMQ 批处理模型演进之路
RocketMQ 早期批处理模型存在一定的约束条件,为进一步提升性能,RocketMQ 进行了索引构建流水线改造,同时 BatchCQ 模型和 AutoBatch 模型也优化了批处理流程,提供了更简便的使用体验,快点击本文查看详情及配置展示~
19776 83
|
3月前
|
消息中间件 存储 缓存
RabbitMQ:WorkQueues模型
RabbitMQ:WorkQueues模型
55 8
RabbitMQ:WorkQueues模型
|
4月前
|
消息中间件 存储 网络协议
消息中间件RabbitMQ---概述和概念 【一】
该文章提供了对消息中间件RabbitMQ的全面概述,包括其核心概念、工作原理以及与AMQP和JMS的关系。
消息中间件RabbitMQ---概述和概念 【一】
|
5月前
|
消息中间件 负载均衡 算法
【RocketMQ系列十二】RocketMQ集群核心概念之主从复制&生产者负载均衡策略&消费者负载均衡策略
【RocketMQ系列十二】RocketMQ集群核心概念之主从复制&生产者负载均衡策略&消费者负载均衡策略
154 2
|
5月前
|
消息中间件 NoSQL 关系型数据库
【RocketMQ系列十三】RocketMQ的集群核心概念之消费重试&死信队列&幂等消息的出现以及处理
【RocketMQ系列十三】RocketMQ的集群核心概念之消费重试&死信队列&幂等消息的出现以及处理
163 1
|
5月前
|
消息中间件 存储 RocketMQ
【RocketMQ系列十】RocketMQ的核心概念说明
【RocketMQ系列十】RocketMQ的核心概念说明
85 1
|
6月前
|
消息中间件 存储 中间件
【主流技术】聊一聊消息队列 RocketMQ 的基本结构与概念
2.6Broker 代理服务器(Broker)是消息中转角色,负责存储消息、转发消息。代理服务器在 RocketMQ 系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。 2.7Pull Consumer 拉取式消费(Pull Consumer)是 Consumer 消费的一种类型,也是默认的类型。下游应用系统通常主动调用 Consumer 的拉消息方法从 Broke r服务器拉消息,即主动权由下游应用控制。一旦获取了批量消息,应用就会启动消费过程。
|
6月前
|
消息中间件 存储 物联网
RocketMQ基础概念
RocketMQ基础概念
66 1
|
7月前
|
消息中间件 存储 Apache
RocketMQ实战教程之常见概念和模型
Apache RocketMQ 实战教程介绍了其核心概念和模型。消息是基本的数据传输单元,主题是消息的分类容器,支持字节、数字和短划线命名,最长64个字符。消息类型包括普通、顺序、事务和定时/延时消息。消息队列是实际存储和传输消息的容器,是主题的分区。消费者分组是一组行为一致的消费者的逻辑集合,也有命名限制。此外,文档还提到了一些使用约束和建议,如主题和消费者组名的命名规则,消息大小限制,请求超时时间等。RocketMQ 提供了多种消息模型,包括发布/订阅模型,有助于理解和优化消息处理。
|
7月前
|
消息中间件 Java API
RabbitMQ(基础概念, 简单使用)(下)
RabbitMQ(基础概念, 简单使用)
59 0