20200221——rabbitmq 工作模式

Work queues
work queues与入门程序相比,多了一个消费端,两个消费端共同消费同一个队列中的消息。 应用场景:对于 任务过重或任务较多情况使用工作队列可以提高任务处理的速度。
测试: 1、使用入门程序,启动多个消费者。 2、生产者发送多个消息。
结果: 1、一条消息只会被一个消费者接收; 2、rabbit采用轮询的方式将消息是平均发送给消费者的; 3、消费者在处理完某条消息后,才会收到下一条消息
在这里插入图片描述
Publish/subsrcibe
在这里插入图片描述
发布订阅模式:
1、每个消费者监听自己的队列。
2、生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收 到消息

就是相当于多了一个交换机,交换机生产两个队列,每个队列绑定在绑定一个消费者

package com.xuecheng.test.rabbitmq;

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

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

/**
 * @Classname Producer02_publish
 * @Description TODO
 * @Date 2020/2/21 15:53
 * @Created by mmz
 */
public class Producer02_publish {
    private static final String QUEUE_INFORM_EMAIL = "queue_inform_email";
    private static final String QUEUE_INFORM_SMS = "queue_inform_sms";
    private static final String EXCHANGE_FANOUT_INFORM="exchange_fanout_inform";

    public static void main(String[] args) {
        //通过连接工厂,创建新的连接
        ConnectionFactory connectionFactory = new ConnectionFactory();

        //设置参数
        connectionFactory.setHost("127.0.0.1");//ip地址
        connectionFactory.setPort(5672);//端口
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        //设置虚拟机,一个mqf服务可以设置多个虚拟机,每个虚拟机就相当于独立的mq
        connectionFactory.setVirtualHost("/");

        //生产者和mq建立连接
        Connection connection = null;
        Channel channel = null ;
        try {
            connection =  connectionFactory.newConnection();

            //创建会话通道,所有生产者和mq服务都在channel通道中
            channel = connection.createChannel();
            //声明队列
            //参数
            channel.queueDeclare(QUEUE_INFORM_EMAIL,true,false,false,null);
            channel.queueDeclare(QUEUE_INFORM_SMS,true,false,false,null);
            //声明交换机
            //交换机的类型:
            // fanout:对应的rabbitmq的工作模式是publish/subscribe
            // direct: 路由的工作模式
            // topic:  通配符模式
            // headers: 对应headers工作模式
            channel.exchangeDeclare(EXCHANGE_FANOUT_INFORM, BuiltinExchangeType.FANOUT);
            //交换机和队列进行绑定
            //有一个参数routingkey,在发布订阅模式是一个空穿
            channel.queueBind(QUEUE_INFORM_EMAIL,EXCHANGE_FANOUT_INFORM,"");
            channel.queueBind(QUEUE_INFORM_SMS,EXCHANGE_FANOUT_INFORM,"");
            //发送消息
            for(int i=0;i<5;i++){
                String message = "helloworld mmz";
                channel.basicPublish(EXCHANGE_FANOUT_INFORM,"",null,message.getBytes());
                System.out.println("send to mq" + message);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭连接
            //先关闭通道
            try {
                channel.close();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (TimeoutException e) {
                e.printStackTrace();
            }
            try {
                connection.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Routing
路由模式:
1、每个消费者监听自己的队列,并且设置routingkey。
2、生产者将消息发给交换机,由交换机根据routingkey来转发消息到指定的队列。

在这里插入图片描述

Topics工作模式
在这里插入图片描述

在这里插入图片描述

header模式与RPC

在这里插入图片描述

发布了735 篇原创文章 · 获赞 42 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_36344771/article/details/104428887