- 博客(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
原创 谈谈为什么三重缓存是必要的
早期对象也就是半成品对象,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
原创 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关注的人