# 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("发送完毕");
}
}
# 消费者
← HelloWorld 消息应答 →