自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 PowerJob--server端和worker端启动流程、以及通信分析

比如server端部署了两台,worker这样配置server地址:192.168.2.1:7700,192.168.2.2:7700,假设第一个节点永远正常,因为worker启动的时候,都是从第一个节点开始请求的,那么就会导致所有应用的currentServer的值都是第一个服务的ActorSystem的地址。worker刚启动的时候,也不知道server的哪个节点是正常的,所以,会从配置的第一个server的地址开始试,如果发现了一个正常的节点,后面就不会再尝试了。具体是干嘛的,现在还没看到。

2023-08-07 16:39:58 1293 1

原创 魔改xxl-job,实现延迟任务调度功能

这里主要是考虑到,如果客户端下线,到了调度时间的任务,服务端找不到一个执行节点来执行,那么任务的状态就会一直是调度中。所以,这里做个规定,超过10分钟,状态还是“调度中”的任务,需要重新复位一下,让它立马再调度一次,保证这个任务至少执行一次。客户端项目启动的时候,将Bean中标记了@XxlDelay注解的方法收集起来,封装成IJobHandler,并且以value定义的名称作为key缓存起来,方便服务端调度的时候查找。分别是:保存延迟任务,取消延迟任务和延迟任务调度成功之后,结果回写的api。

2023-07-13 15:41:32 1189 1

原创 分布式延时任务解决方案

xxl-job-plus: 通过改造xxl-job,实现分布式延迟任务的功能。调度时间精确,误差不超过1秒

2023-07-12 17:58:03 367 1

原创 XXL-JOB之任务调度全流程分析

我们分析过,客户端在启动时,会找到所有的执行器,并以执行器的名字作为key,缓存在map中,这里的loadJobHandler就是根据名字从缓存中找到对应的执行器。那么又会出现2种情况:如果新名字可以在初始化缓存中找到对应的执行器,就将原来绑定的线程终止掉,然后生成一个新的线程,重新绑定任务id和执行器,后面的任务就都用新的执行器执行了;这样做的好处是,将执行快的任务和执行慢的任务进行隔离,避免慢任务占用线程资源,拖慢执行快的任务。②线程池没法做到隔离。获取任务的信息,任务的地址,重试次数,分片信息等。

2023-07-10 15:01:11 562 1

原创 XXL-JOB之Client端启动流程分析

如果缓存了这个东西,请求到达客户端之后,就可以快速从里面找到执行器进行执行,因为JobHandler中封装了bean的类型,方法,init方法,destroy方法,这样直接通过反射就可以执行了。所以,这里要做的是,找到当前这个客户端节点的ip,并且从9999这个端口为界,先向上找到一个小于65535的没有使用的端口,如果没有,就向下找,直到找到为止,和ip拼接成一个客户端的地址。通过一个自研的注册中心,来维护服务端和客户端节点变化,直接在注册中心中获取就是最新的地址,可以自动感知变化,不需要重启。

2023-07-07 16:44:46 617 1

原创 XXL-JOB之服务端启动流程分析

就需要查询xxl-job-registry表了,这个表中存放的是各个执行器节点注册时的信息,然后通过心跳机制,不停的更新时间,所以,如果多长时间以内(3*30s)没有更新时间,就判定这个节点下线了,然后把地址重新汇总之后,存到xxl_job_group表中。如果这个新执行时间点没有超过当前时间+5s的时间点,就将这个任务放到时间轮中,然后重新在新执行时间点的基础上计算下次的执行时间,并更新表,相对于最开始的那次执行时间,存的是下下次的执行时间点。第二件事是开启时间轮,如果时间到了,就取出任务进行调度。

2023-07-06 18:32:14 476 1

原创 XXL-MQ之Consumer消息处理流程分析

我的理解是,因为consumer的上线、下线,会引起consumer的rank的波动,这样很有可能,会存在两个consumer拉到了同一条消息,所以,这里通过锁定来保证只有一个消费消息,避免出现重复消费的情况。现在明白,为啥一定要通过给topic下的每个consumer进行排序,并得到索引,其实,就是为了在拉取消息的时候,好进行人为的分片,避免消息的重复拉取消费。这样就不存在拉取相同消息的问题;3、对于消息重复消费的解决思路,我觉得很巧妙,可以好好体会一下思路,如果自己的业务中有类似的场景,可以借鉴一下。

2023-07-03 18:25:47 165 1

原创 XXL-MQ之Producer发送消息分析

至于怎么找到Broker,之前也分析过,这里传进来的address是null,所以,会通过http的方式查询到目前正常活跃的Broker的地址集,通过路由策略指定一个地址,然后调用client.asyncSend(finalAddress, xxlRpcRequest)将消息发送出去。1、里面有很多小细节,比如为什么要做代理,创建连接时的双重检查,加锁的粒度等等,都是可以运用到自己的代码中的。异步时,是直接丢到一个队列中,会有线程去取数据,然后通过代理存储到服务端的消息表中。最终都是通过代理来进行处理的。

2023-07-03 12:20:31 136 1

原创 XXL-MQ之Consumer启动流程

这里是构建代理的关键。其实这里有个小细节,配置的服务端地址是给注册中心使用的,因为注册中心是用http来调用服务端的API进行注册、发现和摘除等动作,但是客户端和服务端通信是通过netty代理来通信的,需要通过注册中心找到活跃的Broke的地址和配置的通信端口号,然后再进行连接。这里主要是创建了一个注册中心的实例,注册中心可以通过http的形式和服务端进行通信,主要执行注册和服务发现、服务摘除动作。以上这些操作就完成了代理的构建,以及Broker地址的更新,还有后面Consumer信息的更新。

2023-06-30 14:58:17 208

原创 XXL-MQ之broker启动流程分析

之前addServuce将当前XxlMqBrokerImpl实例缓存在serviceData中了,这里只需要通过客户端传过来的服务端的Broker的类型和版本,就能找到对应的XxlMqBrokerImpl执行对应的方法。客户端也是通过netty实现了一个代理,将Broker的类型、版本和需要执行的方法封装成request传给服务端,这样服务端就知道具体的执行逻辑了。而另一条线程又会不停的从registerQueue中获取数据之后,采用先更新后插入的思想,不停的更新之前注册过的Broker的时间。

2023-06-29 10:04:57 151

原创 关于在JSP页面中为什么一定要用${pageContext.request.contextPath}来获取项目路径,而不能用${request.contextPath}?

这里的疑问在于pageContext和request都是JSP中的内置对象之一,为什么不直接用${request.contextPath}来获取项目路径?出现这种疑问,其实是将JSP的内置对象和EL表达式的内置对象混淆了。JSP的9大内置对象:application:是servletContext的实例,代表JSP所属的web项目本身config:是servletConfig的实例

2018-01-07 16:31:54 3939 2

原创 一个简单的实现图片缩放的程序

import java.awt.FlowLayout;import java.awt.Graphics;import java.awt.Image;import java.awt.LayoutManager;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.a

2017-11-19 09:35:51 907

空空如也

空空如也

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

TA关注的人

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