侧边栏壁纸
  • 累计撰写 79 篇文章
  • 累计创建 7 个标签
  • 累计收到 0 条评论

RabbitMq

水龙吟
2021-11-09 / 0 评论 / 0 点赞 / 134 阅读 / 2,145 字
温馨提示:
本文最后更新于 2021-12-27,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
  • 问题
生产者第一次建立交换机所绑定的routingkey
重启生产者,若减少了绑定不生效,只能去后台手动点击取消


  • RabbitMQ官方地址
http://www.rabbitmq.com/ 
https://www.rabbitmq.com/getstarted.html 
RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。

RabbitMQ提供了6种模式:简单模式,work模式,Publish/Subscribe发布与订阅模式,Routing路由模式,Topics主题模式,RPC远程调用模式(远程调用,不太算MQ;暂不作介绍);


2.启用管理插件
rabbitmq-plugins enable rabbitmq_management
3.启动RabbitMQ
systemctl start rabbitmq-server.service
systemctl status rabbitmq-server.service
	
systemctl stop rabbitmq-server.service 

简单模式
生产者直接将消息发送到队列中,消费者去队列中取消息 1v1

工作模式:work
生产者将消息发送到队列中,多个消费者去队列中取消息(默认是平均分配)
要想消费者彼此争抢:
	
/**
 * 两个消费者 默认是均分的
 * 设置根据消费者自动争抢须要:
 *  1、关闭自动确认 channel.basicConsume(QUEUE_NAME,false,consumer);
 *  2、添加手动确认代码 channel.basicAck(envelope.getDeliveryTag(), false);
 *  3、//消费掉一个消息后再去消费另一个  channel.basicQos(1);
 *
 */
public class WorkConsumer1 {
    static final String QUEUE_NAME = "work_queue";
    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtils.getConnection();
        Channel channel = connection.createChannel();
//        channel.queueDeclare(QUEUE_NAME,true,false,false,null);  可以不声明
        //消费掉一个消息后再去消费另一个
        channel.basicQos(1);
        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("body:"+new String(body));
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                channel.basicAck(envelope.getDeliveryTag(), false); //第二个参数是是否确认多个消息

            }
        };
//        channel.basicConsume(QUEUE_NAME,true,consumer);
        channel.basicConsume(QUEUE_NAME,false,consumer);
    }
}



订阅模式:
1、fanout广播模式
 每个消费者监听指定的队列
 生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到相同的消息。
2、routing路由模式
 队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由 
 key)
 消息的发送方在 向 Exchange发送消息时,也必须指定消息的 RoutingKey。
 Exchange不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行 
 判断,只有队列的Routingkey与消息的 Routing key完全一致,才会接收到消 
 息

image.png
路由模式:队列绑定交换机指定的key和发送消息指定的key相同时,才能发送出去。

3、Topics通配符模式
 Topic类型与Routing相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候**使用通配符**!
Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: item.insert
通配符规则:
#:匹配零个或多个词
*:匹配不多不少恰好1个词
举例:
item.#:能够匹配item.insert.abc 或者 item.insert
item.*:只能匹配item.insert

123.png

0

评论区