先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)

正文

第三步在消费者的 handleDelivery 消费方法中手动 ack,并且设置批量处理 ack 回应为 truechannel.basicAck(envelope.getDeliveryTag(), true);

这是生产端代码,与前几章的生产端代码没有做任何改变,主要的操作集中在消费端。公众号Java精选,回复Java面试,获取消息队列面试题,支持在线刷题。

import com.rabbitmq.client.Channel;

import com.rabbitmq.client.Connection;

import com.rabbitmq.client.ConnectionFactory;

public class QosProducer {

public static void main(String[] args) throws Exception {

//1. 创建一个 ConnectionFactory 并进行设置

ConnectionFactory factory = new ConnectionFactory();

factory.setHost(“localhost”);

factory.setVirtualHost(“/”);

factory.setUsername(“guest”);

factory.setPassword(“guest”);

//2. 通过连接工厂来创建连接

Connection connection = factory.newConnection();

//3. 通过 Connection 来创建 Channel

Channel channel = connection.createChannel();

//4. 声明

String exchangeName = “test_qos_exchange”;

String routingKey = “item.add”;

//5. 发送

String msg = “this is qos msg”;

for (int i = 0; i < 10; i++) {

String tem = msg + " : " + i;

channel.basicPublish(exchangeName, routingKey, null, tem.getBytes());

System.out.println("Send message : " + tem);

}

//6. 关闭连接

channel.close();

connection.close();

}

}

这里我们创建一个消费者,通过以下代码来验证限流效果以及 global 参数设置为 true 时不起作用.。我们通过Thread.sleep(5000); 来让 ack 即处理消息的过程慢一些,这样我们就可以从后台管理工具中清晰观察到限流情况。

import com.rabbitmq.client.*;

import java.io.IOException;

public class QosConsumer {

public static void main(String[] args) throws Exception {

//1. 创建一个 ConnectionFactory 并进行设置

ConnectionFactory factory = new ConnectionFactory();

factory.setHost(“localhost”);

factory.setVirtualHost(“/”);

factory.setUsername(“guest”);

factory.setPassword(“guest”);

factory.setAutomaticRecoveryEnabled(true);

factory.setNetworkRecoveryInterval(3000);

//2. 通过连接工厂来创建连接

Connection connection = factory.newConnection();

//3. 通过 Connection 来创建 Channel

final Channel channel = connection.createChannel();

//4. 声明

String exchangeName = “test_qos_exchange”;

String queueName = “test_qos_queue”;

String routingKey = “item.#”;

channel.exchangeDeclare(exchangeName, “topic”, true, false, null);

channel.queueDeclare(queueName, true, false, false, null);

channel.basicQos(0, 3, false);

//一般不用代码绑定,在管理界面手动绑定

channel.queueBind(queueName, exchangeName, routingKey);

//5. 创建消费者并接收消息

Consumer consumer = new DefaultConsumer(channel) {

@Override

public void handleDelivery(String consumerTag, Envelope envelope,

AMQP.BasicProperties properties, byte[] body)

throws IOException {

try {

Thread.sleep(5000);

} catch (InterruptedException e) {

e.printStackTrace();

}

String message = new String(body, “UTF-8”);

System.out.println(“[x] Received '” + message + “'”);

channel.basicAck(envelope.getDeliveryTag(), true);

}

};

//6. 设置 Channel 消费者绑定队列

channel.basicConsume(queueName, false, consumer);

channel.basicConsume(queueName, false, consumer1);

}

}

我们从下图中发现 Unacked值一直都是 3 ,每过 5 秒 消费一条消息即 Ready 和 Total 都减少 3,而 Unacked的值在这里代表消费者正在处理的消息,通过我们的实验发现了消费者一次性最多处理 3 条消息,达到了消费者限流的预期功能。

当我们将void basicQos(int prefetchSize, int prefetchCount, boolean global)中的 global 设置为 true的时候我们发现并没有了限流的作用。

TTL

TTL是Time To Live的缩写,也就是生存时间。RabbitMQ支持消息的过期时间,在消息发送时可以进行指定。RabbitMQ支持队列的过期时间,从消息入队列开始计算,只要超过了队列的超时时间配置,那么消息会自动的清除。

这与 Redis 中的过期时间概念类似。我们应该合理使用 TTL 技术,可以有效的处理过期垃圾消息,从而降低服务器的负载,最大化的发挥服务器的性能。公众号Java精选,回复Java面试,获取消息队列面试题,支持在线刷题。

RabbitMQ allows you to set TTL (time to live) for both messages and queues. This can be done using optional queue arguments or policies (the latter option is recommended). Message TTL can be enforced for a single queue, a group of queues or applied for individual messages.

RabbitMQ允许您为消息和队列设置TTL(生存时间)。这可以使用可选的队列参数或策略来完成(建议使用后一个选项)。可以对单个队列,一组队列强制执行消息TTL,也可以为单个消息应用消息TTL。

——摘自 RabbitMQ 官方文档

1、消息的 TTL

我们在生产端发送消息的时候可以在 properties 中指定 expiration属性来对消息过期时间进行设置,单位为毫秒(ms)。

/**

* deliverMode 设置为 2 的时候代表持久化消息

* expiration 意思是设置消息的有效期,超过10秒没有被消费者接收后会被自动删除

* headers 自定义的一些属性

* */

//5. 发送

Map headers = new HashMap();

headers.put(“myhead1”, “111”);

headers.put(“myhead2”, “222”);

AMQP.BasicProperties properties = new AMQP.BasicProperties().builder()

.deliveryMode(2)

.contentEncoding(“UTF-8”)

.expiration(“100000”)

.headers(headers)

.build();

String msg = “test message”;

channel.basicPublish(“”, queueName, properties, msg.getBytes());

我们也可以后台管理页面中进入 Exchange 发送消息指定expiration

2、队列的 TTL

我们也可以在后台管理界面中新增一个 queue,创建时可以设置 ttl,对于队列中超过该时间的消息将会被移除。

死信队列

死信队列:没有被及时消费的消息存放的队列

消息没有被及时消费的原因:

消息被拒绝(basic.reject/ basic.nack)并且不再重新投递 requeue=false TTL(time-to-live) 消息超时未消费 达到最大队列长度

实现死信队列步骤

首先需要设置死信队列的 exchange 和 queue,然后进行绑定:

`Exchange: dlx.exchange

Queue: dlx.queue

RoutingKey: # 代表接收所有路由 key

然后我们进行正常声明交换机、队列、绑定,只不过我们需要在普通队列加上一个参数即可: arguments.put("x-dead-letter-exchange",' dlx.exchange' ) 这样消息在过期、requeue失败、 队列在达到最大长度时,消息就可以直接路由到死信队列!

import com.rabbitmq.client.AMQP;

import com.rabbitmq.client.Channel;

import com.rabbitmq.client.Connection;

import com.rabbitmq.client.ConnectionFactory;

public class DlxProducer {

public static void main(String[] args) throws Exception {

//设置连接以及创建 channel 湖绿

String exchangeName = “test_dlx_exchange”;

String routingKey = “item.update”;

String msg = “this is dlx msg”;

//我们设置消息过期时间,10秒后再消费 让消息进入死信队列

AMQP.BasicProperties properties = new AMQP.BasicProperties().builder()

.deliveryMode(2)

.expiration(“10000”)

最后

分享一套我整理的面试干货,这份文档结合了我多年的面试官经验,站在面试官的角度来告诉你,面试官提的那些问题他最想听到你给他的回答是什么,分享出来帮助那些对前途感到迷茫的朋友。

面试经验技巧篇

经验技巧1 如何巧妙地回答面试官的问题经验技巧2 如何回答技术性的问题经验技巧3 如何回答非技术性问题经验技巧4 如何回答快速估算类问题经验技巧5 如何回答算法设计问题经验技巧6 如何回答系统设计题经验技巧7 如何解决求职中的时间冲突问题经验技巧8 如果面试问题曾经遇见过,是否要告知面试官经验技巧9 在被企业拒绝后是否可以再申请经验技巧10 如何应对自己不会回答的问题经验技巧11 如何应对面试官的“激将法”语言经验技巧12 如何处理与面试官持不同观点这个问题经验技巧13 什么是职场暗语

面试真题篇

真题详解1 某知名互联网下载服务提供商软件工程师笔试题真题详解2 某知名社交平台软件工程师笔试题真题详解3 某知名安全软件服务提供商软件工程师笔试题真题详解4 某知名互联网金融企业软件工程师笔试题真题详解5 某知名搜索引擎提供商软件工程师笔试题真题详解6 某初创公司软件工程师笔试题真题详解7 某知名游戏软件开发公司软件工程师笔试题真题详解8 某知名电子商务公司软件工程师笔试题真题详解9 某顶级生活消费类网站软件工程师笔试题真题详解10 某知名门户网站软件工程师笔试题真题详解11 某知名互联网金融企业软件工程师笔试题真题详解12 国内某知名网络设备提供商软件工程师笔试题真题详解13 国内某顶级手机制造商软件工程师笔试题真题详解14 某顶级大数据综合服务提供商软件工程师笔试题真题详解15 某著名社交类上市公司软件工程师笔试题真题详解16 某知名互联网公司软件工程师笔试题真题详解17 某知名网络安全公司校园招聘技术类笔试题真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题

资料整理不易,点个关注再走吧

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长! 3 国内某顶级手机制造商软件工程师笔试题

真题详解14 某顶级大数据综合服务提供商软件工程师笔试题真题详解15 某著名社交类上市公司软件工程师笔试题真题详解16 某知名互联网公司软件工程师笔试题真题详解17 某知名网络安全公司校园招聘技术类笔试题真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题

[外链图片转存中…(img-hFnz3zqx-1713077215866)]

资料整理不易,点个关注再走吧

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java) [外链图片转存中…(img-D8B4gz42-1713077215866)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

参考阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。