自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 mysql踩坑

会变成 23:59:59.999,如果数据库列的数据类型是datetime,mysql会自动舍入变成第二天的00.00.00,导致查询检测到时间段冲突不能出下一个账单周期的帐。头都想秃了也不知道为什么。账单模块需求结束时间是23.59.59,所以使用了Date来存时间,使用hutool来解析去单日最后一秒。

2024-10-24 17:30:15 150 1

原创 rabbitmq踩坑(1)

在排查问题时发现了Channel shutdown: channel error;一开始打算重新部署来看下会不会重新注册。最后把队列删除后重启服务成功解决问题。读取日志分析时x-dead-letter-exchange配置不一致导致的报错。开发中rabbitmq的配置文件写错了,改正后一直报错。

2024-10-21 17:47:12 485

原创 Java8 IntStream流sum的Bug

IntStream流中的sum在相加的过程中会加到突破Int上限导致数据不对,需要装成LongStream流才能有正确的输出。要这样子写,只把sum改成long是不够的。

2024-09-27 17:32:58 578

原创 JavaMail 501报错 501 ¹ÜÀíÔ±ÒÑÇ¿ÖÆ¿ªÆô΢ÐŶ¯Ì¬ÂëµÇ¼£¬ÇëµÇ¼exmail.qq.com°ó¶¨Î¢ÐÅ

这个报错是 管理员已强制开启微信动态码登录,请登录exmail.qq.com绑定微信。传过来是乱码,需要重新解码。乱码使用的是iso-8859-1编码,使用py进行解码。

2024-07-09 13:58:58 516

原创 springboot test 报错 Failed to load ApplicationContext

可以检查一下springboot版本和jdk是否匹配。另外记得@Test的包要和JUnit版本对应。这是kimi AI给得对应表。

2024-05-09 11:37:03 328

原创 springboot的启动流程

首先springboot的最经典的启动类是。

2024-04-07 19:16:06 2170 1

原创 谈谈为什么三重缓存是必要的

早期对象也就是半成品对象,spring利用半成品对象来提前暴露对象,从而解决循环依赖问题。具体可以看上一篇博客。在解决循环依赖的过程中三重缓存的作用是存放一个lamda表达式,这个表达式的作用是把半成品bean放入二层缓存。所以不改变执行顺序的前提下三层缓存不能缺少,但是如果改变逻辑,没创建一个早期对象就创建一个代理对象就可以省去一层缓存,但得不偿失,没有必要。去掉三层缓存的话,spring的bean就只能存放普通bean而不能存放代理bean了。首先,第一层缓存是必须存在的,因为它用来存放bean对象。

2024-03-22 23:30:00 360 1

原创 源码来看Spring三重缓存

getBean返回了半成品的A,调用applyPropertyValues,获得了完整的B对象。此时B也要经过上面CreateBean,doCreateBean,createBeanInstance,populateBean的流程。doCreateBean调用了createBeanInstance方法来创建实例 ,通过不同的构造策略来实例化,比如说构造器注入,或者是通过反射创建对象等等。当调用getObject方法后会调用传递进来的lamda表达式,也就是调用了createBean方法。

2024-03-20 19:53:30 705 1

原创 spring的循环依赖和三层缓存

spring的循环依赖和三层缓存(第三层后面写)

2024-03-19 23:30:00 268

原创 springbean生命周期

springbean的生命周期简单来说就是创建bean、使用bean、销毁bean。但是spring为了框架的拓展性,添加了更多的步骤。

2024-03-17 20:00:00 2288 1

原创 spring的bean创建(一)

最重要的实现类是ApplicationContext ,可以通过ApplicationContext 直接操作容器,比如通过getBean方法直接使用name获取指定的Bean。spring把不同文件定义的bean转换成相同的BeanDefinition,所以设计了一个BeanDefinitionReader接口,只要实现loadBeanDefinitions方法就可以把定义的bean转化成BeanDefinition。键是bean的名字,值是bean对象。

2024-03-14 19:28:52 975 1

原创 从源码了解zookeeper的会话机制

会话也就是session。zookeeper的接口sessionImpl定义了三个属性sessionId session的唯一标识符timeout session的过期时间isClosing session的关闭状态服务端使用SessionTracker来管理session他将session按照过期的时间点放入不同的桶,这样每次只要访问一个桶就可以清除过期session了。所有可能过期的session都在一个桶里。因此zookeeper的session并不是过期则丢弃的,是定时进行清理。

2024-03-12 19:40:36 449 1

原创 zookeeper数据同步源码

leader读取数据包,并从数据包中获取sid和旧的epoch来构建新的epoch并发送,等待follower的回复,ia.readRecord(ackEpochPacket, "packet");如果follower的zxid大于leader,选择TRUNC模式,发送leader最新的commitedLog来让follower回滚。readPacket(qp),从leader发送的信息里获取新的epoch,zxid,myid。向leader发送数据包,包含自己的epoch,zxid,myid。

2024-03-10 08:00:00 415 1

原创 zookeeper的ZAB协议

强一致性,不管你什么是读取哪一台服务器的数据,每一次读取的数据都是一样的,就算有一台服务器的数据发生了改变,他们读取的数据也是一致的。3、其余节点会向leader发送确认信息,确认自己收到了请求如果leader收到的请求大于一半leader才会提交这个更新。4、当一个节点启动后,他会寻找leader,接收leader发送的数据快照,通过日志的形式恢复数据。1、需要有一个leader领导角色,只有leader能接受写请求,leader会把写请求顺序执行。leader生产一个日志,zxid+1,并持久化。

2024-03-07 19:59:21 369

原创 zookeeper的序列化方法

Serializable中没有进行任何操作,仅仅表示这个类需要序列化,在进行网络传输时,当你使用ObjectOutputStream.writeObject时,writeObject会通过反射获取类结构,并把对象转变成字节流。其中二进制最好用,性能高,占用小,但是不同操作系统下大端小端的存储问题使得不一定能跨平台使用。实现serialize(序列化),deserialize(反序列化),自己实现序列化逻辑。在工作中最常用的序列化格式是JSON,JSON可以跨平台跨语言传输。以DataNode为例。

2024-03-06 19:45:34 345 1

原创 从源码了解Curator的InterProcessMutex

昨天自己写了基于zookeeper的分布式锁,发现会有死锁的问题出现。今天来学习Curator的InterProcessMutex了解怎么解决死锁

2024-03-05 23:30:00 414

原创 zookeeper实现分布式锁

zookeeper提供了分布式环境下的一致性解决方案。借此我们可以实现分布式锁,而zookeeper实现的分布式锁可以有两种形式。

2024-03-04 23:45:00 574 1

原创 从源码了解zookeeper的选举机制

并拿自己的epoch,zxid,myid和投票中的信息对比,对比优先级为epoch>zxid>myid。如果投票信息大于我的信息就用投票信息更新选票,否则使用我的信息更新选票。如果收到的投票的服务器状态是looking,当它的epoch大于我的逻辑时钟说明我丢失了几次选举,之前所有的投票结果作废,清空recvset,如果是同一个epoch的选票放入recvset中,并检查是否超过一半人数,如果超过,并且leader有效,就返回他的选票。如果二者相等,用我推选的leader和投票信息对比,并更新选票。

2024-03-03 14:14:38 389 1

原创 从源码了解zookeeper的选票消息发送机制

执行listener的run方法,实例化了listenerHandlers并调用了submit方法,既run方法,调用路线run->acceptConnections->receiveConnection->handleConnection。这段代码new了一个CnxnManger对象,该对象负责选举中的所有通信,它有一个内部类Listener用于监听所有通信的socket,Listener是继承了ZooKeeperThread。当接受的myid大于自己的myid时开启接受线程和发送线程。

2024-03-02 12:58:04 384 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除