天天看點

HangFire任務排程執行個體(Console和MVC中)及Log4Net日志配置

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Hangfire
{
    class Program
    {
        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        static void Main(string[] args)
        {
            GlobalConfiguration.Configuration
                .UseLog4NetLogProvider()
                .UseSqlServerStorage("Data Source=localhost;User Id=sa;Password=123456;Database=DataSample;Pooling=true;Max Pool Size=5000;Min Pool Size=0;");

            Console.WriteLine("Hangfire Server started. Press any key to exit...");
            var server = new BackgroundJobServer();

            //支援基于隊列的任務處理:任務執行不是同步的,而是放到一個持久化隊列中,以便馬上把請求控制權傳回給調用者。
            var jobId = BackgroundJob.Enqueue(() => Console.WriteLine("{0}===》這是隊列任務!", DateTime.Now.ToString("HH:mm:ss")));

            //延遲任務執行:不是馬上調用方法,而是設定一個未來時間點再來執行。
            BackgroundJob.Schedule(() => Console.WriteLine("{0}===》這是延時任務!", DateTime.Now.ToString("HH:mm:ss")), TimeSpan.FromSeconds(5));

            //循環任務執行:一行代碼添加重複執行的任務,其内置了常見的時間循環模式,也可基于CRON表達式來設定複雜的模式。
            RecurringJob.AddOrUpdate(() => Console.WriteLine("{0}===》這是每分鐘執行的任務!", DateTime.Now.ToString("HH:mm:ss")), Cron.Minutely); //注意最小機關是分鐘

            //延續性任務執行:類似于.NET中的Task,可以在第一個任務執行完之後緊接着再次執行另外的任務
            BackgroundJob.ContinueWith(jobId, () => Console.WriteLine("{0}===》這是延續性任務!", DateTime.Now.ToString("HH:mm:ss")));

            Console.ReadKey();
        }

        public static void Send()
        {
            Console.WriteLine("{0}===》這是隊列事務", DateTime.Now.ToString("HH:mm:ss"));
        }
    }
}
           
<?xml version="1.0" encoding="utf-8" ?>
<!--App.config-->
<configuration>
  <configSections>
    <!--項目的 AssemblyInfo.cs檔案上加上[assembly: log4net.Config.XmlConfigurator(Watch = true)]-->
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
  </configSections>
  <log4net>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender" >
      <!--日志檔案名開頭-->
      <file value="C:\\HangFireLog\\" />
      <!--是否追加到檔案,預設為true,通常無需設定-->
      <appendToFile value="true" />
      <!--日期的格式,C:\\HangFireLog\\2016-08-08.txt,需設定-->
      <datePattern value="yyyy-MM-dd'.txt'" />
      <maxSizeRollBackups value="10" />
      <rollingStyle value="Date" />
      <!--不要使用小數,否則會一直寫入目前日志-->
      <maximumFileSize value="10MB" />
      <staticLogFileName value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%d [%t] [%-5level] : %message %newline"/>
        <!--<param name="ConversionPattern" value="記錄時間:%d{yyyy-MM-dd HH:mm:ss}  線程ID:[%thread] 日志級别:%-5level  檔案:%file  類:%logger  %message%newline%newline" />-->
      </layout>
    </appender>
    <root>
      <!--控制級别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
      <!--比如定義級别為INFO,則INFO級别向下的級别,比如DEBUG日志将不會被記錄-->
      <!--如果沒有定義LEVEL的值,則預設為DEBUG-->
      <level value="ALL" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>
  </log4net>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
</configuration>
           
//MVC中配置和使用 
public class DefaultController : Controller
{

	// GET: Default
	public ActionResult Index()
	{
	    /* 清空資料  HangFire主要資料

	    TRUNCATE TABLE HangFire.JobQueue
	    go
	    TRUNCATE TABLE HangFire.JobParameter
	    go
	    TRUNCATE TABLE HangFire.[State]
	    go
	    DELETE FROM HangFire.Job
	    go

	    */             

	    MSCL.LogHelper.WriteLog("這是測試");
	    #region HangFire任務

	    //支援基于隊列的任務處理:任務執行不是同步的,而是放到一個持久化隊列中,以便馬上把請求控制權傳回給調用者。
	    var jobId = BackgroundJob.Enqueue(() => InsertData("隊列任務"));

	    //延遲任務執行:不是馬上調用方法,而是設定一個未來時間點再來執行。
	    BackgroundJob.Schedule(() => InsertData("延時任務"), TimeSpan.FromSeconds(10));

	    //循環任務執行:一行代碼添加重複執行的任務,其内置了常見的時間循環模式,也可基于CRON表達式來設定複雜的模式。
	    RecurringJob.AddOrUpdate(() => InsertData("每分鐘執行任務"), Cron.Minutely); //注意最小機關是分鐘

	    //延續性任務執行:類似于.NET中的Task,可以在第一個任務執行完之後緊接着再次執行另外的任務
	    BackgroundJob.ContinueWith(jobId, () => InsertData("連續任務"));
	    #endregion
	    

	    return View();
	}

        public static void InsertData(string str)
        {
            TestTable model = new TestTable();
            model.D_Name = string.Format("{0}", str);
            model.D_Password = string.Format("{0}密碼", str);
            model.D_Else = string.Format("{0}其它", str);
            DataRootBase.Context.Insert<TestTable>(model);
        }
}
           
using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;
using Hangfire;

[assembly: OwinStartup(typeof(MVC_demo.Startup))]

//Startup.cs
namespace MVC_demo
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            
            GlobalConfiguration.Configuration
                .UseSqlServerStorage("Data Source=localhost;User Id=sa;Password=123456;Database=DataSample;Pooling=true;Max Pool Size=5000;Min Pool Size=0;");
            BackgroundJob.Enqueue(() => Console.WriteLine("HangFire start"));//初始化生成HangFire資料庫表
            app.UseHangfireDashboard();
            app.UseHangfireServer();
        }
    }
}
           

繼續閱讀