- 博客(170)
- 资源 (19)
- 收藏
- 关注
原创 修改amqp-client代码使其打印心跳日志
为用户提供rabbitmq与我们的系统进行交互。为了便于用户接入,提供了demo展示如何用java接入rabbitmq。使用过程中用户要求demo中要打印出心跳日志。但是经过研究发现,amqp-client这个包中貌似没有在心跳收发的过程中打印任何日志。所以需要修改amqp-client的源码并重新编译打包。本文介绍如何构建amqp-client的源码编译环境,如何修改代码。
2024-08-26 11:15:56
216
1
原创 springmvc处理http请求的底层逻辑
http-nio-8088-Poller线程中在org.apache.tomcat.util.net.NioEndpoint.Poller#run这个函数里循环检测selector,若发现有SocketEvent.OPEN_READ事件则会将SelectionKey.attachment中的内容作为入参包装成runable,然后由org.apache.tomcat.util.threads.ThreadPoolExecutor执行任务。线程池中的线程名类似为http-nio-8088-exec-2。
2024-07-29 17:28:55
306
原创 spring security + vue,登录功能
基于前后端分离实现登录功能。登录成功后后端向前端发送token,前端在浏览器中保存token,每次前端发送请求时都会在cookie中携带token。后端会根据token解析出当前发送请求的人的身份,然后进行权限校验。后端代码:https://gitee.com/forgot940629/springbootloginv2。前端代码:https://gitee.com/forgot940629/vuelogin。
2024-07-03 09:59:48
365
原创 Spring Boot登录
已知/uaa/oauth/authorize这个请求返回302,重定向到/uaa/authentication/require,/uaa/authentication/require是自己写的,然后通过HttpSecurity配置。下图可以看到/authentication/require接口和handler的位置对应关系。加断点没找到,但是找到了其重定向的那个连接/uaa/oauth/authorize。点击"登录"时触发接口/authentication/form,此接口在哪?url在哪个类中配置的?
2024-05-08 14:53:40
1155
原创 netty服务端启动流程中的任务
任务编号用途1添加ChannelInitializer,进而添加ServerBootstrapAcceptor2345
2024-04-25 09:13:02
220
原创 docker容器下部署hbase并在springboot中通过jdbc连接
在docker中搭建hbase环境,然后spring通过phoenix调用hbase
2024-03-22 17:48:59
685
原创 JavaFx踩坑
https://gitee.com/forgot940629/java-fx-demo.githttps://gitee.com/forgot940629/win-tool-demo-java-fx.git
2024-01-09 10:30:04
1680
1
原创 后端程序员开发win小工具(未完待续)
相比于命令行,可视化有两个有点,一个是便于操作,学习成本低,不用看命令行那些man文档,只要看页面就可以大致理解功能,再一个是我不会命令行软件的开发,我不清楚tail ps ls这种交互式命令行工具如何用java实现,但是我知道web页面如何实现。综上原因,我做的小工具会是个可视化的软件,而不是命令行工具。这些辅助工具通常希望能想其他软件一样在桌面系统运行,并且有一些桌面应用的基本功能(可视化页面,配置文件,日志)。因为是小工具,通常都是开发团队内部使用,发布时不会经过严格测试,所以会出现很多bug。
2024-01-08 11:25:30
823
原创 杂项1111
博客https://zhuanlan.zhihu.com/p/394509255。spring boot中配置log4j2。记录开发过程中遇到的坑。
2024-01-08 09:40:26
360
原创 netty trojan
参考代码:https://github.com/kdyzm/trojan-client-netty参考博客:github代码作者的博客:https://blog.kdyzm.cn/post/71trojan-go介绍:https://p4gefau1t.github.io/trojan-go/developer/trojan/trojan协议介绍:https://trojan-gfw.github.io/trojan/protocol。
2023-12-27 17:27:59
1112
原创 nio模拟netty
netty底层调用了nio相关功能,但是由于netty代码量较大,将nio层层封装,导致没接触过nio开发的程序员无法快速理解netty底层究竟怎样调用nio,又对nio实现了什么封装。本篇文章尽可能(水平有限,只能做到"尽可能")在不依赖netty库的前提下模拟netty对nio的调用,尽量把每一行代码在netty中的相应位置阐释出来。客户端,负责链接服务端并发送消息。未完待续,部分注解后期补充。接收服务端消息并打印。
2023-12-26 11:39:33
464
原创 [笔记]ByteBuffer垃圾回收
参考:https://blog.youkuaiyun.com/lom9357bye/article/details/133702169。
2023-12-20 17:29:27
787
原创 [笔记]dubbo发送接收
主要使用ThreadlessExecutor实现全consumer的全双工通讯。consumer创建本次请求的requestId用于将response和request匹配。然后分以下几步完成一次请求发送并接收结果:槽:发送消息前将用于接收结果的executor放到一个map中存储发送消息:调用netty发送挂起线程:等待response异步接收结果:netty线程接收到结果后唤醒之前挂起的线程。
2023-11-30 14:25:55
1108
原创 【记一次bug查询过程】invalid bound statement (not found)
本文只是一个排查过程的梳理总结,不会揭示一些构架原理Exception in thread "main" org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.jd.ads.agent.dao.account.DspAgentDao.selectById at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(Ma
2021-11-06 11:09:46
418
原创 使用火焰图分析org.apache.commons.beanutils.BeanUtils
一、Java Flight Recorder参考:https://blog.youkuaiyun.com/qq_37552993/article/details/102545780配置之后让测试程序运行五分钟,得到下面这张图二、分析耗时原因2.1 isReadable isWriteable每次copy时会对每个字段的可读性和可写性进行重复判断,而由于在复制过程中类的结构一般不会改变,所以这俩状态应该被缓存下来。结论来源:https://blog.youkuaiyun.com/u010209217/article/
2021-10-04 12:06:08
6364
原创 AQS & ReentrantLock & CountDownLatch
主要参考文章https://javadoop.com/2017/06/16/AbstractQueuedSynchronizer/首先介绍AQS基本原理,然后介绍AQS在ReentrantLock和CountDownLatch上的应用AQS概述AQS全程是AbstractQueuedSynchronizer,顾名思义是一个基于队列的同步器。底层使用LockSupport.park和LockSupport.unPark实现对线程的挂起和唤醒。如果使用了condition,情况就会稍微有些复杂.
2021-07-25 10:55:20
196
原创 zookeeper QuorumCnxManager源码解析
参考https://blog.youkuaiyun.com/a814333256/article/details/102049968数据的发送与接收概览主要涉及了四个线程,线程之间靠队列实现通讯。发送数据时WorkerSender线程从FastLeaderElection.sendqueue中读取数据,调用QuorumCnxManager#toSend将数据传递给QuorumCnxManager.queueSendMap中相应队列。SendWorker线程会循环检测QuorumCnxManager.qu.
2021-06-14 11:14:24
677
原创 netty框架分析
https://github.com/wuyinxian124/nettybook2.git使用com.phei.netty.frame.delimiter.EchoServer做实验使用这个工程时要处理一下pom的包冲突,否则调试的时候回显"alternative"之类让你选择代码的操作重点参考文章:https://segmentfault.com/a/1190000007282628一、主要对象一般来说,server有boss线程和work线程,client只有work线程。boss和wo.
2021-02-21 10:28:25
419
原创 netty boss线程的selector中的keys集合的初始化流程
https://github.com/wuyinxian124/nettybook2.git使用com.phei.netty.frame.delimiter.EchoServer做实验使用这个工程时要处理一下pom的包冲突,否则调试的时候回显"alternative"之类让你选择代码的操作pom文件见文末附件几个比较重要的方法1、io.netty.util.concurrent.ThreadPerTaskExecutor#execute创建新线程2、sun.nio.ch.WindowsSe.
2021-02-15 13:08:01
329
原创 netty 数据如何传到worker线程&handler链式调用
https://github.com/wuyinxian124/nettybook2.git使用com.phei.netty.frame.delimiter.EchoServer做实验使用这个工程时要处理一下pom的包冲突,否则调试的时候回显"alternative"之类让你选择代码的操作俩问题1、数据如何传到worker线程2、netty中如何实现多个handler链式调用数据如何传到worker线程 @Override public void read().
2021-02-13 11:29:36
509
1
原创 netty服务端启动时的线程创建
唤醒主线程时的调用堆栈notifyAll:-1, Object (java.lang)setSuccess0:501, DefaultPromise (io.netty.util.concurrent)setSuccess:389, DefaultPromise (io.netty.util.concurrent)setSuccess:76, DefaultChannelPromise (io.netty.channel)setSuccess:71, DefaultChannelPromise (
2021-02-09 11:44:04
469
转载 同步异步 阻塞非阻塞
老张爱喝茶,废话不说,煮开水。出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。1 老张把水壶放到火上,立等水开。(同步阻塞)老张觉得自己有点傻2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。3 老张把响水壶放到火上,立等水开。(异步阻塞)老张觉得这样傻等意义不大4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)老张
2021-01-23 18:23:14
104
原创 netty 接收数据 发送数据
代码如下。服务端是一个echo服务。程序中client和server都有读写操作,且两者的读写操作调用的底层结构相同。package com.tcp;import io.netty.bootstrap.Bootstrap;import io.netty.channel.*;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketChannel;import io.netty.chann
2021-01-17 11:30:11
3003
2
原创 CompletableFuture
测试代码package com.test;import java.util.concurrent.CompletableFuture;public class testFuture { public static void main(String[] args) throws Exception { CompletableFuture<Object> result = CompletableFuture.supplyAsync(testFuture::fun);
2021-01-16 10:47:29
192
原创 Tomcat类加载器调用顺序研究
网上很多资料(包括官方文档)都说有common、system这些类加载器。但是我调试源码的时候并没有看到这些类加载器。tomcat version:8.5.42本文研究两个问题。1、JAVA_HOME/lib/ext和/WebApp/WEB-INF/lib中有相同全限定类名时,加载谁的类。答:前者2、加载类的过程中classloader的大致调用过程。WebappClassLoaderBase(tomcat的)->ExtClassLoader->BootStrapClassLoader.
2021-01-10 11:00:52
916
原创 日志jar包引发的StackOverflow
问题描述在xqp上部署之后报StackOverFlow错误。根据localhost-2020-12-31.log初步判断是日志有关的jar包循环调用导致的。但是奇怪的是线上没有问题,有些xqp机器也没问题。后来在网上查阅资料发现这是由于jar加载顺序不同导致的。分析以log4j-1.2.17和log4j-over-slf4j-1.7.14这两个包为例,如果jvm先加载log4j-1.2.17后加载log4j-over-slf4j-1.7.14就不会出现递归调用,也不会出现StackOverflow。反
2021-01-02 11:12:44
580
2
原创 netty Recycler(四) 多线程回收对象时竞争机制的解决
假设线程1创建了大量对象,线程2和线程3同时回收线程1的对象,当这两个线程第一次回收对象时会创建WeakOrderQueue,并将其添加到线程1的Stack。多个线程操控一个Stack,这就造成了竞争。那么netty是如何解决竞争?代码package study.recycler.again;import io.netty.util.Recycler;import java.util.concurrent.ConcurrentLinkedQueue;/** * 断点2 主线程回收池中会有大
2020-12-16 08:46:20
407
1
原创 netty Recycler(三)WeakOrderQueue unreachable
由于线上问题是由大量的WeakOrderQueue$Link对象引起的,而这些对象都是unreachable,为了研究线上问题的原因,尝试重新构建出WeakOrderQueue$Link的unreachable。目前已构建出WeakOrderQueue的unreachable(有些成员变量是私有的,不好获取,目前只能获取到WeakOrderQueue层次。以后通过反射的方法应该可以获取到Link)。package study.recycler.again;import io.netty.util..
2020-12-13 11:32:43
471
原创 netty Recycler(二)——WeakOrderQueue和Stack
之前一直搞不清楚WeakOrderQueue的用途,“将别的线程的对象回收到本线程"还是"将别的线程的对象回收到别的线程”(前者是对的)。所以研究了一下package study.recycler.again;import io.netty.util.Recycler;import java.util.concurrent.ConcurrentLinkedQueue;public class CycliMutiThread { private static final Recycl.
2020-12-12 18:56:53
530
1
原创 dubbo rpc NettyClient连接
consumer获取channelNettyChannel.CHANNEL_MAP(静态变量)中存储着channel。/** * the cache for netty channel and dubbo channel */ private static final ConcurrentMap<Channel, NettyChannel> CHANNEL_MAP = new ConcurrentHashMap<Channel, NettyChannel&g
2020-12-06 12:21:18
493
原创 dubbo rpc consumer 发送数据
write:1391, DefaultChannelPipeline$HeadContext (io.netty.channel)//调用了io.netty.channel.Channel#Unsafe中的write方法,NettyClientWorker-4-1这个线程中运行invokeWrite0:738, AbstractChannelHandlerContext (io.netty.channel)invokeWrite:730, AbstractChannelHandlerContext (i
2020-12-06 09:22:28
181
原创 dubbo rpc consumer 接收数据
分析dubbo与netty之间通过一个BlockQueue传输数据一个是主线程([main,5,main]),通过调用threadlessExecutor.waitAndDrain()从一个LinkedBlockingQueue中获取数据。另一个是netty的线程([NettyClientWorker,优先级不知道,main]),将数据存入LinkedBlockingQueue中。主线程尝试获取数据堆栈 主线程尝试从队列中获取数据waitAndDrain:89, ThreadlessExecut
2020-12-06 08:48:59
492
原创 spring源码——事件监听器(注解方式)
代码:https://github.com/shangjianan2/NormalTechnology.gitEventListener使用定义事件需要继承ApplicationEventpackage com.ework.upms.server.event;import lombok.Getter;import lombok.Setter;import lombok.ToString;import org.springframework.context.ApplicationEvent
2020-11-29 10:34:13
519
2
原创 spring源码分析——注解
代码:https://github.com/shangjianan2/NormalTechnology.git自定义注解定义注解package com.ework.upms.server.annotation;import java.lang.annotation.*;@Documented@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface
2020-11-29 10:14:55
228
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人