using Hangfire.Common;
using Hangfire.SqlServer;
using Hangfire;
using System.Configuration;
using System.Data;
using System.Windows;
using System.Data.SqlClient;
using System;
using Hangfire.Server;
using Autofac;
using System.IO;
using System.Reflection;
using System.Collections.ObjectModel;
using Microsoft.Extensions.Hosting;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Logging;
namespace WpfApp4
{
///
/// Interaction logic for App.xaml
///
public partial class App : Application
{
private BackgroundJobServer _backgroundJobServer;
//private IContainer _container;
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
#region 动态加载插件需要
//var startup = new Startup();
//_container = startup.ConfigureContainer();
//// 启动Hangfire服务器
//startup.StartHangfireServer(_container);
#endregion
// 配置 Hangfire
ConfigureHangfire();
// 启动作业服务器
StartHangfireServer();
BuilderHost();
}
#region 动态加载插件需要
//protected override void OnExit(ExitEventArgs e)
//{
// // 应用程序关闭时停止 Hangfire 服务器
// _container?.Dispose();
// base.OnExit(e);
//}
#endregion
public static class HangfireConfig
{
public static string DashboardPath => ConfigurationManager.AppSettings["Hangfire:DashboardPath"] ?? "/hangfire";
public static bool RequireAuthorization => bool.Parse(ConfigurationManager.AppSettings["Hangfire:RequireAuthorization"] ?? "true");
public static int WorkerCount => int.Parse(ConfigurationManager.AppSettings["Hangfire:WorkerCount"] ?? Environment.ProcessorCount.ToString());
public static string[] Queues => (ConfigurationManager.AppSettings["Hangfire:Queues"] ?? "default").Split(',');
public static string StorageType => ConfigurationManager.AppSettings["Hangfire:Storage:Type"] ?? "SqlServer";
public static string Url => ConfigurationManager.AppSettings["Hangfire:Url"] ?? "http://localhost:58886";
public static string ConnectionString =>
ConfigurationManager.AppSettings["Hangfire:Storage:ConnectionString"] ??
ConfigurationManager.ConnectionStrings["HangfireDb"]?.ConnectionString;
}
private void BuilderHost()
{
var host = CreateHostBuilder().Build();
// 启动WebHost
host.Start();
// 应用程序退出时停止WebHost
App.Current.Exit += (s, e) => host.StopAsync();
}
public static IHostBuilder CreateHostBuilder() =>
Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseUrls("http://localhost:5645");
webBuilder.UseStartup();
});
private void ConfigureHangfire()
{
// 设置作业存储
GlobalConfiguration.Configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage(
"Server=127.0.0.1;Database=HangFire;User ID=sa;Password=1;TrustServerCertificate=True",
new SqlServerStorageOptions
{
CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
QueuePollInterval = TimeSpan.Zero,
UseRecommendedIsolationLevel = true,
DisableGlobalLocks = true
});
}
private void StartHangfireServer()
{
// 创建并启动后台作业服务器
_backgroundJobServer = new BackgroundJobServer();
}
protected override void OnExit(ExitEventArgs e)
{
// 应用程序关闭时停止 Hangfire 服务器
_backgroundJobServer?.Dispose();
base.OnExit(e);
}
}
}