Work Queue
/* Work Queue Model / -> consumers one P -> [...]Q \ -> consumers two */
接下来用Rabbit实现一个工作任务分发,work queue常被用于web应用程序的场景。
生产者Send.java(发送多个消息)
package test; import java.io.IOException; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; public class Send { public static void main(String[] args) throws IOException { // 创建一个连接连接服务器 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); //factory.setPort(1987); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); // 声明一个队列,可以对队列做配置,如持久化等。然后往队列发送数据 channel.queueDeclare("queue1", false, false, false, null); for(int i = 1; i < 10; i ++){ String message = "message " + i; channel.basicPublish("", "queue1", null, message.getBytes()); System.out.println(" [x] Sent '" + message +"'"); } channel.close(); connection.close(); } }
Recv代码不变,开启多个Recv,运行效果如下
root # java -cp .:* Send [x] Sent 'message 1' [x] Sent 'message 2' [x] Sent 'message 3' [x] Sent 'message 4' [x] Sent 'message 5' [x] Sent 'message 6' [x] Sent 'message 7' [x] Sent 'message 8' [x] Sent 'message 9' root # java -cp .:* Recv [x] Received 'message 1' [x] Received 'message 3' [x] Received 'message 5' [x] Received 'message 7' [x] Received 'message 9' root # java -cp .:* Recv [x] Received 'message 2' [x] Received 'message 4' [x] Received 'message 6' [x] Received 'message 8'
默认情况下,RabbitMQ会把消息依次发送给各个consumer,平均情况下各个消费者分配的任务差不多,这种分配方式也称为round-robin轮询。
为了更加智能地按照工作量均分任务,在Recv.java中添加如下代码
int prefetchCount = 1; channel.basicQos(prefetchCount);
上面的模型比较简单,我们考虑如下场景:
有时候完成一个任务需要耗时很久,加入某个consumer执行任务失败(比如进程挂掉),消息队列中也没有这个消息了,这时这条消息就会丢失。
为了保证消息不丢失,RabbitMQ引入ack保证消息被完全处理,队列才会把消息删除掉。rabbitmq默认是开启这个配置的,如果需要关闭这个通知,可以再Recv.java中修改下面代码
channel.basicConsume("queue1", false, consumer);
注:我们也要防止某个队列不能及时收到ack而不断重复发送消息导致耗尽内存,可以用rabbitmqctl查看messages_unacknowledged
此外配置队列和消息持久(生产者消费者均需要配置)
boolean durable = true; channel.queueDeclare("queue1", durable, false, false, null); //发布持久消息 channel.basicPublish("", "queue1", MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
相关推荐
RabbitMQ作为一款广泛使用的开源消息代理,是实现工作队列(Work Queue)模式的理想选择。本文将深入探讨RabbitMQ工作队列的实现,包括消息确认机制、消息持久化以及公平调度等关键知识点。 首先,让我们理解工作...
学习RabbitMQ的学习笔记
《RabbitMQ实战Java版——基于rabbitMQ-demo.zip的详解》 在当今的分布式系统中,消息队列作为异步处理、解耦组件的关键技术,得到了广泛应用。RabbitMQ作为一款开源的消息代理和队列服务器,以其稳定性和易用性...
RabbitMQ客户连接池的Java实现。我们刚开始也是采用这种方式来实现的,但做压力测试时,发现这种每次新建Connection和新建Channel是非常耗时的,在大并发下,一般都要8毫秒左右,慢的话,好多都是几十毫秒。因此我们...
在IT行业中,消息队列(Message Queue)是一种重要的中间件技术,它允许...在这个简单的demo中,我们学习了如何创建连接、声明交换机和队列、发送和接收消息,这些都是RabbitMQ的基础操作,为更高级的用法打下了基础。
本项目是一款基于Java语言的RabbitMQ学习与实践设计源码,共计78个文件,涵盖29个Java源文件、14个Markdown文档、8个XML配置文件、5个属性文件、4个Git忽略规则文件、4个命令行脚本文件、3个JAR包文件、2个PNG图片...
在Java开发中,RabbitMQ是一个非常流行的开源消息队列系统,它基于AMQP(Advanced Message Queuing Protocol)协议,提供了高效、可靠的异步通信能力。在这个场景中,"java rabbitmq动态注册,监听实现"涉及到的主要...
【Java使用RabbitMQ服务】 RabbitMQ是一款开源的消息队列系统,广泛应用于分布式系统中的消息传递。本文将简要介绍如何在Java环境中使用RabbitMQ,包括安装、基本结构、消息发送模式以及高级特性。 ### 1. 安装 在...
在Java开发中,RabbitMQ是一个非常流行的开源消息队列系统,它基于AMQP(Advanced Message Queuing Protocol)协议,用于高效地处理异步任务和解耦系统组件。`RabbitmqUtil` 是一个专门为Java开发者设计的工具类,...
它涵盖了连接管理、消息发送与接收的基本流程,对于学习和理解RabbitMQ在Java环境下的应用非常有帮助。在实际开发中,你可以根据项目需求调整这些示例,例如增加错误处理、消息确认机制、使用工作队列模型等,以实现...
rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ...
在IT行业中,消息队列(Message Queue,MQ)是一种常用于分布式系统中解耦组件、提高系统可扩展性和容错性的技术。RabbitMQ作为一款开源的消息中间件,被广泛应用于各种项目中。本篇文章将重点讲解如何进行RabbitMQ...
在提供的压缩包文件`rabbitmq_direct`中,可能包含了实现上述功能的源代码,包括Spring Boot项目的结构、配置文件、发送和接收消息的Java类等。读者可以下载这个文件,根据说明运行代码,以更好地理解和实践RabbitMQ...
Java版本的RabbitMQ实例是...这个Java版本的RabbitMQ实例是学习如何在Java项目中集成消息队列的宝贵资源。通过它,开发者可以掌握RabbitMQ的核心概念,以及如何在实际场景中利用这些概念构建健壮的、可扩展的应用程序。
在Java开发中,SpringMVC框架常用于构建Web应用程序,而RabbitMQ是一个流行的开源消息队列系统,基于Advanced Message Queuing Protocol (AMQP)。本文将深入探讨如何使用Java API和SpringMVC来集成RabbitMQ,实现...
在Java开发中,RabbitMQ提供了一套完整的API,使得开发者能够轻松地实现发布/订阅模式。这种模式下,生产者发送消息到一个主题,而多个消费者可以订阅这个主题,接收并处理这些消息。 首先,要使用RabbitMQ,你需要...
Java全能学习面试手册——Java面试题库.zip 01 7道消息队列ActiveMQ面试题!.pdf 02 10道Java高级必备的Netty面试题!.pdf 03 10道Java面试必备的设计模式面试题!.pdf 04 10个Java经典的List面试题!.pdf 05 10个...
javaAPI SpringMVC 集成rabbitMQ 很全的例子,实现了生产消费,重复消费等功能
RabbitMQ 三种Exchange.wps————————三种exchange解释及代码 rabbitmq结构.wps————————rabbitmq架构简介 rabbitmq入门.pdf——————入门的文档 RabbitMQ研究与应用.pdf——————简单的研究
### Java中间件之RabbitMQ详解 #### 一、RabbitMQ简介 ##### 1.1 RabbitMQ是什么 RabbitMQ是一款开源的消息中间件,基于AMQP (Advanced Message Queuing Protocol) 协议构建,主要使用Erlang语言编写。RabbitMQ...