博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
发布xxl-job executor dotnet core 执行器的实现
阅读量:6360 次
发布时间:2019-06-23

本文共 4242 字,大约阅读时间需要 14 分钟。

DotXxlJob

[github][https://github.com/xuanye/DotXxlJob]

xxl-job的dotnet core 执行器实现,支持XXL-JOB 2.0+

1 XXL-JOB概述

[XXL-JOB][1]是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。以下是它的架构图

架构图

2. 关于DotXxlJob产生

在工作中调研过多个任务调度平台,如Hangfire、基于Quatz.NET的第三方扩展,都与实际的需求有一点差距。 之前一直使用Hangfire,Hangfire的执行器在同步调用业务服务时,如果即时业务服务正在重新部署或者重启,有一定概率会出现死锁,导致CPU100%,后来全部调整为异步,但是这样就无法获得执行结果,这样的设计有蛮大问题,XxlJob的回调机制很好的解决了这个问题。本身如果通过http的方式调用,只要部署springbootd的一个执行器就可以解决问题,但是扩展性较差。所以萌生了实现DotNet版本的执行器的想法,为避免重复造轮子,开始之前也进行过调研,以下仓库[https://github.com/yuniansheng/xxl-job-dotnet][2]给了较大的启发,但是该库只支持1.9版本的xxljob,还有一些其他小问题,所以还是自力更生。

3. 如何使用

目前只实现了BEAN的方式,即直接实现IJobHandler调用的方式,Glue源码的方式实际上实现起来也并不复杂(有需求再说把),或者各位有需求Fork 实现一下

可参考sample

安装:

dotnet add package DotXxlJob.Core

3.1 在AspNetCore中使用

  1. 生命一个AspNet的Middleware中间件,并扩展ApplicationBuilder,本质是拦截Post请求,解析Body中的流信息
public class XxlJobExecutorMiddleware{    private readonly IServiceProvider _provider;    private readonly RequestDelegate _next;    private readonly XxlRpcServiceHandler _rpcService;    public XxlJobExecutorMiddleware(IServiceProvider provider, RequestDelegate next)    {        this._provider = provider;        this._next = next;        this._rpcService = _provider.GetRequiredService
(); } public async Task Invoke(HttpContext context) { if ("POST".Equals(context.Request.Method, StringComparison.OrdinalIgnoreCase) && "application/octet-stream".Equals(context.Request.ContentType, StringComparison.OrdinalIgnoreCase)) { var rsp = await _rpcService.HandlerAsync(context.Request.Body); context.Response.StatusCode = (int) HttpStatusCode.OK; context.Response.ContentType = "text/plain;utf-8"; await context.Response.Body.WriteAsync(rsp,0,rsp.Length); return; } await _next.Invoke(context); }}

扩展ApplicationBuilderExtensions,可根据实际情况绑定在特殊的Url Path上

public static class ApplicationBuilderExtensions{    public static IApplicationBuilder UseXxlJobExecutor(this IApplicationBuilder @this)    {       return @this.UseMiddleware
(); }}

在Startup中添加必要的引用,其中自动注册。

public class Startup{    public Startup(IConfiguration configuration)    {        Configuration = configuration;    }    private IConfiguration Configuration { get; }        public void ConfigureServices(IServiceCollection services)    {              services.AddXxlJobExecutor(Configuration);        services.AddSingleton
(); // 添加自定义的jobHandler services.AddAutoRegistry(); // 自动注册 } public void Configure(IApplicationBuilder app,IHostingEnvironment env) { //启用XxlExecutor app.UseXxlJobExecutor(); }}

编写JobHandler,继承AbstractJobHandler或者直接实现接口IJobHandler,通过context.JobLogger 记录执行过程和结果,在AdminWeb上可查看的哦

[JobHandler("demoJobHandler")]public class DemoJobHandler:AbstractJobHandler{    public override Task
Execute(JobExecuteContext context) { context.JobLogger.Log("receive demo job handler,parameter:{0}",context.JobParameter); return Task.FromResult(ReturnT.SUCCESS); }}

3.2 配置信息

管理端地址和端口是必填信息,其他根据实际情况,选择配置,配置项说明见下代码中的注释

public class XxlJobExecutorOptions{       ///     /// 管理端地址,多个以;分隔    ///     public string AdminAddresses { get; set; }    ///     /// appName自动注册时要去管理端配置一致    ///     public string AppName { get; set; } = "xxl-job-executor-dotnet";    ///     /// 自动注册时提交的地址,为空会自动获取内网地址    ///     public string SpecialBindAddress { get; set; }    ///     /// 绑定端口    ///     public int Port { get; set; }    ///     /// 是否自动注册    ///     public bool AutoRegistry { get; set; }    ///     /// 认证票据    ///     public string AccessToken { get; set; }    ///     /// 日志目录,默认为执行目录的logs子目录下,请配置绝对路径    ///     public string LogPath { get; set; } = Path.Combine(AppContext.BaseDirectory, "./logs");    ///     /// 日志保留天数    ///     public int LogRetentionDays { get; set; } = 30;}

在其他Http服务中使用

只需要实现Http请求的拦截,并判断post请求中content-Type="application/octet-stream",并使用XxlRpcServiceHandler来处理流 即可。

其他说明

XXL-JOB内置的RPC是使用Hessian协议,这个有点坑。很多都是java特有的属性和标识,比如类名什么的。在本项目中,并没有实现完整的Hessian2协议,只实现了使用到的类型,当然扩展起来也非常方便。如果有人要单独使用Hessian 这个类库的话,要特别注意这个问题。

有任何问题,可Issue反馈 ,最后感谢 xxl-job

转载于:https://www.cnblogs.com/xuanye/p/xxl-job-executor-dotnet-port.html

你可能感兴趣的文章
android 屏幕适配
查看>>
Android Activity的4种启动模式
查看>>
leetcode第一刷_Minimum Depth of Binary Tree
查看>>
pm2-webshell —— 基于浏览器的终端控制台
查看>>
Mysql基准测试
查看>>
Session 撰改演示
查看>>
【转】python3 发邮件实例(包括:文本、html、图片、附件、SSL、群邮件)
查看>>
事务隔离级别(图文详解)
查看>>
canvas系列教程08-canvas各种坑
查看>>
浅析package.json中的devdependencies 和 dependencies
查看>>
又一个 iOS 侧边栏组件: SideMenu
查看>>
vue.js 打包遇到的问题
查看>>
【译】更优秀的GraphQL官方中文文档-客户端如何使用
查看>>
git pull遇到的问题
查看>>
eclipse下maven spring项目环境配置
查看>>
无缝轮播
查看>>
CTS失败项分析(2)android.telephony.cts.VisualVoicemailServiceTest#testFilter_data
查看>>
三分钟,轻松了解Dapp
查看>>
GMQ交易平台满足不同客户群体的多种投资需求
查看>>
大数据开发如何入门你必须知道这些
查看>>