欢迎访问 生活随笔!

凯发ag旗舰厅登录网址下载

当前位置: 凯发ag旗舰厅登录网址下载 > 编程语言 > >内容正文

asp.net

基于 abp vnext 和 .net core 开发博客项目 -凯发ag旗舰厅登录网址下载

发布时间:2025/1/21 17 豆豆
凯发ag旗舰厅登录网址下载 收集整理的这篇文章主要介绍了 基于 abp vnext 和 .net core 开发博客项目 - 集成hangfire实现定时任务处理 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

基于 abp vnext 和 .net core 开发博客项目 - 集成hangfire实现定时任务处理
转载于:https://github.com/meowv/blog
接下来,将完成一个任务调度中心,关于定时任务有多种处理方式,如果你的需求比较简单,比如就是单纯的过多少时间循环执行某个操作,可以直接使用.net core中内置的实现方式,新建一个类继承backgroundservice,实现executeasync()既可。

看一个例子,我们每过一秒输出一句helloworld,并写入日志中。

在.backgroundjobs中新建一个jobs文件夹,添加helloworldjob.cs,并且继承自backgroundservice。

//helloworldjob.cs
using log4net;
using microsoft.extensions.hosting;
using system;
using system.threading;
using system.threading.tasks;

namespace meowv.blog.backgroundjobs.jobs
{
public class helloworldjob : backgroundservice
{
private readonly ilog _log;

public helloworldjob(){_log = logmanager.getlogger(typeof(helloworldjob));}protected override async task executeasync(cancellationtoken stoppingtoken){while (!stoppingtoken.iscancellationrequested){var msg = $"currenttime:{ datetime.now}, hello world!";console.writeline(msg);_log.info(msg);await task.delay(1000, stoppingtoken);}} }

}
然后在.httpapi.hosting层模块类中的configureservices()注入context.services.addtransient();使用,运行一下看看效果。

图片

可以看到已经成功输出了,你可以在executeasync()中做你的事件处理逻辑。这应该是最简单后台定时任务处理了,比较单一。

在abp框架中,官方给我们提供了许多后台工作的集成方式,有兴趣的可以自行研究一下,文档地址:https://docs.abp.io/zh-hans/abp/latest/background-jobs

在本项目中,我将使用 hangfire 来完成定时任务处理,为什么选择它呢?因为简单,开箱即用。下面进入正题,可以先将 helloworldjob 停掉。

在.backgroundjobs中添加nuget包:volo.abp.backgroundjobs.hangfire、hangfire.mysql.core、hangfire.dashboard.basicauthorization、volo.abp.aspnetcore,然后添加项目引用:.domain。

在根目录新建模块类:meowvblogbackgroundjobsmodule.cs,继承abpmodule,依赖abpbackgroundjobshangfiremodule。

//meowvblogbackgroundjobsmodule.cs
using hangfire;
using hangfire.mysql.core;
using meowv.blog.domain.configurations;
using meowv.blog.domain.shared;
using volo.abp;
using volo.abp.backgroundjobs.hangfire;
using volo.abp.modularity;

namespace meowv.blog.backgroundjobs
{
[dependson(typeof(abpbackgroundjobshangfiremodule))]
public class meowvblogbackgroundjobsmodule : abpmodule
{
public override void configureservices(serviceconfigurationcontext context)
{
context.services.addhangfire(config =>
{
config.usestorage(
new mysqlstorage(appsettings.connectionstrings,
new mysqlstorageoptions
{
tableprefix = meowvblogconsts.dbtableprefix “hangfire”
}));
});
}

public override void onapplicationinitialization(applicationinitializationcontext context){var app = context.getapplicationbuilder();app.usehangfireserver();app.usehangfiredashboard();} }

}
在configureservices()中添加配置,因为之前选用了mysql,所以这里引用了hangfire.mysql.core这个包,相对于的其它数据库可以在nuget上寻找。

在new mysqlstorage()中配置连接字符串,new mysqlstorageoptions()中配置表前缀,hangfire会在第一次运行时,自动为我们创建表。

然后在onapplicationinitialization()中进行使用,app.usehangfireserver()必须调用,如果你不需要界面显示可以不用app.usehangfiredashboard();

最后不要忘记,在.httpapi.hosting层模块类中依赖定时任务模块meowvblogbackgroundjobsmodule。

现在运行一下项目,打开地址:…/hangfire 看看。

图片

数据库默认已经为我们创建了hangfire所需的表。

图片

有一个地方要注意,就是在连接字符串中需要开启用户变量,修改一下appsettings.json中的连接字符串,在末尾添加:allow user variables=true。

同时在app.usehangfiredashboard()中,还支持很多配置项,现在我们这个定时任务是公开的,如果我们不想要外人访问,可以开启basicauth。

现在配置文件中配置hangfire的登录账号和密码。


“hangfire”: {
“login”: “meowv”,
“password”: “123456”
}


///
/// hangfire
///
public static class hangfire
{
public static string login => _config[“hangfire:login”];

public static string password => _config["hangfire:password"];

}

开启方式也很简单,之前已经引用了hangfire.dashboard.basicauthorization这个包,直接看代码。

app.usehangfiredashboard(options: new dashboardoptions
{
authorization = new[]
{
new basicauthauthorizationfilter(new basicauthauthorizationfilteroptions
{
requiressl = false,
sslredirect = false,
logincasesensitive = true,
users = new []
{
new basicauthauthorizationuser
{
login = appsettings.hangfire.login,
passwordclear = appsettings.hangfire.password
}
}
})
},
dashboardtitle = “任务调度中心”
});
app.usehangfiredashboard()中可以自定义访问路径,我们这里没有传,就是用默认值。自定义界面的标题title等等。更多参数可以自己看dashboardoptions,结合情况来使用,编译运行看看效果。

图片

现在就需要输入我们配置的账号密码才可以进入hangfire界面了。

这样我们就集成好了hangfire,并且还有了一个可视化的界面,接下来我们同样实现一个简单的定时任务看看效果。

在jobs文件夹添加一个接口:ibackgroundjob,让他继承itransientdependency,实现依赖注入,同时定义一个方法executeasync()。

//ibackgroundjob.cs
using system.threading.tasks;
using volo.abp.dependencyinjection;

namespace meowv.blog.backgroundjobs.jobs
{
public interface ibackgroundjob : itransientdependency
{
///
/// 执行任务
///
///
task executeasync();
}
}
在jobs文件夹新建文件夹hangfire,添加hangfiretestjob.cs,继承ibackgroundjob实现executeasync()方法。

//hangfiretestjob.cs
using system;
using system.threading.tasks;

namespace meowv.blog.backgroundjobs.jobs.hangfire
{
public class hangfiretestjob : ibackgroundjob
{
public async task executeasync()
{
console.writeline(“定时任务测试”);

await task.completedtask;} }

}
这样就完成了定时任务的逻辑,我们怎么来调用呢?新建一个扩展方法meowvblogbackgroundjobsextensions.cs。

//meowvblogbackgroundjobsextensions.cs
using hangfire;
using meowv.blog.backgroundjobs.jobs.hangfire;
using microsoft.extensions.dependencyinjection;
using system;

namespace meowv.blog.backgroundjobs
{
public static class meowvblogbackgroundjobsextensions
{
public static void usehangfiretest(this iserviceprovider service)
{
var job = service.getservice();

recurringjob.addorupdate("定时任务测试", () => job.executeasync(), crontype.minute());} }

}
这里使用iserviceprovider解析服务,获取到我们的实列,所以我们可以在模块类中的onapplicationinitialization(…)中直接调用此扩展方法。

recurringjob.addorupdate()是定期作业按指定的计划触发任务,同时还有enqueue、schedule、continuejobwith等等,可以看一下hangfire官方文档:https://docs.hangfire.io/en/latest/

crontype是自定义的一个静态类,他帮我们自动生成了cron表达式,这里表示一分钟执行一次,关于不懂cron的同学,可以去自学一下,也许看看下面代码就懂了,也有许多cron表达式在线生成的工具。

*/30 * * * * /bin/python /qix/spider/spider.py #每30分钟执行一次
直接在根目录添加meowvblogcrontype.cs。

//meowvblogcrontype.cs
using hangfire;
using system;

namespace meowv.blog.backgroundjobs
{
///
/// cron类型
///
public static class crontype
{
///
/// 周期性为分钟的任务
///
/// 执行周期的间隔,默认为每分钟一次
///
public static string minute(int interval = 1)
{
return “1 0/” interval.tostring() " * * * ? ";
}

/// /// 周期性为小时的任务/// /// 第几分钟开始,默认为第一分钟/// 执行周期的间隔,默认为每小时一次/// public static string hour(int minute = 1, int interval = 1){return "1 " minute " 0/" interval.tostring() " * * ? ";}/// /// 周期性为天的任务/// /// 第几小时开始,默认从1点开始/// 第几分钟开始,默认从第1分钟开始/// 执行周期的间隔,默认为每天一次/// public static string day(int hour = 1, int minute = 1, int interval = 1){return "1 " minute.tostring() " " hour.tostring() " 1/" interval.tostring() " * ? ";}/// /// 周期性为周的任务/// /// 星期几开始,默认从星期一点开始/// 第几小时开始,默认从1点开始/// 第几分钟开始,默认从第1分钟开始/// public static string week(dayofweek dayofweek = dayofweek.monday, int hour = 1, int minute = 1){return cron.weekly(dayofweek, hour, minute);}/// /// 周期性为月的任务/// /// 几号开始,默认从一号开始/// 第几小时开始,默认从1点开始/// 第几分钟开始,默认从第1分钟开始/// public static string month(int day = 1, int hour = 1, int minute = 1){return cron.monthly(day, hour, minute);}/// /// 周期性为年的任务/// /// 几月开始,默认从一月开始/// 几号开始,默认从一号开始/// 第几小时开始,默认从1点开始/// 第几分钟开始,默认从第1分钟开始/// public static string year(int month = 1, int day = 1, int hour = 1, int minute = 1){return cron.yearly(month, day, hour, minute);} }

}
接着就可以调用定时任务了。

//meowvblogbackgroundjobsmodule.cs

public override void onapplicationinitialization(applicationinitializationcontext context)
{
var app = context.getapplicationbuilder();

var service = context.serviceprovider;

service.usehangfiretest();

}

通过context.serviceprovider可以获取到iserviceprovider,然后直接调用扩展方法,是不是超级简单,现在编译运行项目看效果。

图片

关于任务是否真的运行成功,我们可以从输出看出。

图片

完美,本篇完成了hangfire的集成,并实现了一个定时任务计划,有没有发现很简单,你学会了吗?😁😁😁

开源地址:https://github.com/meowv/blog/tree/blog_tutorial

总结

以上是凯发ag旗舰厅登录网址下载为你收集整理的基于 abp vnext 和 .net core 开发博客项目 - 集成hangfire实现定时任务处理的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发ag旗舰厅登录网址下载网站内容还不错,欢迎将凯发ag旗舰厅登录网址下载推荐给好友。

网站地图