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

news2024/11/22 7:38:06

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.coloradmin.cn/o/2245191.html

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

相关文章

EventListener与EventBus

EventListener JDK JDK1.1开始就提供EventListener&#xff0c;一个标记接口&#xff0c;源码如下&#xff1a; /*** A tagging interface that all event listener interfaces must extend.*/ public interface EventListener { }JDK提供的java.util.EventObject&#xff1…

优先级队列PriorityQueue(堆)

1. 优先级队列 队列是一种先进先出的数据结构,而如果我们操作的数据带有优先级,我们出队的时候就会先出队优先级最高的元素.比如打游戏的时候有人给你打电话,操作系统看来有俩个进程,优先会处理打电话. 主要功能 1> 返回最高优先级对象 2> 添加新的对象 2. 堆的概念 2.1 …

【AI】人工智能报告解读——中国人工智能的发展

自 2016 年 AlphaGo 与世界顶级围棋选手对战后&#xff0c;AI 概念和技术从此走入大众视野。2017 年&#xff0c;国务院颁布《新一代人工智能发展规划》&#xff0c;这是中国在人工智能领域第一个部署文件&#xff0c;确定了人工智能产业发展的总体思路、战略目标和任务。技术和…

Flutter:photo_view图片预览功能

导入SDK photo_view: ^0.15.0单张图片预览&#xff0c;支持放大缩小 import package:flutter/material.dart; import package:photo_view/photo_view.dart;... ...class _MyHomePageState extends State<MyHomePage>{overrideWidget build(BuildContext context) {return…

uni-app 修改复选框checkbox选中后背景和字体颜色

编写css&#xff08;注意&#xff1a;这个样式必须写在App.vue里&#xff09; /* 复选框 */ /* 复选框-圆角 */ checkbox.checkbox-round .wx-checkbox-input, checkbox.checkbox-round .uni-checkbox-input {border-radius: 100rpx; } /* 复选框-背景颜色 */ checkbox.checkb…

c++中mystring运算符重载

#include <iostream> #include <cstring>using namespace std;class mystring {char* buf; public:mystring(); //构造函数mystring(const char * str); //构造函数mystring(const mystring& str); //深拷贝函数void show(); //输出函数void setmystr(const my…

oracle数据恢复—通过拼接数据库碎片的方式恢复Oracle数据的案例

Oracle数据库故障&#xff1a; 存储掉盘超过上限&#xff0c;lun无法识别。管理员重组存储的位图信息并导出lun&#xff0c;发现linux操作系统上部署的oracle数据库中有上百个数据文件的大小变为0kb。数据库的大小缩水了80%以上。 取出&并分析oracle数据库的控制文件。重组…

SpringBoot中小企业人事管理系统:设计模式

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;中小企业人事管理系统当然也不能排除在外。中小企业人事管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理和…

git分支合并某一次提交

1.A分支&#xff1a;使用git log --oneline查看需要合并的id 或者直接去Git仓库查看提交记录 2.B分支&#xff1a;git cherry-pick id 合并A分支的请求

NFS文件服务器

持久化存储&#xff1a;NFS 1 NFS 工作原理 NFS&#xff08;Network File System&#xff09;是一种分布式文件系统协议&#xff0c;它允许用户在网络上通过一个网络共享访问文件&#xff0c;就如同访问本地存储一样。NFS 工作时&#xff0c;服务端将文件系统中的一个或多个目…

Springboot 整合 Java DL4J 搭建智能问答系统

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

Android kotlin之配置kapt编译器插件

配置项目目录下的gradle/libs.versions.toml文件&#xff0c;添加kapt配置项&#xff1a; 在模块目录下build.gradle.kt中增加 plugins {alias(libs.plugins.android.application)alias(libs.plugins.jetbrains.kotlin.android)// 增加该行alias(libs.plugins.jetbrains.kotl…

设计模式:4、命令模式(双重委托)

目录 0、定义 1、命令模式包括四种角色 2、命令模式的UML类图 3、代码示例 0、定义 将一个请求封装为一个对象&#xff0c;从而使用户可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 1、命令模式包括四种角色 接…

详细教程-Linux上安装单机版的Hadoop

1、上传Hadoop安装包至linux并解压 tar -zxvf hadoop-2.6.0-cdh5.15.2.tar.gz 安装包&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1u59OLTJctKmm9YVWr_F-Cg 提取码&#xff1a;0pfj 2、配置免密码登录 生成秘钥&#xff1a; ssh-keygen -t rsa -P 将秘钥写入认…

短剧系统小程序开发产品设计实例解析

短剧系统小程序开发架构深度解析引言 随着数字娱乐市场的蓬勃发展&#xff0c;短剧因其紧凑的情节、创新的表现形式和便捷的观看体验&#xff0c;迅速吸引了大量观众的关注。作为承载短剧内容的重要平台&#xff0c;短剧系统小程序不仅需要在用户体验、内容管理等方面做到极致&…

STM32--JLINK下载问题记录

1.下载提示&#xff1a; 现象&#xff1a;keil下载&#xff0c;会提示如上信息&#xff1b; 使用segger jflash可以连接成功&#xff0c;但是下载程序会失败&#xff1b; 解决过程&#xff1a;尝试一边复位一边下载程序&#xff0c;一直失败&#xff1b;STM32CubeProgrammer也…

推荐算法(基于用户/物品的协同过滤算法)

1.1 推荐算法概述 信息过载的时代。信息消费者面临的问题是如何收集到自己感兴趣的信息。对于信息生产者来说&#xff0c;高效地把信息推送给感兴趣的信息消费者&#xff0c;而不是淹没在信息互联网的海洋之中&#xff0c;也非常困难。 如何从大量的数据信息中获取有价值的信息…

【PCIE常见面试问题-1】

PCIE常见面试问题-1 1 PCIE概述1.1 PCI为何发展开PCIE&#xff1f;1.2 什么是Root Complex(RC)1.3 什么是EP&#xff1f;1.4 什么是Swith1.5 PCIE协议如何组织通信的&#xff1f;1.6 简要介绍一下PCIE的分层结构&#xff0c;为什么需要分层&#xff1f;1.7 PCIE的事务类型有哪些…

Easyexcel(5-自定义列宽)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09;Easyexcel&#xff08;4-模板文件&#xff09;Easyexcel&#xff08;5-自定义列宽&#xff09; 注解 ColumnWidth Data…

C++进阶:哈希表实现

目录 一:哈希表的概念 1.1直接定址法 1.2哈希冲突 1.3负载因子 1.4实现哈希函数的方法 1.4.1除法散列法/除留余数法 1.4.2乘法散列法 1.4.3全域散列法 1.5处理哈希冲突 1.5.1开放地址法 线性探测 二次探测 ​编辑 双重散列 1.5.2链地址法 二.代码实现 2.1开放地址…