日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/10 编程问答 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 xxl-job 执行结果是空_xxljob dotnet core executor执行器开源 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

DotXxlJob

[(github)https://github.com/xuanye/DotXxlJob][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 執(zhí)行器實(shí)現(xiàn),支持XXL-JOB 2.0+

1 XXL-JOB概述

[XXL-JOB][1]是一個(gè)輕量級(jí)分布式任務(wù)調(diào)度平臺(tái),其核心設(shè)計(jì)目標(biāo)是開(kāi)發(fā)迅速、學(xué)習(xí)簡(jiǎn)單、輕量級(jí)、易擴(kuò)展。現(xiàn)已開(kāi)放源代碼并接入多家公司線上產(chǎn)品線,開(kāi)箱即用。以下是它的架構(gòu)圖

2. 關(guān)于DotXxlJob產(chǎn)生

在工作中調(diào)研過(guò)多個(gè)任務(wù)調(diào)度平臺(tái),如Hangfire、基于Quatz.NET的第三方擴(kuò)展,都與實(shí)際的需求有一點(diǎn)差距。之前一直使用Hangfire,Hangfire的執(zhí)行器在同步調(diào)用業(yè)務(wù)服務(wù)時(shí),如果即時(shí)業(yè)務(wù)服務(wù)正在重新部署或者重啟,有一定概率會(huì)出現(xiàn)死鎖,導(dǎo)致CPU100%,后來(lái)全部調(diào)整為異步,但是這樣就無(wú)法獲得執(zhí)行結(jié)果,這樣的設(shè)計(jì)有蠻大問(wèn)題,XxlJob的回調(diào)機(jī)制很好的解決了這個(gè)問(wèn)題。本身如果通過(guò)http的方式調(diào)用,只要部署springbootd的一個(gè)執(zhí)行器就可以解決問(wèn)題,但是擴(kuò)展性較差。所以萌生了實(shí)現(xiàn)DotNet版本的執(zhí)行器的想法,為避免重復(fù)造輪子,開(kāi)始之前也進(jìn)行過(guò)調(diào)研,以下倉(cāng)庫(kù)[https://github.com/yuniansheng/xxl-job-dotnet][2]給了較大的啟發(fā),但是該庫(kù)只支持1.9版本的xxljob,還有一些其他小問(wèn)題,所以還是自力更生。

3. 如何使用

目前只實(shí)現(xiàn)了BEAN的方式,即直接實(shí)現(xiàn)IJobHandler調(diào)用的方式,Glue源碼的方式實(shí)際上實(shí)現(xiàn)起來(lái)也并不復(fù)雜(有需求再說(shuō)把),或者各位有需求Fork 實(shí)現(xiàn)一下

可參考sample

安裝:

dotnet add package DotXxlJob.Core

3.1 在AspNetCore中使用

  • 聲明一個(gè)AspNet的Middleware中間件,并擴(kuò)展ApplicationBuilder,本質(zhì)是攔截Post請(qǐng)求,解析Body中的流信息

  • 12345678910111213141516171819202122232425262728public 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); }}

    擴(kuò)展ApplicationBuilderExtensions,可根據(jù)實(shí)際情況綁定在特殊的Url Path上

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

    在Startup中添加必要的引用,其中自動(dòng)注冊(cè)。

    123456789101112131415161718192021222324public 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(); // 自動(dòng)注冊(cè) } public void Configure(IApplicationBuilder app,IHostingEnvironment env) { //啟用XxlExecutor app.UseXxlJobExecutor(); }}

    編寫(xiě)JobHandler,繼承AbstractJobHandler或者直接實(shí)現(xiàn)接口IJobHandler,通過(guò)context.JobLogger 記錄執(zhí)行過(guò)程和結(jié)果,在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 配置信息

    管理端地址和端口是必填信息,其他根據(jù)實(shí)際情況,選擇配置,配置項(xiàng)說(shuō)明見(jiàn)下代碼中的注釋

    123456789101112131415161718192021222324252627282930313233343536 public class XxlJobExecutorOptions{ /// /// 管理端地址,多個(gè)以;分隔 /// public string AdminAddresses { get; set; } /// /// appName自動(dòng)注冊(cè)時(shí)要去管理端配置一致 /// public string AppName { get; set; } = "xxl-job-executor-dotnet"; /// /// 自動(dòng)注冊(cè)時(shí)提交的地址,為空會(huì)自動(dòng)獲取內(nèi)網(wǎng)地址 /// public string SpecialBindAddress { get; set; } /// /// 綁定端口 /// public int Port { get; set; } /// /// 是否自動(dòng)注冊(cè) /// public bool AutoRegistry { get; set; } /// /// 認(rèn)證票據(jù) /// public string AccessToken { get; set; } /// /// 日志目錄,默認(rèn)為執(zhí)行目錄的logs子目錄下,請(qǐng)配置絕對(duì)路徑 /// public string LogPath { get; set; } = Path.Combine(AppContext.BaseDirectory, "./logs"); /// /// 日志保留天數(shù) /// public int LogRetentionDays { get; set; } = 30;}

    在其他Http服務(wù)中使用

    只需要實(shí)現(xiàn)Http請(qǐng)求的攔截,并判斷post請(qǐng)求中content-Type="application/octet-stream",并使用XxlRpcServiceHandler來(lái)處理流 即可。

    其他說(shuō)明

    XXL-JOB內(nèi)置的RPC是使用Hessian協(xié)議,這個(gè)有點(diǎn)坑。很多都是java特有的屬性和標(biāo)識(shí),比如類名什么的。在本項(xiàng)目中,并沒(méi)有實(shí)現(xiàn)完整的Hessian2協(xié)議,只實(shí)現(xiàn)了使用到的類型,當(dāng)然擴(kuò)展起來(lái)也非常方便。如果有人要單獨(dú)使用Hessian 這個(gè)類庫(kù)的話,要特別注意這個(gè)問(wèn)題。

    有任何問(wèn)題,可Issue反饋 ,最后感謝 xxl-job

    原文:https://www.cnblogs.com/xuanye/p/xxl-job-executor-dotnet-port.html


    .NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總?http://www.csharpkit.com?

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的xxl-job 执行结果是空_xxljob dotnet core executor执行器开源的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。