xxl-job 执行结果是空_xxljob dotnet core executor执行器开源

DotXxlJob

[(github)https://github.com/xuanye/DotXxlJob][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 执行器实现,支持XXL-JOB 2.0+

1 XXL-JOB概述

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

050baf2056f303938bd7ac330f66040d.png

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中的流信息

12345678910111213141516171819202122232425262728
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上

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

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

123456789101112131415161718192021222324
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上可查看的哦

12345678910
[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 配置信息

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

123456789101112131415161718192021222324252627282930313233343536
 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


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

b5805954608569f806d3d66652694f64.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

两千内给力的大屏手机(二)

一看标题就知道哈,这是接着上次来说的呢,上次介绍了四款手机,这次介绍剩下的四款,大家看好了啊 1、HTC T329t双核 你还没有忘记新渴望 VT这款产品吧,作为HTC和移动推出的性价比大众智能产品,新渴望 VT在上市…

php5.4 windows2003,PHP实战:Windows2003下php5.4安装配置教程(IIS)

《PHP实战:Windows2003下php5.4安装配置教程(IIS)》要点:本文介绍了PHP实战:Windows2003下php5.4安装配置教程(IIS),希望对您有用。如果有疑问,可以联系我们。PHP教程一、在Windows2003安装IISPHP教程1、首先打开Windo…

foxmail 怎么把邮件格式默认为html_Python SMTP发送邮件-smtplib模块

在进入正题之前,我们需要对一些基本内容有所了解:常用的电子邮件协议有SMTP、POP3、IMAP4,它们都隶属于TCP/IP协议簇,默认状态下,分别通过TCP端口25、110和143建立连接。Python内置对SMTP的支持,该协议支持…

Arm-Linux 编译Asterisk

需要重新编译的包ncurses-5.6.tar.gzopenssl-0.9.8g.tar.gztermcap-1.3.1.tar.gz Asterisk-1.2.16没有编译通过的模块chan_alsa.so //需要alsa的支持format_ogg_vorbis.sosmsqastman

Nhibernate 过长的字符串报错 dehydration property

用nhibernate发现一个错误&#xff0c;一个文本输入框输入字符过长&#xff0c;会被在固定的地方截断&#xff0c;经过试验发现4000个字符8000个字节的时候会被截断。看了一下映射文件中的xml配置&#xff0c;发现映射字段如下&#xff1a;<property column"Content&qu…

串口与modem流量控制大全(1)

MODEM是用户接入互联网的重要设备。虽然网络干线上已经普及宽带光纤传输&#xff0c;但是在拥有庞大用户群的最后一公里路段上&#xff0c;目前最现实的接入方式还是铜线连接(电话线&#xff0c;双绞线、电缆)。另外&#xff0c;随着无线技术的发展&#xff0c;采用无线接入的固…

Qt creator工程项目移植时因环境变换造成qmake错误的解决方案

1.问题描述&#xff1a;移植从他机上的qt工程项目&#xff0c;打开时提示&#xff1a; Qt Creator找到了一个由其他开发环境创建的设置文件&#xff0c;或许是来自于其他机器的。用户设置文件包含了特定的环境设定&#xff0c;它不应当被复制到其他应用环境中去。 你仍然想载入…

leftjoin多表联合查询_leetcode-sql练习精讲系列文章——一、多表如何连接

这是一个系列文章&#xff0c;涵盖了SQL最常用的知识点。题目来自于leetcode的sql题&#xff0c;文章列出了问题-完整解析-答案-知识点拓展-BAT等大厂面试真题。希望能帮你全方位的弄懂。有问题可以留言&#xff0c;码字不易&#xff0c;写一篇要好几个小时&#xff0c;希望能得…

噪声调频 matlab,如何用matlab编写噪声调频干扰信号

2013-11-01qsort函数怎么编&#xff1f;qsort,包含在stdlib。h头文件里,函数一共四个参数,没返回值。一个典型的qsort的写法如下qsort(s,n,sizeof(s[0]),cmp);其中第一个参数是参与排序的数组名(或者也可以理解成开始排序的地址,因为可以写&s[i]这样的表达式);第二个参数是…

简明Python3教程 16.标准库

简介 python标准库作为python标准安装的一部分&#xff0c;其自身包含数量庞大的实用模块&#xff0c; 因此熟悉python标准库非常重要&#xff0c;因为很多问题都能利用python标准库快速解决。 下面我们将研究标准库中的一些常用模块。完整的标准库模块列表可以在安装python时附…

串口与modem流量控制大全(2)

PC端处理: 本端发送 当 发现&#xff08;不一定及时发现&#xff09; CTS (-3V to -15V)无效时&#xff0c;停止发送, 当 发现&#xff08;不一定及时发现&#xff09; CTS (3V to 15V)有效时&#xff0c;恢复发送&#xff1b; 本端接收 0&l…

php中的address,html中address是什么意思?(代码示例)

本篇文章主要介绍了关于address标签用法。或许有些朋友对于address标签有点陌生&#xff0c;也会产生address是什么意思的疑问&#xff0c;毕竟在我们日常建站过程中&#xff0c;很少会用到这个标签。但是俗话说&#xff0c;存在即合理。html里每一个标签都有他自己的定义和用处…

modem建链过程详述

终端 MODEM 步骤1|DTR-->| 步骤2|TXD-->| 步骤3|<--DSR| 步骤4|<--DCD| 步骤5|<--CTS| 步骤6|<--RXD| 1、由终端送DTR信号到MODEM&#xff0c;DTR信号由RS232的DTR脚送出&#xff0c;告诉MODEM终端已准备好&#xff1b; 2、终端送TXD信号到MODEM&#xf…

存储过程没有执行完后没有释放锁_面试必问---synchronized实现原理及锁升级过程你懂吗?...

synchronized实现原理及锁升级过程前言:synchronized是Java内置的机制&#xff0c;是JVM层面的&#xff0c;而Lock则是接口&#xff0c;是JDK层面的尽管最初synchronized的性能效率比较差&#xff0c;但是随着版本的升级&#xff0c;synchronized已经变得原来越强大了,本文带大…

C51存储器类型与51单片机的物理区域

1、 data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。 2、 data区内最好放局部变量。 因为局部变量的空间是可以覆盖的&#xff08;某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖&#xff09;,可以提…

嵌入式MODEM通迅技术

摘要&#xff1a; 现今&#xff0c;市面上生产的各种嵌入式Modem可通过公众电话交换网络&#xff08;PSTN&#xff09;实现数据的传输功能&#xff0c;包括标准的串行和并行的接口&#xff0c;具有同步和异步的通信数据传输格式&#xff0c;支持多种Modem标准协议——V.92、V.9…

python删除mysql数据库_python 删除mysql数据库

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

php音视频同步,视频画面和声音不同步?视频声音画面同步工具|软件

造成视频声音和画面不同步的原因&#xff0c;原因有三种&#xff1a;1、机器配置太低&#xff0c;播放高码率的视频文件容易造成不同步&#xff1b;2、片子本身就不同步&#xff1b;3、软件使用不当造成转换后的文件不同步。常见于 avi 文件和 rm/rmvb 文件。虽然我们下载的电影…

Hibernate C3P0连接池配置

本文向大家介绍Hibernate C3P0连接池&#xff0c;可能好多人还不了解Hibernate C3P0连接池&#xff0c;没有关系&#xff0c;看完本文你肯定有不少收获&#xff0c;希望本文能教会你更多东西。 Hibernate自带的连接池算法相当不成熟。 它只是为了让你快些上手&#xff0c;并不适…