# Work Queues

工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。

相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。

在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。

# 抽取工具类(这个在整合Spring Boot 前都一直会使用

public class RabbitMQUtils {
    private static final String HOST = "localhost";
    private static final Integer PORT = 5672;
    private static final String USERNAME = "admin";
    private static final String PASSWORD = "admin";

    public static Channel getChannel() {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setPort(PORT);
        factory.setHost(HOST);
        factory.setPassword(USERNAME);
        factory.setUsername(PASSWORD);
        //channel实现了自动close接口 自动关闭 不需要显示关闭
        Connection connection = null;
        try {
            connection = factory.newConnection();
            //获取信道
            Channel channel = connection.createChannel();
            return channel;
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
        return null;
    }
}

# 轮询分发

# 生产者


import com.example.mq_s.utils.RabbitMQUtils;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

/**
 * author:      高亮
 * time:        2022/7/4
 * description: 生产者发消息
 */
@Slf4j
public class Task_Producer {
    //队列名称
    private static final String HELLO = "hello_queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        Channel channel = RabbitMQUtils.getChannel();
        /**
         * 生成一个队列
         * 1.队列名称
         * 2.队列里面的消息是否持久化 默认消息存储在内存中
         * 3.该队列是否只供一个消费者进行消费 是否进行共享 true可以多个消费者消费
         * 4.是否自动删除 最后一个消费者端开连接以后 该队列是否自动删除 true 自动删除
         * 5.其他参数
         */
        channel.queueDeclare(HELLO,false,false,true,null);
        for (int i = 0;i<10;i++) {
            String message = "hello world!"+i;
            /**
             *  发送一个消息
             *  1.发送到那个交换机
             *  2.路由的key是哪个 (HelloWorld里就用队列名字)
             *  3.其他的参数信息
             *  4.发送消息的消息体
             */
            channel.basicPublish("",HELLO,null,message.getBytes(StandardCharsets.UTF_8));
        }
        log.info("发送完毕");
    }
}

# 消费者

消费者的代码和之前一样,区别就是启动多个消费者,当消费最快的进程,那么就会消费的最多