当前位置: 首页 > article >正文

.net 8使用hangfire实现库存同步任务

C# 使用HangFire

第一章:.net Framework 4.6 WebAPI 使用Hangfire
第二章:net 8使用hangfire实现库存同步任务


文章目录

  • C# 使用HangFire
  • 前言
  • 项目源码
  • 一、项目架构
  • 二、项目服务介绍
    • HangFire服务结构解析
      • HangfireCollectionExtensions 类
      • Model
        • HangfireSettings
        • HttpAuthInfo
        • UserInfo
      • appsetting.json
      • NLog.config
      • Program.cs
    • StockChangeServers服务结构解析
      • 项目内结构
      • 结构介绍
      • 项目用到的包
      • 服务示例
        • 示例Demo
          • appsetting.config
  • 总结


前言

在第一章中我介绍了如何在.net Framework 4.6 WebAPI 中使用Hangfire,实现Hangfire定时调用我们开发的API接口,但是在实际业务中调用接口往往需要处理耗时任务,如果还像第一章中的方式去调用的话就会出现请求超时的情况。今天我就以电商系统库存同步业务为例子给大家讲解如何使用hangfire调用耗时任务。
后续我也会把项目放在CSDN上供大家下载学习。


项目源码

下载项目源码

一、项目架构

在这里插入图片描述

项目采用微服务的方式开发,分为以下两个服务:

  • HangFireServers(调用和管理后面两个服务)
  • StockChangeServers(同步库存信息至电商平台)
  • SkuServers(从电商平台拉取商品信息)

二、项目服务介绍

该服务用于定时调用库存同步服务。作为库存同步服务和商品SKU更新服务的管理。

HangFire服务结构解析

该服务中用到的包:
在这里插入图片描述

项目内结构:
在这里插入图片描述

HangfireCollectionExtensions 类

该类的主要作用是配置hangfire的监控面板 也就是这里的样式,还配置了用户的账户密码和Hangfire最大开启线程以及是否只读等信息。
在这里插入图片描述

using Hangfire;
using Hangfire.Console;
using Hangfire.Dashboard.BasicAuthorization;
using Hangfire.Heartbeat;
using Hangfire.Heartbeat.Server;
using Hangfire.HttpJob;
using Hangfire.Redis.StackExchange;
using Hangfire.Server;
using Hangfire.Tags;
using Hangfire.Tags.Redis.StackExchange;
using HangfireServers.Model;
using Microsoft.AspNetCore.Localization;
using Microsoft.Extensions.Options;
using Spring.Core.TypeConversion;
using StackExchange.Redis;

namespace HangfireServers.Extensions
{
   
    public static class HangfireCollectionExtensions
    {
   
        private const string HangfireSettingsKey = "Hangfire:HangfireSettings";
        private const string HttpJobOptionsKey = "Hangfire:HttpJobOptions";
        private const string HangfireConnectStringKey = "Hangfire:HangfireSettings:ConnectionString";
        private const string HangfireLangKey = "Hangfire:HttpJobOptions:Lang";

        public static IServiceCollection AddSelfHangfire(this IServiceCollection services, IConfiguration configuration)
        {
   
            var hangfireSettings = configuration.GetSection(HangfireSettingsKey);
            var httpJobOptions = configuration.GetSection(HttpJobOptionsKey);

            services.Configure<HangfireSettings>(hangfireSettings);
            services.Configure<HangfireHttpJobOptions>(httpJobOptions);

            services.AddTransient<IBackgroundProcess, ProcessMonitor>();

            services.AddHangfire(globalConfiguration =>
            {
   
                services.ConfigurationHangfire(configuration, globalConfiguration);
            });
            services.AddHangfireServer((provider, config) =>
            {
   
                var settings = provider.GetService<IOptions<HangfireSettings>>()?.Value;
                ConfigFromEnv(settings ?? new HangfireSettings());
                var queues = settings?.JobQueues.Select(m => m.ToLower()).Distinct().ToList();
                var workerCount = Math.Max(Environment.ProcessorCount, settings.WorkerCount); //工作线程数,当前允许的最大线程,默认20
                config.ServerName = settings.ServerName;
                config.ServerTimeout = TimeSpan.FromMinutes(4);
                config.SchedulePollingInterval = TimeSpan.FromSeconds(1);//秒级任务需要配置短点,一般任务可以配置默认时间,默认15秒
                config.ShutdownTimeout = TimeSpan.FromMinutes(30); //超时时间
                config.Queues = queues?.ToArray(); //队列
                config.WorkerCount = workerCount;
            });

            return services;
        }


        public static void ConfigurationHangfire(this IServiceCollection services, IConfiguration configuration,
            IGlobalConfiguration globalConfiguration)
        {
   
            var serverProvider = services.BuildServiceProvider();

            var langStr = configuration.GetSection(HangfireLangKey).Get<string>();
            var envLangStr = GetEnvConfig<string>("Lang");
            if (!string.IsNullOrEmpty(envLangStr)) langStr = envLangStr;
            if (!string.IsNullOrEmpty(langStr))
            {
   
                Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(langStr);
            }

            var hangfireSettings = serverProvider?.GetService<IOptions<HangfireSettings>>()?.Value;
            ConfigFromEnv(hangfireSettings??new HangfireSettings());

            var httpJobOptions = serverProvider?.GetService<IOptions<HangfireHttpJobOptions>>()?.Value;
            ConfigFromEnv(httpJobOptions??new HangfireHttpJobOptions());

http://www.kler.cn/a/405428.html

相关文章:

  • MongoDB 更新集合名
  • 神经网络10-Temporal Fusion Transformer (TFT)
  • 从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望
  • AbsPlus框架介绍2
  • Cesium 加载B3DM模型
  • 【论文速读】| RobustKV:通过键值对驱逐防御大语言模型免受越狱攻击
  • 分布式锁RedissonClient应用
  • 某车企ASW面试笔试题
  • Linux tcpdump 详解教程
  • 海盗王集成网关和商城服务端功能golang版
  • 重构代码之引入本地扩展
  • 【IOS】编译缓存错误Library/Caches/com.apple.mobile.installd.staging
  • 直流电表精准计量,为光伏产业续航
  • 2025蓝桥杯(单片机)备赛--扩展外设之UART1的原理与应用(十二)
  • 分治法的魅力:高效解决复杂问题的利器
  • 什么是axios?怎么使用axios封装Ajax?
  • 第1章 初识SpringMVC
  • 【滑动窗口】至少有k个重复字符的最长子串
  • 系统思考—跳出症状看全局
  • 【linux013】文件操作命令篇 - less 命令
  • python使用 `importlib.resources` 管理资源文件
  • FPC柔性线路板与智能生活的融合
  • 【电路笔记 TMS320F28335DSP】时钟+看门狗+相关寄存器(功能模块使能、时钟频率配置、看门狗配置)
  • Spark RDD(弹性分布式数据集)的深度理解
  • 向量数据库FAISS之五:原理(LSH、PQ、HNSW、IVF)
  • 基于深度学习的机动车驾驶重量识别预测研究思路,引入注意力,以及实验验证与性能评估