RabbitMQ整合Spring Booot【公平队列】

手把手教你 springBoot 整合 rabbitMQ,利用 MQ 实现事务补偿 每天早上七点三十,准时推送干货rabbitMQ 在互联网公司有着大规模应用,本篇将实战介绍 springboot 整合 rabbitMQ,同时也将在具体的业务场景中介绍利用 MQ 实现事... 阅读详情

producer:

package com.toov5.Producer;

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

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.toov5.utils.MQConnectionUtils;

public class Producer {
    // 队列名称
    private static final String UEUE_NAME = "test_queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 创建新的连接
        Connection connection = MQConnectionUtils.newConnection();
        // 创建Channel
        Channel channel = connection.createChannel();
        // 创建队列
        channel.queueDeclare(UEUE_NAME, false, false, false, null);
        channel.basicQos(1); // 保证 取一个消费  队列给消费者发送消息时候 一个消息
        for (int i = 0; i < 10; i++) {
            // 创建message
            String msg = "toov5_message";
            System.out.println("生产者投递消息" + msg + i);
            // 生产者发送消息
            channel.basicPublish("", UEUE_NAME, null, msg.getBytes());
        }
        // 关闭通道和连接
        channel.close();
        connection.close();

    }
}

Consumer1

package com.toov5.Consumer;

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

import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.toov5.utils.MQConnectionUtils;

public class Consumer1 {
  
     //队列名称
        private static final String QUEUE_NAME = "test_queue";
        
        public static void main(String[] args) throws IOException, TimeoutException {
            System.out.println("消费者启动..........1");
            //创建新的连接
        Connection connection = MQConnectionUtils.newConnection();
           //创建Channel
            final Channel channel = connection.createChannel();
            // 消费者关联队列
             channel.queueDeclare(QUEUE_NAME, false, false, false, null);
             channel.basicQos(1);
              DefaultConsumer defaultConsumerr = new DefaultConsumer(channel) {
                  //监听获取消息
                    @Override
                    public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
                            byte[] body) throws IOException {
                        String msg =new String(body,"UTF-8");
                        System.out.println("消费者获取生产者消息:"+msg);
                        try {
                            //模拟应答等待时间
                            Thread.sleep(1000);
                        } catch (Exception e) {
                            
                        }finally {
                           channel.basicAck(envelope.getDeliveryTag(), false);  //手动应答 告诉消息队列服务器 消费成功
                        }
                    }
              };
            //牵手模式设置  默认自动应答模式  true:自动应答模式  
              channel.basicConsume(QUEUE_NAME, false, defaultConsumerr);//    fanse手动应答          

        }
}

Consumer2

package com.toov5.Consumer;

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

import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.toov5.utils.MQConnectionUtils;

public class Consumer2 {
  
     //队列名称
        private static final String QUEUE_NAME = "test_queue";
        
        public static void main(String[] args) throws IOException, TimeoutException {
            System.out.println("消费者启动..........2");
            //创建新的连接
        Connection connection = MQConnectionUtils.newConnection();
           //创建Channel
            final Channel channel = connection.createChannel();
            // 消费者关联队列
             channel.queueDeclare(QUEUE_NAME, false, false, false, null);
              channel.basicQos(1);
              DefaultConsumer defaultConsumerr = new DefaultConsumer(channel) {
                  //监听获取消息
                    @Override
                    public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
                            byte[] body) throws IOException {
                        String msg =new String(body,"UTF-8");
                        System.out.println("消费者获取生产者消息:"+msg);
                        try {
                            //模拟应答等待时间
                            Thread.sleep(300);
                        } catch (Exception e) {
                            
                        }finally {
                        channel.basicAck(envelope.getDeliveryTag(), false);  //手动应答 告诉消息队列服务器 消费成功
                        }
                    }
              };
            //牵手模式设置  默认自动应答模式  true:自动应答模式  
              channel.basicConsume(QUEUE_NAME, false, defaultConsumerr);//    fanse手动应答          
        }
}

运行结果:

睡眠少的(执行快的) 指定的多

 注意 每个消费者 必须要应答 一下! 队列服务器没有收到应答 就不会发送下一个给消费者~

spring事物和rabbitMQ的例子 spring的2个数据源的配置,并且每个数据源都配置了事物管理。还有rabbitMQ的发送端代码。本人项目亲自用到的,可以运行。 立即下载

相关推荐

如何搭建pikachu靶场

Pikachu靶场本地搭建指南 下载安装PHPStudy并启动Apache/MySQL服务 获取Pikachu靶场源码并解压到网站根目录 配置数据库连接信息(修改config.inc.php文件) 创建pikachu数据库(用户名/密码设为root) 访问http://localhost/pikachu测试功能 常见问题:数据库连接失败需检查服务状态和配置信息,页面报错需检查PHP版本兼容性。建议使用PHP7.3/7.4版本,在隔离环境中搭建使用。 (150字)

2401_85351702的博客 1276

分布式事务解决方案-springboot 整合rabbitMQ-图解

代码地址:https://github.com/ArvinHu/rabbit

hu10131013的博客 16万+

STM32F4_LCD显示汉字

LCD显示汉字和显示图片、数字、字符的原理是一样的,都是将汉字、图片、数字以及字符转换点阵,进而通过函数扫描点阵在LCD上显示;

light_2025的博客 1万+

springboot RabbitMQ分布式事务-可靠消息的最终一致性方案代码示例

Rabbit mq分布式事务主要问题 如果先发送消息,再执行本地事务,可能会出现消息已经发送成功,但是Rabbit mq没有返回,则无法更新消息表;或者接收到消息成功发送通知,但是更新数据库失败; 如果先执行本地事务,再发送消息,可能本地事务执行成功,但Rabbit mq没有发送;或者发送了没有返回。 Rabbit mq分布式事务实现思路 生产者向Rabbit mq发送消息,消费者此时不消...

letterss的博客 4065

SAR成像系列:【3】合成孔径雷达(SAR)的二维回波信号与简单距离多普勒(RD)算法 (附matlab代码)

二维回波信号分析

zr2006_7的专栏 2万+

告别手动点鼠标:用Python脚本批量跑ADS版图仿真,效率提升10倍(附完整代码)

本文详细介绍了如何利用Python脚本自动化ADS版图仿真流程,显著提升射频工程师的工作效率。通过调用ADS底层接口,实现参数化修改、批量任务调度和结果自动收集,解决了手动操作中的常见问题,如仿真不更新等。附完整代码,帮助开发者快速实现10倍效率提升。

weixin_42523543的博客 331

springBoot使用RabbitMq6大模式详解

最简单最全的rabbitmq上手教程

sora33的博客 1655

31、双相不锈钢直齿轮加工与性能研究及人工神经网络在焊接中的应用

本文研究了双相不锈钢直齿轮在不同加工方法(WEDM与滚齿加工)下的磨损行为,分析了表面粗糙度、齿厚变化、磨损率及润滑性能随转速的变化规律,并对比了两种工艺的优劣。同时,探讨了人工神经网络(ANN)在AA7050铝合金搅拌摩擦焊中的应用,通过建立工艺参数与焊接质量之间的预测模型,实现了对焊缝硬度和峰值温度的准确预测。研究为高性能齿轮制造和铝合金焊接提供了理论支持和技术参考,并提出了未来在润滑优化、加工工艺改进及智能控制方面的研究方向。

ggg99的专栏 150

Springboot中RabbitMQ公平模式

文章目录1.轮询方式2. 公平方式1. 生产者使用API接口来调用2. 提供两个消费者2.1 消费者12.2 消费者22.3 消费者1和2之间的差别2.4 RabbitMQ的配置2.5 结果 RabbitMQ中的work模式消息的分发有两种方式 轮询方式(默认) 公平方式 1.轮询方式 RabbitMQ默认采用的消息分发模式,这里不多说 2. 公平方式 1. 生产者使用API接口来调用 ...

iCopper_的博客 2093

【Unity实战篇】 接入百度翻译,实现文本自动翻译功能

日常在做项目的过程中,游戏本地化几乎已经成为必不可少的一步。 本篇文章将演示怎样在Unity中接入百度翻译,实现文本自动翻译的功能。

努力前行,总会成为自己心中的那道光 9059

PyQt5自动化测试,让测试更加便利

PyQt5是一个Python的GUI编程工具包,帮助开发者可以更加简单、快捷地创建图形界面和处理用户输入。在PyQt5中有两种常见的测试方式:手动测试和自动化测试。手动测试需要通过点击、输入等交互操作进行测试,自动化测试则是通过程序模拟鼠标、键盘等操作进行测试。这段代码创建了一个简单的窗口,其中包含一个按钮。这段代码打开一个本地HTML文件,点击页面上的按钮并检查输出是否为“Button clicked”。以上就是在PyQt5中进行自动化测试的简单示例。使用PyQt5可以大大简化测试过程,提高测试效率。

PixelCoder的博客 710

SpringBoot整合RabbitMQ 实现五种消息模型 详细教程

今天说下了消息队列中间件,各种队列性能对比,RabbitMQ队列,交换机(Exchange)以及消息 中间件的应用场景,然后带着大家一起实现RabbitMQ的五种消息模型。 消息队列中间件 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题实现高性能,高可用,可伸缩和终一致性[架构] 使用较多的消息队列有 ActiveMQ,RabbitMQ,ZeroMQ,K...

小宋的博客 8914

YOLO26改进策略【YOLO和Mamba】| 替换骨干 Mamba-YOLO26-T !!! 最新的发文热点

模块是模型中的一个重要组成部分,其主要作用是在模型的初始阶段对输入图像进行处理,方便后续的特征提取和目标检测。以下是对。

Limiiiing的博客 901

Spring Boot 注解方式 实现RabbitMQ

1.简介 MQ为message queue消息队列,是程序与程序之间的通讯方法; RabbitMQ是由erlang(面向并发的编程语言)语言进行开发,遵循的是AMQP(Advanced Message Queue )协议,支持市面上所有的主流的操作系统且支持多种语言开发 2.基础概念 Producer(生产者):生产者用于发布消息。 Consumer(消费者):用于从队列中获取消息,消费者只需关...

qq331709114的博客 4990

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SpringBoot(十三):SpringBoot整合RabbitMQ

如果对RabbitMQ不熟悉的,建议先看RabbitMQ系列教程。 一、环境准备 RabbitMQ 3.7.4 SpringBoot 1.5.10.RELEASE &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; ...

Saytime 3152

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

springboot2.3.1整合RabbitMQ多种工作模式 发送确认,手动应答

springboot2.3.1整合RabbitMQ多种工作模式 发送确认,手动应答

胖虎儿的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

RabbitMQ (四) 工作队列之公平分发

上篇文章讲的轮询分发 : 1个队列,无论多少个消费者,无论消费者处理消息的耗时长短,大家消费的数量都一样. 而公平分发,又叫 : 能者多劳,顾名思义,处理得越快,消费得越多. 生产者 public class Producer { private const string QueueName = "test_work2_queue"; ...

weixin_30520015的博客 209

Spring Boot整合RabbitMQ——生产者发送确认

文章目录1. 生产者发送确认简介2. 事务消息机制2.1 原理2.2 快速搭建项目3. 发送方Confirm Callback机制3.1 原理3.2 快速项目搭建4. 发送方Return Callback机制4.1 原理4.2 快速项目搭建5. Return Callback与Confirm Callback的区别 1. 生产者发送确认简介 生产者发送消息真的成功到达rabbitmq broker服务节点了吗?默认情况下,生产者发送消息的方法没有任何返回信息,也就是说如果消息在发送broker节点的过程中由

灵波微布 1620

rabbitmq(4)消息队列(公平分发)

1、目标 实现rabbitmq将消息优先发给闲置的消费者。 2、代码 2.1、生产者 private final static String QUEUE_NAME = "hello"; @Test public void testSend() throws Exception { ConnectionFactory factory = new ConnectionFactor...

祈雨v的博客 1018

RabbitMQ 系列之分布式事务处理-最终一致性-SpringBoot实现

目录 分布式事务应用场景: 如何使用RabbitMQ 解决分布式事务-最终一致性: 实现场景:用户下单service - 扣减用户积分 service 结合Springboot 处理分布式事务-为减少篇幅,只列出主要几块代码,详见文末源码链接: maven-parent . pom.xml 以下是Maven-module.orderProducer 生产者模块内容 mav...

人人都是程序员 8571

springboot与RabbitMQ整合消息队列,生产者发送消息确认,消费者消息确认模式

该篇文章内容较多,包括有rabbitMq相关的一些简单理论介绍,provider消息推送实例,consumer消息消费实例,Direct、Topic、Fanout的使用,消息回调、手动确认等。 (但是关于rabbitMq的安装,就不介绍了) 在安装完rabbitMq后,输入http://ip:15672/,是可以看到一个简单后台管理界面的。 在这个界面里面我们可以做些什么? 可以手动创建虚拟host,创建用户,分配权限,创建交换机,创建队列等等,还有查看队列消息,消费效率,推送效率等等。 以上这些..

追风筝的人博客 1882

RabbitMQ 消息公平分发

概念: 如果Rabbit只管按顺序把消息发到各个消费者身上,不考虑消费者负载的话,很可能出现,一个机器配置不高的消费者那里堆积了很多消息处理不完,同时配置高的消费者却一直很轻松。为解决此问题,可以在各个消费者端,配置perfetch=1,意思就是告诉RabbitMQ在我这个消费者当前消息还没处理完的时候就不要再给我发新消息了。 ...

十年饮冰,难凉热血 1521

springboot整合rabbitMQ---生产者消息确认机制

rabbitMQ消息确认机制 当我们程序向rabbitMQ中间件发送消息时,如果程序没什么异常的话,一般都会成功发送消息 但是,我们并不知道,消息是否成功发送到相应交换机的相应队列中,此时,我们需要用到消息确认机制, 这也是rabbitMQ的一个功能点 1.消息发送确认 与 消息接收确认(ACK) 消息发送确认: 当消息可能因为路由键不匹配或者发送不到指定交换机而导致无法发送到相应队列时 确认...

kevin的博客 4634

SpringBoot与工作队列的两种分发方式

工作队列轮循分发 创建队列配置文件类@Configurationpublic class RabbitConfig { //多个队列名称 private final static String QUEUE_NAME = "test_work_queue"; private final static String QUEUE_NAME1 = "test_work_queu...

dielizuo1692的博客 712

RabbitMQ 公平分发模式

在上一篇文章的基础上进行改动 创建两个消费者,分别是 ConsumerAa、ConsumerBb package com.example.demo; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotati...

weixin_30371469的博客 326

SpringBoot整合RabbitMQ

该篇文章内容较多,包括有rabbitMq相关的一些简单理论介绍,provider消息推送实例,consumer消息消费实例,Direct、Topic、Fanout的使用,消息回调、手动确认等。 (但是关于rabbitMq的安装,就不介绍了) 在安装完rabbitMq后,输入http://ip:15672/,是可以看到一个简单后台管理界面的。 在这个界面里面我们可以做些什么? 可以手动创建虚拟host,创建用户,分配权限,创建交换机,创建队列等等,还有查看队列消息,消费效率,推送效率等等。 以上..

K_kzj_K的博客 5237
上一篇: 消息队列RabbitMQ应答模式(自动、手动)
下一篇: RabbitMQ公平队列原理和使用
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值