自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 记一次Spring事务管理器失效

某天突然发现一直正常的事务突然有异常数据库不回滚了,就算是手动强制回滚也不行。手动做了一个测试。

2024-11-20 10:45:14 472

原创 Java反射

【代码】Java反射。

2024-11-07 22:35:15 370

原创 《重学Java设计模式》之 单例模式

单例模式主要解决的是,一个全局使用的类频繁的创建和消费,从而提升提升整体的代码的性能。

2024-11-07 14:20:04 622

原创 《重学Java设计模式》之 原型模式

原型模式主要解决的问题就是创建重复对象,而这部分对象内容本身比较复杂,生成过程可能从库或者RPC接口中获取数据的耗时较长,因此采用克隆的方式节省时间。案例:上机考试抽题,要求打乱题目、答案数据。

2024-11-07 13:48:40 438

原创 《重学Java设计模式》之 建造者模式

很多装修公司都会给出自家的套餐服务,一般有;豪华、轻奢、简约等,这些套餐的后面是不同的商品的组合。按照不同的套餐的价格选取不同的品牌组合,最终再按照装修面积给出一个整体的报价。这里模拟装修公司想推出一些套餐装修服务,按照不同的价格设定品牌选择组合,以达到使用建造者模式的过程。

2024-11-06 22:33:31 533

原创 《重学Java设计模式》之 工厂方法模式

模拟发奖多种商品。

2024-11-06 15:57:34 483

原创 Netty 组件介绍 - ByteBuf

对原始的ByteBuf进行切片成多个ButeBuf,切片后的ButeBuf拥有独立的读写指针。切片后对最大容量做了限制。Netty采用引用计数法来控制回收内存。谁是最终使用者,谁来释放ButeBuf.ByteBuf维护了两个不同的索引,一个用于读取,一个用于写入。将ByteBuf逻辑上组合到一起,避免内存复制。

2024-11-03 21:43:40 364

原创 Netty 组件介绍 - pipeline

ChannelPipeline为ChannelHandler链提供了容器,并且定义了该链上的入站和出站事件。当initChannel()被调用时,ChannelInitializer将在ChannelPipeline中安装一组自定义的ChannelHandler。他们的执行顺序就是添加顺序。

2024-11-03 17:59:26 153

原创 Netty 组件介绍 - Future & Promise

在异步处理时,经常用到这两个接口netty 中的 Future 继承 jdk 中的 FutuFuture,而Promise 又对 netty Future 进行了扩展。

2024-11-03 17:28:45 194

原创 Netty 组件介绍 - ChannelFuture

Netty中所有的IO操作都是异步的,操作可能不会马上返回结果。所以需要在之后的某个时间点确定他结果的方法。使用sync方法同步结果使用addListener(回调对象)方法异步处理结果。

2024-11-03 15:05:22 216

原创 Netty 组件介绍 - Channel

主要作用close()可以用来关闭 channelcloseFuture()用来处理 channel 的关闭 sync方法作用是同步等待 channel 关闭而 addListener 方法是异步等待 channel 关闭pipeline()方法添加处理器 write()方法将数据写入 writeAndFlush()方法将数据写入并刷出

2024-11-03 14:21:43 218

原创 Netty 组件介绍 - EventLoop

EventLoop本质是一个单线程执行器(同时维护了一个selector),一个EventLoopGroup是一组EventLoop,channel调用EventLoopGroup的register方法绑定一个EventLoop,后续这个channel的IO事件,都由此EventLoop来处理。场景:已知一个EventLoop可以绑定多个channel,假设某个EventLoop绑定了1000个channel,其中有一个channel要进行大规模的逻辑处理耗费时间长,势必会影响后续channel的处理。

2024-11-03 00:16:02 704

原创 Java NIO 【处理消息边界】

客户端和服务端约定好传输的最大长度(缺点:容易造成资源浪费)

2024-10-29 17:15:54 371

原创 uniapp实现表格的多选功能

记录一下最近在做一个的表格数据多选功能。需求大致为支持多选、支持跨分页的连续选择、支持通过查询框后手动选择数据(

2024-07-25 17:19:58 1171

原创 【设计模式——学习笔记】模板方法模式

展示了一个制作饮料的过程,说明如下。饮料的制作流程相同:煮水->酿造->倒入容器->添加调味品但不同饮料的酿造喝调味品有所区别spring中的bean的依赖注入。

2024-07-23 09:49:56 571

原创 Spring Boot项目读取配置文件

例如:读取该yaml。

2024-07-10 09:12:31 234

原创 synchronized 的 monitor 机制

每个对象在 Java 中都与一个监视器锁关联。当一个线程进入同步方法或同步代码块时,它必须首先获得这个监视器锁。如果锁已经被其他线程持有,那么该线程将被阻塞,直到锁被释放。

2024-07-08 10:55:42 751

原创 Spring常见事件类型 ApplicationListener

Component@Override@Component// 在这里添加你的业务逻辑。

2024-07-08 09:46:38 365

原创 Spring事务管理下synchronized锁失效问题

执行执行到这个方法时会先开启事务,然后执行方法。执行完后释放锁,再提交事务。会存在锁已经被下一个线程拿到,但是事务还没提交的问题。也可以用分布式锁的方案。基于 jdk的动态代理,当调用使用事务注解的方法时 TransactionInterceptor 的方法拦截器会执行代理类的目标方法,触发invoke方法。例如转账,每次+10,Jmeter发送100个线程,发现数据库转账金额不对,转账add总额不为1000。

2024-07-03 14:17:30 571

原创 ReentrantReadWriteLock 读写锁特点

3、t1线程持有写锁时,t2线程无法获取读写锁。一旦某个线程持有写锁,其他线程无法同时持有读锁或写锁。2、t1线程持有读锁时,t2线程无法获取写锁。没有线程持有读锁或写锁时,线程才能获取写锁。1、多个线程可以同时持有读锁,只要没有线程持有写锁。

2024-06-07 16:35:16 170 1

原创 RabbitMQ 死信队列

(basic.reject 或 basic.nack) 并且 requeue = false。TTL是 Time To Live 的缩写, 也就是生存时间。先启动消费者,产生交换机、队列后关闭,再启动生产者。队列满了,无法再添加数据到 MQ 中。

2024-02-20 11:19:52 440

原创 RabbitMQ 交换机 - Topics

【代码】RabbitMQ 交换机 - Topics。

2024-02-19 14:31:55 409

原创 RabbitMQ 交换机 - Direct

P是生产者,是消息的发出者。X是direct类型的交换机,它负责接收生产者的消息,并根据路由键分发消息到指定的队列。Q1和Q2是队列。Q1队列只会接收:消息路由键为orange的消息,Q2队列只会接收:消息路由键为black和green的消息。C1和C2是消费者,它们负责从队列中获取消息并消费。

2024-02-19 14:12:15 418

原创 RabbitMQ 交换机 - Fanout

【代码】RabbitMQ 交换机 - Fanout。

2024-02-19 13:45:27 336

原创 RabbitMQ 不公平分发

在有的场景下有两个消费者在处理任务,其中有个处理任务的速度非常快,而另外一个处理速度却很慢,这个时候我们还是采用轮询分发的化就会到这处理速度快的这个消费者很大一部分时间处于空闲状态,而处理慢的那个消费者一直在干活,这种分配方式在这种情况下其实就不太好,但是 RabbitMQ 并不知道这种情况它依然很公平的进行分发。为了避免这种情况,,设置参数 channel.basicQos(1)。

2024-02-19 11:22:40 345

原创 RabbitMQ 消息应答

为了保证消息在发送过程中不丢失,引入消息应答机制,消息应答就是:消费者在接收到消息并且处理该消息之后,告诉 rabbitmq 它已经处理了,rabbitmq 可以把该消息删除了。消费者完成一个任务可能需要一段时间,如果处理消息的过程中消费者突然挂掉了,我们将丢失正在处理的消息。第一个参数是消息的标记,第二个参数表示是否应用于多消息,RabbitMQ 已知道该消息并且成功的处理消息,可以将其丢弃了。对应的消息,第二个参数是表示否应用批量应答,第三个参数表示是否。对应的消息,第二个参数表示是否。

2024-02-19 11:09:42 421

原创 RabbitMQ 轮询消费

轮询消费消息指的是轮流消费消息,每个工作队列都会获取一个消息进行消费,并且获取的次数按照顺序依次往下轮流。即为公平分发。

2024-02-19 10:25:24 584

原创 RabbitMQ 入门案例

生产者通过信道发送消息到消费者。

2024-02-19 10:05:43 350

原创 Springboot小技巧 之 CommandLineRunner

接口可以用于在需要在Spring Boot应用程序启动时执行特定逻辑的情况。比如初始化数据库、读取外部资源等。

2024-02-18 16:24:24 469

原创 经典Java面试题 x=0

1、x++的执行流程为先加载,后自增。首先将x入栈(此时入栈的x值为0),再执行自增,自增后局部变量表中x值为1。2、此时执行赋值动作(x=),将操作数栈中的值0,赋值给局部变量表中的x,故此时x值为0。下列代码执行后,输出x值为0。

2024-02-06 00:39:23 408

原创 经典Java面试题 int m = i++ + ++i +i--

1、i++:先加载后自增,首先将 i 压入操作数栈(此时i=10),入栈后,在局部变量表中将i自增,(此时i=11),此时改变的是局部变量表的数据,栈中数据并未改变。2、++i:先自增,后加载,首先将局部变量表中的i自增(此时局部变量表中的i为12),在将i进行入栈(此时入栈的i值为12)。3、i--:先加载,后自减,首先将i进行入栈(此时i为12),再讲局部变量中的i自减(此时局部变量表中的i为11)。所以最终的结果为:m = 12+10+12=34, i = 11。

2024-02-06 00:15:27 452

原创 JVM 直接内存和堆内存

无需手动在 finally 块中关闭。这是 try-with-resources 语句的一大优点,可以避免手动关闭流可能导致的错误或遗漏。直接内存案例中使用 try-with-resources 语句时,流会在代码块执行完毕后。直接内存不受JVM管理,可使用Unsafe进行释放。最终直接内存比非直接内存速度快一倍。

2024-02-02 14:58:01 583

原创 JVM 01【栈、堆】

一般Java程序中堆内存是空间最大的一块内存区域。创建出来的对象都存在于堆上。栈上的局部变量表中,可以存放堆上对象的引用。静态变量也可以存放堆对象的引用,通过静态变量就可以实 现对象在线程之间共享。

2024-02-02 11:38:26 411

原创 Java、JSON序列化和反序列化

【代码】Java、JSON序列化和反序列化。

2024-02-01 16:58:29 451

原创 Netty 08【连接假死现象解决】

是 Netty 提供的一个用于处理连接空闲状态的处理器。当连接在一定时间内没有进行读、写或者读写操作时,IdleStateHandler。将触发相应的事件,可以通过重写 userEventTriggered。方法来处理这些事件。

2024-02-01 16:09:26 961

原创 交互式消息卡片的配置和使用

当前处理人点击「跟进处理」button之后,会将卡片的 value属性的deal-true发送到回调URL,可以自定义替换这里的deal-true为任意的key-value;消息卡片的回调地址需要是一个外网可访问的服务端地址,并且按照图示的要求完成了challenge验证可以成功保存。content参数的基础格式为(同样是个需要转义的JSON字符串类型):"content":""有了前置条件之后,就可以进行消息卡片的搭建(下面提及到的卡片code都是提前在。或不配置),「立即更新」只会更新操作人的卡片。

2024-02-01 12:59:18 1604

原创 Java 基于Netty客户端 07【HTTP服务器】

【代码】Java 基于Netty客户端 07【HTTP服务器】

2024-02-01 09:14:18 430

原创 Java 基于Netty 【粘包和拆包解决方案-行解码器】

在Netty中,处理粘包和半包问题通常使用来解决。文本协议中的每行数据以换行符作为结束符。LineBasedFrameDecoder会按照换行符对接收到的数据进行拆分,每一行数据作为一个完整的帧传递给后续的处理器进行处理。这样可以有效地解决粘包和半包问题,确保每个帧都是完整的数据。

2024-01-31 15:26:37 496

原创 IO流示例

【代码】IO流示例。

2024-01-31 14:27:30 400

原创 Java 基于Netty 【粘包和拆包解决方案-定长解码器】

是Netty提供的用于解决粘包和拆包问题的一种解决方案,它会按照固定的长度对接收到的数据进行拆分,从而保证每个消息的长度是固定的,不会出现粘包和拆包的情况。每次连接处理完后手动关闭服务端使用FixedLengthFrameDecoder来按照固定长度 将收到的信息进行解码。

2024-01-31 13:26:14 526

空空如也

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

TA关注的人

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