RabbitMQ的五种常用消息模型

本文介绍了RabbitMQ的五种消息模型:直连模型,工作(Work)模型,包括能者多劳策略,订阅模型中的Fanout(广播)、Direct(路由)和Topic(通配符)模型,以及消息的持久化和确认机制。直连模型实现1v1通信,工作模型适合多消费者公平分配任务,订阅模型则支持广播和定制化路由,而持久化和ACK机制确保消息可靠性。
摘要由CSDN通过智能技术生成

目录

五种消息模型

直连模型

work模型

订阅模型-Fanout(广播)

订阅模型-Direct(路由)

订阅模型-Topic(通配符)

持久化

消息确认机制(ACK)


 

五种消息模型

 

RabbitMQ提供了7种消息模型。其中3、4、5这三种都属于订阅模型,只不过进行路由的方式不同。67这里暂时不表。

总结:直连模式1v1,work模式抢红包,广播模式公众号,路由模式小团体,Topic模式土豪版小团体

 

 

直连模型

 

原理

P(producer/ publisher):生产者,发送消息到消息队列

C(consumer):消费者从消息队列中取出消息进行消费

Queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息。

总之:生产者将消息发送到队列,消费者从队列中获取消息,队列是存储消息的缓冲区注意,当消费者从队列中消费消息后,这条消息是否还存在队列中,以及这个队列是否存在,都需要你自定义进行设置,在“持久化”这一节里面有讲。

 

举例

producer

新建一个ems用户,新建一个/ems虚拟主机,让ems用户与ems虚拟主机进行绑定

新建一个maven父子项目,父项目空即可,子项目中导入rabbitmq和junit依赖

        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.7.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>

我们先新建一个工具类,用来创建连接对象,这里用到了单例模式!


public class RabbitMQUtils {
    private static ConnectionFactory connectionFactory;

    static {
        connectionFactory = new ConnectionFactory();
        //我们把重量级资源通过单例模式加载
        connectionFactory.setHost("192.168.62.130");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("ems");
        connectionFactory.setPassword("ems");
        connectionFactory.setVirtualHost("/ems");
    }

    //定义提供连接对象的方法
    public static Connection getConnection(){
        try{
            return connectionFactory.newConnection();
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    //定义关闭通道和关闭连接工具方法
    public static void closeConnectionAndChanel(Channel channel, Connection conn){
        try {
            if(channel!=null) {
                channel.close();
            }
            if(conn!=null) {
                conn.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

在HelloWorld(模式一官方命名就叫helloworld)包下新建Producer.java

public class Provider {
    //生产消息
    @Test
    public void testSendMessage() throws IOException, TimeoutException{
        //通过工具类获取连接
        Connection connection = RabbitMQUtils.getConnection();
        //创建通道
        Channel channel = connection.createChannel();
        //参数1:是否持久化,参数2:是否独占队列 参数3:是否自动删除 参数4:其他属性
        channel.queueDeclar
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值