开源调度平台XXL-JOB集成dubbo

开源调度平台XXL-JOB集成dubbo

    • 关于XXL-JOB
    • 为什么要集成dubbo
    • 集成步骤
    • 使用方法
    • 项目地址

关于XXL-JOB

XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。

项目github地址

平台通过部署调度中心,使用java调度框架Quartz远程调用执行器项目来完成调度任务。调度中心只用来执行调度任务,记录调度日志,具体任务通过执行器项目被调用执行。

原生平台不支持调用dubbo,原因作者已经在github上的Issues上回答了。为了尽量保持轻量,减少对zk的依赖。

为什么要集成dubbo

我们公司现在的rpc框架使用的是dubbo,对于这些我们来说,我们需要借用XXL-JOB的调度中心的来调用服务。这些服务已经通过dubbo对外提供了,为了能让调度中心使用而在对应的服务工程下添加执行器并不是我们想要的,调度中心直接调用dubbo服务才是最合理的解决方案。

集成步骤

集成dubbo考虑使用dubbo的泛化调用来实现,好处是不用事先将dubbo的消费服务配置到调度中心的配置文件中,而是通过增加XXL-JOB的任务属性,通过任务数据来描述dubbo服务。

增加任务不需要额外的开发和部署工作,而只是在调度中心里维护任务数据而已。

  1. 先对任务设置做一些小改动
    开源调度平台XXL-JOB集成dubbo_第1张图片
    新增DubboMethod和DubboVersion两个描述,数据库任务表也需对应增加。

  2. 增加zk配置
    调用dubbo服务需要有zk地址信息,这个没什么好说的。

  3. 创建新的IJobHandler,实现dubbo的泛化调用

// reference需要在handle的构造函数中初始化
// 用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口引用
GenericService genericService = 
					ReferenceConfigCache.getCache().get(reference);
if (genericService == null) {
			ReferenceConfigCache.getCache().destroy(reference);
			XxlJobLogger.log("dubbo server " + reference.getInterface() + "." + this.serviceMethod + " is not founded!");
			return new ReturnT<String>(IJobHandler.FAIL.getCode(), "dubbo server " +  this.serviceMethod + " is not founded!" );
	}

try {
		Object obj = genericService.$invoke(this.serviceMethod, types, values);
		ReturnT<String> result = new ReturnT<String>(200,"success");
		result.setContent(obj == null ? "":JSONObject.toJSONString(obj));
		return result;
	} catch (Exception e) {
		ReturnT<String> result = new ReturnT<String>(500,"fail");
		result.setContent(JSONObject.toJSONString(e));
		return result;
	}

  1. 在加载任务时候,调用dubbo服务要与其他的调用方式区分开来。
  2. 调整日志
    原生日志太疯狂了,10几个任务1天就能塞满40G。而且根据调用线程将日志分散打印,1天能生成上万个文件夹。

使用方法

使用前提是已经存在可以调用的dubbo方法。

以新增任务截图为例,依次说明。

  • 执行器 :这里写成dubbo,与原生的区分开来
  • 任务描述:略
  • 路由策略:由dubbo自己保证,这个选项没用
  • cron:略
  • 运行模式:dubbo
  • JobHandler:这里填写dubbo服务接口的全限定名
  • DubboMethod:dubbo服务的方法名
  • DubboVersion:dubbo服务的版本号
  • 阻塞处理策略:无用
  • 子任务:同原生
  • 任务超时时间:同原生
  • 失败重试次数:无用
  • 任务参数:输入特定格式字符串,前部分类型描述,后部分值描述。
    举例:test(String str,Integer i,Map c)
    对应参数:java.lang.String&java.lang.Integer&java.util.Map|hello world&111&{“code”:“ttp”}

最后:

项目地址

你可能感兴趣的:(技术,分布式调度平台,XXL-JOB,DUBBO)