Quartz-ClassCastException
问题项目中使用Quartz的时候,使用 jobDataMap中放入一个对象
12ScheduleJobEntity scheduleJob;jobDetail.getJobDataMap().put(ScheduleJobEntity.ENTITY_PARAM_KEY, entity);
如果使用反射的方式去加载类文件创建对象
12ScheduleJobEntity entity = (ScheduleJobEntity) jobExecutionContext.getJobDetail() .getJobDataMap().get(ScheduleJobEntity.ENTITY_PARAM_KEY);
当进行强转的时候,就会抛出ClassCastException异常,当debug观察结果的时候,发现构建的对象类型也是ScheduleJobEntity类型,属性也相同,并没有发现有其他的问题。
Zookeeper简单认识
Zookeeper简单认识什么是Zookeeper?ZooKeeper 是一种分布式协调服务,用于管理大型主机。在分布式环境中协调和管理服务是一个复杂的过程。ZooKeeper 通过其简单的架构和 API 解决了这个问题。ZooKeeper 允许开发人员专注于核心应用程序逻辑,而不必担心应用程序的分布式特性。
Zookeeper的角色
Leader:领导者,核心,事务请求的唯一调度者保证事务集群处理的顺序性,集群内各个服务的调度者
Follower:跟随着,处理客户的非事务请求,事务请求则交给领导者处理,参与领导选举投票
Observer:观察者,观察Zookeeper的状态,能够独立处理非事务请求,不参与领导选举投票
Zookeeper的特性
全局数据的一致:每个 server 保存一份相同的数据副本,client 无论链接到哪个 server,展示的数据都是一致的
可靠性
顺序性
数据更新原子性
实时性:ZooKeeper 保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息
Zookeeper的好处
简单的分布式协调过程
同步
有序的信息
序列化
可靠性 ...
Java对象拷贝工具——MapStruct
分层领域模型在《Java开发手册》中,阿里巴巴对各个领域的模型都做了很详细的划分,如下:
DO(Data Object):与数据库表结构一一对应
DTO(Data Transfer Object):数据传输对象,Service或Manager向外传输的对象
BO(Business Object):业务对象,由Service层输出的对象
Query:数据查询对象
VO(View Object):显示层对象
了解了上面几种类型的划分,在工作中使用的话,避不可免的就会出现对象之间的转换。市面上有几种常见的对象转换工具库类:
Apache BeanUtils
Spring BeanUtils
Cglib BeanCopier
Dozer
orika
MapStruct
这些转换工具各有优劣,一般情况下,如果不追求性能,而且是较少使用的话,我们直接使用Spring提供的工具就可以了。如果大批量的出现复杂对象复制,可以使用Dozer,orika这种重量级的工具。 MapStruct就是属于性能好,而且用起来也不算特别麻烦的那种,相较于重量级的来说。
MapStruct
摘自官网:MapSt ...
五种网络I/O模型
Netty是网络应用框架,所以从最本质的角度来看,是对网络I/O模型的封装使用。
因此,要深刻理解Netty的高性能,也必须从网络I/O模型说起。
看完本文,可以回答这三个问题:
五种I/O模型是什么?核心区别在哪里?
同步=阻塞?异步=非阻塞?
Netty的高性能,是采用了哪种I/O模型?
掌握五种I/O模型的关键钥匙Unix系统下的五种基本I/O模型大家应该都有所耳闻,分为:
blocking I/O(同步阻塞IO,BIO)
nonblocking I/O(同步非阻塞IO,NIO)
I/O multiplexing (I/O多路复用)
signal driven I/O(信号驱动I/O)
asynchronous I/O(异步I/O,AIO)
每种I/O的特性如何,尤其是同步/非同步、阻塞/非阻塞的区别,其实很多人并不能准确地进行区分。
所以,我们先把最核心的“钥匙”告诉大家,带着这把“钥匙”再来看I/O模型的关键问题,就能手到擒来了。
当一次网络IO发生时,主要涉及到三个对象:
发起此次IO操作的Process或者Application
系统内核kernel。用户进程无 ...
优秀开源项目分享
优秀开源项目分享Java
优秀网站分享
不错的知识网站Java相关Java学习+面试指南
https://github.com/Snailclimb/JavaGuidehttps://snailclimb.gitee.io/javaguide
Spring Cloud微服务-全栈技术与案例解析
https://github.com/yinjihuan/spring-cloud
跟上 Java 8:主要讲解Java8相关
https://github.com/biezhi/learn-java8
互联网 Java 工程师进阶知识完全扫盲
https://github.com/doocs/advanced-java
运维相关Docker与Kubernetes
https://gitee.com/itmuch/docker-book
前端互联网大厂面试每日一题:涵盖前端部署、Linux技能等
https://q.shanyue.tech
其他互联网公司常用框架源码赏析
https://github.com/doocs/source-code-hunter
提问的智慧
https://github.com/ryanhanwu/How ...
Java高并发系列(一)--初识线程
线程每个任务就是一个进程,线程又是一个进程的基础,每个进程都会至少有一个线程在运行。线程又称为微进程。进程都有自己独立的空间,线程又拥有自己的局部空间及生命周期。
Java线程的生命周期线程一般拥有5个主要的生命周期:
NEW:线程的刚创建的状态,如果没有start,那么这个线程实际还是不存在的。
RUNNABLE:调用Thread的start方法之后,就进入了RUNNABLE状态,真正意思上的在JVM进程中创建了一个线程。但是,它并不会立即执行,而是处在等待CPU调度。等待状态的线程,它只会进入RUNNING状态或者意外中断进程。
RUNNING:CPU通过轮询或者其他方式获取了执行当前线程的执行权限,真正的开始执行自己的代码。一般,根据不同的情况,它会进入不同的状态。
BLOCKED:当处于运行状态的线程失去所占用资源之后,便进入阻塞状态。
TERMINATED:它是一个线程的最终状态,意味着整个生命周期的结束。线程正常结束,线程运行意外或者JVM Crash都会让线程结束
线程的创建与启动123456789101112131415161718// 简单创建一个线程public ...
Java并发工具包-Semaphore
SemaphoreSemaphore(信号量)是一个线程同步工具,主要用于在一个时刻允许多个线程对共享内容进行并行操作的场景,比如限流。它需要多个线程获取访问共享资源的许可证。
Semaphore内部处理逻辑
创建Semaphore,规定许可证数量
线程申请许可证,判断是否有许可证,没有则阻塞,有则进行执行(tryAcquire方法不会阻塞)
许可证数量减少,线程操作共享资源,操作完释放许可证
许可证数量增加,回到第二部
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748public static void main(String[] args) { LoginService loginService = new LoginService(MAX_PLAYER); // 最多只允许10个人登录,开启20个线程测试 for (int i = 0; i < 20; i++) { new Thread( ...
Java并发工具包-Exchanger
Exchanger交换器,从字面意思上理解,它就是对两个线程的数据进行交换的,通过这个工具类,简化了线程之间数据交换的成本,并且提供了数据交换点。
123456789101112131415161718// 创建字符串类型的数据交换器 final Exchanger<String> stringExchanger = new Exchanger<>();// 创建四个线程for (int i = 0; i < 4; i++) { new Thread(() -> { System.out.println(Thread.currentThread().getName() + " start"); try { TimeUnit.MILLISECONDS.sleep(20); String exchange = stringExchanger.exchange(Thread.currentThread().getName() + ...
SpringCloud系列-网关
网关在现在微服务的背景下,一个系统会有不止一个服务存在,但是像安全认证,流量控制,日志,监控这些功能是每个服务都需要的,没有一个统一的网关,我们就需要在每个系统都接入一个这样的实现,这使得我们的维护成本变得很高,所以,就出现了网关,帮我们进行统一管理
一般一个网关的功能包含:
请求转发
负载均衡: 根据每个服务的具体情况配置负载均衡策略
安全认证: 对用户请求进行安全校验
参数校验
日志记录
监控告警
流量控制
熔断降级: 实时监控请求的统计信息,达到配置的失败阀值后,自动熔断,返回默认值
响应缓存
响应聚合
灰度发布: 通过导流到不同版本实现基础的灰度发布
异常处理
协议转换
常见的网关:
netflix zuul
SpringCloud Gateway
APISIX
KONG
Gateway核心:
Route(路由): 网关的基本模块。通过一个id或是目标uri或是Predicate的集合或者filter集合定义
Filter(过滤器): 用特定工厂构建的GatewayFilter的实例
Predicate(断言): 运行匹配http请求中的任何内容,例如headers和 ...


