`

Java学习——rabbitmq(work queue)

 
阅读更多

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作为一款广泛使用的开源消息代理,是实现工作队列(Work Queue)模式的理想选择。本文将深入探讨RabbitMQ工作队列的实现,包括消息确认机制、消息持久化以及公平调度等关键知识点。 首先,让我们理解工作...

    MQ消息队列之——RabbitMQ

    学习RabbitMQ的学习笔记

    rabbitMQ实战java版-rabbitMQ-demo.zip

    《RabbitMQ实战Java版——基于rabbitMQ-demo.zip的详解》 在当今的分布式系统中,消息队列作为异步处理、解耦组件的关键技术,得到了广泛应用。RabbitMQ作为一款开源的消息代理和队列服务器,以其稳定性和易用性...

    使用Java编写的RabbitMQ连接池方法

    RabbitMQ客户连接池的Java实现。我们刚开始也是采用这种方式来实现的,但做压力测试时,发现这种每次新建Connection和新建Channel是非常耗时的,在大并发下,一般都要8毫秒左右,慢的话,好多都是几十毫秒。因此我们...

    Java使用RabbitMq的一个简单demo

    在IT行业中,消息队列(Message Queue)是一种重要的中间件技术,它允许...在这个简单的demo中,我们学习了如何创建连接、声明交换机和队列、发送和接收消息,这些都是RabbitMQ的基础操作,为更高级的用法打下了基础。

    基于Java语言的RabbitMQ学习与实践设计源码

    本项目是一款基于Java语言的RabbitMQ学习与实践设计源码,共计78个文件,涵盖29个Java源文件、14个Markdown文档、8个XML配置文件、5个属性文件、4个Git忽略规则文件、4个命令行脚本文件、3个JAR包文件、2个PNG图片...

    java rabbitmq动态注册,监听实现

    在Java开发中,RabbitMQ是一个非常流行的开源消息队列系统,它基于AMQP(Advanced Message Queuing Protocol)协议,提供了高效、可靠的异步通信能力。在这个场景中,"java rabbitmq动态注册,监听实现"涉及到的主要...

    java使用rabbitMq服务

    【Java使用RabbitMQ服务】 RabbitMQ是一款开源的消息队列系统,广泛应用于分布式系统中的消息传递。本文将简要介绍如何在Java环境中使用RabbitMQ,包括安装、基本结构、消息发送模式以及高级特性。 ### 1. 安装 在...

    Rabbitmq工具类,java工具类RabbitmqUtil

    在Java开发中,RabbitMQ是一个非常流行的开源消息队列系统,它基于AMQP(Advanced Message Queuing Protocol)协议,用于高效地处理异步任务和解耦系统组件。`RabbitmqUtil` 是一个专门为Java开发者设计的工具类,...

    RabbitMQ Java测试客户端

    它涵盖了连接管理、消息发送与接收的基本流程,对于学习和理解RabbitMQ在Java环境下的应用非常有帮助。在实际开发中,你可以根据项目需求调整这些示例,例如增加错误处理、消息确认机制、使用工作队列模型等,以实现...

    rabbitMQ学习笔记

    rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ学习笔记rabbitMQ...

    RabbitMQ工具类封装实现

    在IT行业中,消息队列(Message Queue,MQ)是一种常用于分布式系统中解耦组件、提高系统可扩展性和容错性的技术。RabbitMQ作为一款开源的消息中间件,被广泛应用于各种项目中。本篇文章将重点讲解如何进行RabbitMQ...

    springboot+RabbitMq交换器Direct的demo

    在提供的压缩包文件`rabbitmq_direct`中,可能包含了实现上述功能的源代码,包括Spring Boot项目的结构、配置文件、发送和接收消息的Java类等。读者可以下载这个文件,根据说明运行代码,以更好地理解和实践RabbitMQ...

    java版本RabbitMQ实例.rar.rar

    Java版本的RabbitMQ实例是...这个Java版本的RabbitMQ实例是学习如何在Java项目中集成消息队列的宝贵资源。通过它,开发者可以掌握RabbitMQ的核心概念,以及如何在实际场景中利用这些概念构建健壮的、可扩展的应用程序。

    javaAPI SpringMVC 集成rabbitMQ 实现了生产消费,重复消费等功能

    在Java开发中,SpringMVC框架常用于构建Web应用程序,而RabbitMQ是一个流行的开源消息队列系统,基于Advanced Message Queuing Protocol (AMQP)。本文将深入探讨如何使用Java API和SpringMVC来集成RabbitMQ,实现...

    rabbitmq 发布/订阅 java 实现

    在Java开发中,RabbitMQ提供了一套完整的API,使得开发者能够轻松地实现发布/订阅模式。这种模式下,生产者发送消息到一个主题,而多个消费者可以订阅这个主题,接收并处理这些消息。 首先,要使用RabbitMQ,你需要...

    Java全能学习面试手册——Java面试题库.zip

    Java全能学习面试手册——Java面试题库.zip 01 7道消息队列ActiveMQ面试题!.pdf 02 10道Java高级必备的Netty面试题!.pdf 03 10道Java面试必备的设计模式面试题!.pdf 04 10个Java经典的List面试题!.pdf 05 10个...

    rabbitMQ Java开发案例

    javaAPI SpringMVC 集成rabbitMQ 很全的例子,实现了生产消费,重复消费等功能

    rabbitmq教程

    RabbitMQ 三种Exchange.wps————————三种exchange解释及代码 rabbitmq结构.wps————————rabbitmq架构简介 rabbitmq入门.pdf——————入门的文档 RabbitMQ研究与应用.pdf——————简单的研究

    java中间件之rabbitmq

    ### Java中间件之RabbitMQ详解 #### 一、RabbitMQ简介 ##### 1.1 RabbitMQ是什么 RabbitMQ是一款开源的消息中间件,基于AMQP (Advanced Message Queuing Protocol) 协议构建,主要使用Erlang语言编写。RabbitMQ...

Global site tag (gtag.js) - Google Analytics