1. 创建ZeebeClient
默认的创建方式 :
o.camunda.zeebe.client.ZeebeClient#newClient()
@Bean
public ZeebeClient zeebeClient(){
ZeebeClient zeebeClient = ZeebeClient.newClientBuilder()
//指定网关地址
.gatewayAddress(gatewayAddress)
.defaultJobTimeout(Duration.ofSeconds(10))
//指定不用鉴权
.usePlaintext()
.build();
return zeebeClient;
}
此时各项参数采用默认配置,具体配置的数值参见 io.camunda.zeebe.client.impl.ZeebeClientBuilderImpl
2.与server端的交互机制
client端通过定时任务跟server端通信,默认情况下,定时任务的线程池在创建ZeebeClient时创建
io.camunda.zeebe.client.impl.ZeebeClientImpl#buildExecutorService
2.1.JobWorker的创建
JobWorker的默认实现为 io.camunda.zeebe.client.impl.worker.JobWorkerImpl#JobWorkerImpl
JobWorkerImpl类在创建时就会启动轮询任务
其轮询间隔默认为100ms
defaultJobPollInterval = Duration.ofMillis(100);
(取自 io.camunda.zeebe.client.impl.ZeebeClientBuilderImpl#defaultJobPollInterval)
2.2限流机制:
其中 activationThreshold 取值为 Math.round(maxJobsActive * 0.3f)
0.3倍的最大jobs活跃数(该值默认为32)
jobWorkerMaxJobsActive = 32;
(取自 io.camunda.zeebe.client.impl.ZeebeClientBuilderImpl#jobWorkerMaxJobsActive)
2.3 jobWorker的核心逻辑
JobWorker的核心方法为 io.camunda.zeebe.client.impl.worker.JobWorkerImpl#poll
任务的拉取动作委托给JobPoller
该类实现了 gRpc的 StreamObserver 接口,需要实现3个接口,对应上述的handler
jobHandle对应的方法
io.camunda.zeebe.client.impl.worker.JobWorkerImpl#handleJob
注意,轮询任务、执行任务是共用的一个线程池
此处的 JobRunnableFactory 是在创建JobWorker时创建
io.camunda.zeebe.client.impl.worker.JobWorkerBuilderImpl#open
open() 方法中传入的jobHandler即为具体的方法执行逻辑,是需要我们创建各类任务的处理类,即手动接入zeebe-client时,实现 io.camunda.zeebe.client.api.worker.JobHandler,以其为入参创建一个 JobWorkerBuilderImpl 即可,可参考:
@Slf4j
@Component
public class JobHandlerRegister {
@Autowired(required = false)
private List<JobHandler> jobHandlerList;
@Autowired
private ZeebeClient zeebeClient;
private Map<String, JobWorker> jobWorkerMap = new HashMap<>();
@PostConstruct
public void registerHandler(){
if(CollectionUtils.isEmpty(jobHandlerList)){
log.warn("无有效的jobHandler");
return;
}
for(JobHandler jobHandler : jobHandlerList){
JobWorker jobWorker = zeebeClient.newWorker()
.jobType(jobHandler.getJobType())
.handler(jobHandler)
.open();
jobWorkerMap.put(jobHandler.getJobType() , jobWorker);
}
log.info("jobHandler注册成功");
}
}