rabbitMq的几种模式

简单模式

在这里插入图片描述简单模式如图所示只有生产者(p)消费者(c)
以及红色部分(队列)
编写生产者

package com.lyf.conf;

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

/**
 * Created by IntelliJ IDEA.
 * User:liuyaf
 * Date:2021/3/25
 * Time:20:22
 **/
public class Product {
    public static void main(String[] args) throws Exception {
        //创建连接工厂  --配置连接信息
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.79.188");
        //创建连接对象
        Connection connection = factory.newConnection();
        //创建信道
        Channel channel = connection.createChannel();
        //创建队列
        channel.queueDeclare("lyf-simple",true,false,false,null);
        //发送的消息

        for (int i = 1; i<=10;i++){
            String sum ="哈哈哈哈哈"+i;
            channel.basicPublish("","lyf-simple",null,sum.getBytes());
        }

    }
}

循环输入10条数据

代码接收

public class One {
    public static void main(String[] args) throws Exception{
        //创建连接工厂  ----配置连接
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.79.188");
        //创建连接对象
        Connection connection = factory.newConnection();
        //创建信道
        Channel channel = connection.createChannel();
        //接收的信息
        /**
         * (String queue, 队列的名称
         *  boolean autoAck, 是否自动确认
         *  Consumer callback: 回调方法 当队列中存在信息后 会自动触发回调函数。
         */
        DefaultConsumer callback=new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                //body 接受的信息
                System.out.println("消息的内容:"+new String(body));
            }
        };
        channel.basicConsume("lyf-simple",true,callback);

    }
}

效果图:输出在控制台
在这里插入图片描述队列中没有数据,被消费了
在这里插入图片描述如果要往队列中添加数据要先将获取关掉不然会直接消费掉:在这里插入图片描述

工作者模式

在这里插入图片描述如图所示:一个生产者,一个队列,两个消费者
消费者是竞争关系c1那了1,c2就不能那1。一般用在批量处理上. rabbitMQ里面积压了大量的消息。
生产者代码:和上边生产者代码一样
消费者代码:

package com.on;

import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * Created by IntelliJ IDEA.
 * User:liuyaf
 *
 * @create: 2021-05-05 16:07
 **/
public class Tow1 {

        public static void main(String[] args) throws Exception{
            //创建连接工厂 --配置连接信息
            ConnectionFactory factory=new ConnectionFactory();
            factory.setHost("192.168.79.188");
            //创建连接对象Connection
            Connection connection=factory.newConnection();
            //创建信道
            Channel channel = connection.createChannel();
            //接受消息
            /**
             * (String queue, 队列的名称
             *  boolean autoAck, 是否自动确认
             *  Consumer callback: 回调方法 当队列中存在信息后 会自动触发回调函数。
             */
            DefaultConsumer callback=new DefaultConsumer(channel){
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    //body 接受的信息
                    try {
                        Thread.sleep(1000L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("消费者01:"+new String(body));
                }
            };
            channel.basicConsume("lyf-simple",true,callback);

        }
    }


创建两个消费者将代码中消费者1改为2就行运行后的效果

效果图:
在这里插入图片描述

发布订阅模式

在这里插入图片描述
一个生产者,一个交换机,多个队列,多个消费者
生产者代码;

package com.lyf.test;

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

/**
 * Created by IntelliJ IDEA.
 * User:liuyaf
 * Date:2021/3/25
 * Time:20:22
 **/
public class Product {
    public static void main(String[] args) throws Exception {
        //创建连接工厂  --配置连接信息
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.79.188");
        //创建连接对象
        Connection connection = factory.newConnection();
        //创建信道
        Channel channel = connection.createChannel();
        //创建队列
        channel.queueDeclare("lyf-publish01",true,false,false,null);
        channel.queueDeclare("lyf-publish02",true,false,false,null);
        //创建交换机
        channel.exchangeDeclare("ban129-lyf-publish", BuiltinExchangeType.FANOUT,true);
        //绑定队列
        channel.queueBind("lyf-publish01","ban129-lyf-publish","");
        channel.queueBind("lyf-publish02","ban129-lyf-publish","");


        //发送的消息
        for(int i=0;i<10;i++) {
            String sum ="刘冰冰,李霄文,李娜丽,郭睿欣,马凯月,王晓宇,云梦梦,魏子莹,李雅丽,李希文,林欣月,王玉洁,王云燕"+i;
            channel.basicPublish("ban129-lyf-publish","",null,sum.getBytes());
        }

    }
}

图形化界面中添加了两个队列每个有十条数据
在这里插入图片描述
消费者代码:

package com.confa;

import com.rabbitmq.client.*;

/**
 * Created by IntelliJ IDEA.
 * User:liuyaf
 * Date:2021/3/25
 * Time:20:22
 **/
public class Consumer02 {
    public static void main(String[] args) throws  Exception{
        //创建连接工厂  ----配置连接
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.79.188");
        //创建连接对象
        Connection connection = factory.newConnection();
        //创建信道
        Channel channel = connection.createChannel();
        //接收的信息
        DefaultConsumer consumer=new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) {
                System.out.println("2内容="+new String(body));
            }
        };
        channel.basicConsume("lyf-publish02",false,consumer);

    }
}

两个消费者将内容前的数字改一下

效果图:在控制台输出,消费者1和2都有数据
在这里插入图片描述在这里插入图片描述

路由模式

在这里插入图片描述

特点:
1.一个生产者
2.多个消费者
3.多个队列。
4.交换机 转发消息。
5.routekey:路由key 只要routekey匹配的消息可以到达对应队列。
生产者代码

package com.lyf.product;

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

/**
 * Created by IntelliJ IDEA.
 * User:liuyaf
 * Date:2021/3/25
 * Time:20:22
 **/
public class Product {
    public static void main(String[] args) throws Exception {
        //创建连接工厂  --配置连接信息
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.79.188");
        //创建连接对象
        Connection connection = factory.newConnection();
        //创建信道
        Channel channel = connection.createChannel();

        //创建队列
        channel.queueDeclare("lyf-routing01",true,false,false,null);

        channel.queueDeclare("lyf-routing02",true,false,false,null);
        //创建交换机
        channel.exchangeDeclare("ban129-lyf-routing",BuiltinExchangeType.DIRECT,true);
        channel.queueBind("lyf-routing01","ban129-lyf-routing","error");
        channel.queueBind("lyf-routing02","ban129-lyf-routing","error");
        channel.queueBind("lyf-routing02","ban129-lyf-routing","info");
        channel.queueBind("lyf-routing02","ban129-lyf-routing","warning");
        //发送的消息
        for (int i = 1; i<=10;i++){
            String sum ="刘冰冰,李霄文,李娜丽,郭睿欣,马凯月,王晓宇,云梦梦,魏子莹,李雅丽,李希文,林欣月,王玉洁,王云燕"+i;
            //info是路由key只有符合时才能传入数据
            channel.basicPublish("ban129-lyf-routing","info",null,sum.getBytes());
        }

    }
}

图形化截图
在这里插入图片描述
为error时
在这里插入图片描述两个队列都有数据
在这里插入图片描述

topic主体模式

在这里插入图片描述
一个生产者,一个交换机,
交换机和队列绑定按照通配符的模式。
*: 统配一个单词。
#: 统配n个单词
,多个队列,多个消费者

生产者代码:


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

/**
 * Created by IntelliJ IDEA.
 * User:liuyaf
 * Date:2021/3/25
 * Time:20:22
 **/
public class Topic {
    public static void main(String[] args) throws Exception {
        //创建连接工厂  --配置连接信息
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.79.188");
        //创建连接对象
        Connection connection = factory.newConnection();
        //创建信道
        Channel channel = connection.createChannel();

        //创建队列
        channel.queueDeclare("lyf-f-topic01",true,false,false,null);

        channel.queueDeclare("lyf-f-topic02",true,false,false,null);
        //创建交换机
        channel.exchangeDeclare("ban129-lyf-topic",BuiltinExchangeType.TOPIC,true);
        channel.queueBind("lyf-f-topic01","ban129-lyf-topic","*.lyf.*");
        channel.queueBind("lyf-f-topic02","ban129-lyf-topic","*.*.lyf");
        channel.queueBind("lyf-f-topic02","ban129-lyf-topic","lazy.#");
        //发送的消息
        for (int i = 1; i<=10;i++){
            String sum ="刘冰冰,李霄文,李娜丽,郭睿欣,马凯月,王晓宇,云梦梦,魏子莹,李雅丽,李希文,林欣月,王玉洁,王云燕"+i;
        //a.lyf.a是通配符绑定,通配符可自己设置
            channel.basicPublish("ban129-lyf-topic","a.lyf.a",null,sum.getBytes());
        }

    }
}

消费者代码跟上边一样,只需要将队列名改一下

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星韵月光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值