2022.5.30 面试题记录与梳理
1.SpringBoot中如何实现两个bean的先后加载顺序?
*答:通过网上查找博客,可以知道通过使用@DependsOn注解来实现。
@Configuration
public class MyConfig {
@Bean
@DependsOn("apple")
public Student student(){
System.out.println("我是student");
return new Student();
}
@Bean
public Apple apple(){
System.out.println("我是apple");
return new Apple();
}
}
2.你当时在使用RabbitMQ的时候,如何避免消息重复消费的问题?(也就是幂等性问题)
*答:如下答案供参考:
先说为什么会重复消费:正常情况下,消费者在消费消息的时候,消费完毕后,会发送一个确认消息给消息队列,消息队列就知道该消息被消费了,就会将该消息从消息队列中删除;(消费者的 消息应答机制)
但是因为网络传输等等故障,确认信息没有传送到消息队列,导致消息队列不知道自己已经消费过该消息了,再次将消息分发给其他的消费者。
解决思路是:保证消息的唯一性,就算是多次传输,不要让消息的多次消费带来影响;保证消息的 幂等性;
防止消息重复消费就是要保证消息消费幂等性,就是多次消息消费和一次结果要是一样的。
保证幂等性有很多方式:
1.可以将消息中的id作为主键插入一张数据表,消费一条就插入一条,如果是同一条消息就会报主键冲突。这是利用数据库表进行幂等性。
2.利用redis的setnx也可以进行幂等性设计,没有的话设置成功并返回1,如果有对应的id设置不成功返回0.
3.算法题:有一个超大文件,里面都是int型数字并且是乱序排序。现有一个jvm,它的堆内存远小于这个超大文件。问如何在jvm这个小空间内找到这个超大文件中的数字数值倒序排序
的前一百位。
我的回答:使用最大堆,将其大小初始化为100。然后将文件切割成一个个小文件,依次读到内存中,然后将其放入最大堆中,当文件都读完时,也相当于就找出了这所要找的前100个数字了。
4.Redis中的哈希结构中的key是不能设置单个key过期(真的吗?)的,问如何通过各种方式(比如java代码)来实现key能够过期?
5.对mq的集群架构,集群部署有了解吗?
没有。待梳理。
6.对Spring中的事务,@Transactional有了解吗?
1)事务的的传播行为,默认是什么?
答:如果当前有事务就加入,如果当前没有事务则创建一个新事务。
2-1)假设现在有一个A类,一个B类,A中有aMethod,B中有bMethod,且这两个方法都有打上@Transactional注解,那么如果从aMethod中调用bMethod,bMethod中的
注解会失效吗?
2-2)假设现在只有一个A类,A中有aMethod,A中还有bMethod,且这两个方法都有打上@Transactional注解,那么如果从aMethod中调用bMethod,bMethod中的
注解会失效吗?
7.(1)假设现在有一个数据库,里面有3张表:企业表,部门表和员工表。并且在java代码层面都有提供的相应的增删改查接口(针对单张表的)。那么现在我要通过一个自定义注解,
实现说在项目运行时,每当调用到上面的crud接口时,能够实时在日志中打印相应的记录信息(比如:需要能够显示是对哪张表的哪条记录操作)。那么应该怎么做?
7.(2)在(1)的基础上,假设那三张表都有一个表示【名称】的字段,并且在相应表的中的英文字段名称是不一样的,那我这时候要求在日志中,也要能打印出不同表的字段名称,那么应该
怎么做?提示:在自定义注解里面加入函数式接口。(具体的,自己可以尝试去做。( ))
我的延伸问题:如何做自定义注解并实现上面所说的所有功能?尝试一下,吃透它。
8.网络基础:在tcp中要进行证书校验,要在三次握手四次挥手中的哪个环节进行加入?

浙公网安备 33010602011771号