Quartz公共类,log4net 日志分目录 ,调度任务。
版本:Quartz 2.5 ,log4net 2.0.8
QuartzHelper
namespace Job.Common
{
public class QuartzHelper
{
private static List<IScheduler> _listsche = new List<IScheduler>();
/// <summary>
/// 时间间隔执行任务
/// </summary>
/// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
/// <param name="seconds">时间间隔(单位:毫秒)</param>
public static void ExecuteInterval<T>(int seconds) where T : IJob
{
ISchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = factory.GetScheduler(); //IJobDetail job = JobBuilder.Create<T>().WithIdentity("job1", "group1").Build();
IJobDetail job = JobBuilder.Create<T>().Build(); ITrigger trigger = TriggerBuilder.Create()
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).RepeatForever())
.Build(); _listsche.Add(scheduler);
scheduler.ScheduleJob(job, trigger);
scheduler.Start(); } /// <summary>
/// 指定时间执行任务
/// </summary>
/// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
/// <param name="cronExpression">cron表达式,即指定时间点的表达式</param>
public static void ExecuteByCron<T>(string cronExpression) where T : IJob
{
ISchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = factory.GetScheduler(); IJobDetail job = JobBuilder.Create<T>().Build(); //DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
//DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddYears(2), 3); ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
// .StartAt(startTime).EndAt(endTime)
.WithCronSchedule(cronExpression)
.StartNow()
.Build(); _listsche.Add(scheduler);
scheduler.ScheduleJob(job, trigger);
scheduler.Start(); //Thread.Sleep(TimeSpan.FromDays(2));
//scheduler.Shutdown();
} /// <summary>
/// 每隔 seconds秒 ,重复执行times次 (如:times=-1重复执行;times=0只执行一次;
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="seconds"></param>
/// <param name="times"></param>
public static void ExecuteIntervalTime<T>(int seconds, int times) where T : IJob
{
ISchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = factory.GetScheduler();
//IJobDetail job = JobBuilder.Create<T>().WithIdentity("job1", "group1").Build();
IJobDetail job = JobBuilder.Create<T>().Build(); ITrigger trigger = TriggerBuilder.Create()
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).WithRepeatCount(times))
.Build(); _listsche.Add(scheduler);
scheduler.ScheduleJob(job, trigger);
scheduler.Start();
} /// <summary>
/// 关闭所有工厂调度任务
/// </summary>
public static void ShutdownJobs()
{
try
{
if (_listsche.Count > )
{
foreach (var sched in _listsche)
{
if (!sched.IsShutdown)
{
logclass.Info(string.Format("关闭任务调度:{0}", sched.SchedulerName));
sched.Shutdown();
}
}
_listsche.Clear();
}
}
catch (Exception e)
{
logclass.Error(string.Format("关闭任务调度,出错:{0}", e), e);
}
} } public class QuartzManager<T> where T : class,IJob
{
#region 变量
private static ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); //scheduler工厂
private static String JOB_GROUP_NAME = "JOBGROUP_NAME"; //Job群组名
private static String TRIGGER_GROUP_NAME = "TRIGGERGROUP_NAME"; //触发器群组名
#endregion #region 添加,删除,修改Job方法
/// <summary>
/// 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
/// </summary>
/// <param name="pStrJobName">任务名</param>
/// <param name="pStrCronExpress">触发器表达式</param>
public static void addJob(string pStrJobName, string pStrCronExpress, IDictionary<string, object> pDictionary)
{
try
{
IScheduler sched = schedulerFactory.GetScheduler();
// 创建任务
IJobDetail job = JobBuilder.Create<T>()
.WithIdentity(pStrJobName, JOB_GROUP_NAME)
.Build(); // 创建触发器
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity(pStrJobName, TRIGGER_GROUP_NAME)
.WithCronSchedule(pStrCronExpress)
.Build(); //给任务传参数
foreach (KeyValuePair<string, object> kvp in pDictionary)
{
job.JobDataMap.Put(kvp.Key, kvp.Value);
} sched.ScheduleJob(job, trigger);
}
catch (Exception e)
{
throw new Exception(e.Message);
}
} /// <summary>
/// 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
/// </summary>
/// <param name="pStrJobName">任务名称</param>
public static void RemoveJob(string pStrJobName)
{
try
{
IScheduler sched = schedulerFactory.GetScheduler();
JobKey jobKey = new JobKey(pStrJobName);
TriggerKey triggerKey = new TriggerKey(pStrJobName, TRIGGER_GROUP_NAME);
sched.PauseTrigger(triggerKey);// 停止触发器
sched.UnscheduleJob(triggerKey);// 移除触发器
sched.DeleteJob(jobKey);// 删除任务
}
catch (Exception e)
{
throw new Exception(e.Message);
}
} /// <summary>
/// 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
/// </summary>
/// <param name="pStrJobName">任务名</param>
/// <param name="pStrCronExpress">触发器表达式</param>
public static void ModifyJobTime(string pStrJobName, string pStrCronExpress, IDictionary<string, object> pDictionary)
{
try
{
IScheduler sched = schedulerFactory.GetScheduler();
TriggerKey triggerKey = new TriggerKey(pStrJobName, TRIGGER_GROUP_NAME);
ICronTrigger trigger = (ICronTrigger)sched.GetTrigger(triggerKey);
if (trigger == null)
{
return;
}
RemoveJob(pStrJobName);
addJob(pStrJobName, pStrCronExpress, pDictionary);
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
#endregion #region 启动,关闭Job
/// <summary>
/// 启动所有定时任务
/// </summary>
public static void startJobs()
{
try
{
IScheduler sched = schedulerFactory.GetScheduler();
sched.Start();
}
catch (Exception e)
{
throw new Exception(e.Message);
}
} /// <summary>
/// 关闭所有定时任务
/// </summary>
public static void ShutdownJobs()
{
try
{
IScheduler sched = schedulerFactory.GetScheduler();
if (!sched.IsShutdown)
{
sched.Shutdown();
}
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
#endregion } }
Loghelper
namespace Job.Common
{
/// <summary>
/// 动态创建Logger工厂类
/// </summary>
public static class LogHelper
{
private static readonly ConcurrentDictionary<string, ILog> loggerContainer = new ConcurrentDictionary<string, ILog>(); private static readonly Dictionary<string, ReadParamAppender> appenderContainer = new Dictionary<string, ReadParamAppender>();
private static object lockObj = new object(); //默认配置
private const int MAX_SIZE_ROLL_BACKUPS = ;
private const string LAYOUT_PATTERN = "%d [%t] %-5p %c - %m%n";
private const string DATE_PATTERN = "yyyyMMdd/HH\".log\"";
private const string MAXIMUM_FILE_SIZE = "256MB";
private const string LEVEL = "debug"; //读取配置文件并缓存
static LogHelper()
{
IAppender[] appenders = LogManager.GetRepository().GetAppenders();
for (int i = ; i < appenders.Length; i++)
{
if (appenders[i] is ReadParamAppender)
{
ReadParamAppender appender = (ReadParamAppender)appenders[i];
if (appender.MaxSizeRollBackups == )
{
appender.MaxSizeRollBackups = MAX_SIZE_ROLL_BACKUPS;
}
if (appender.Layout != null && appender.Layout is log4net.Layout.PatternLayout)
{
appender.LayoutPattern = ((log4net.Layout.PatternLayout)appender.Layout).ConversionPattern;
}
if (string.IsNullOrEmpty(appender.LayoutPattern))
{
appender.LayoutPattern = LAYOUT_PATTERN;
}
if (string.IsNullOrEmpty(appender.DatePattern))
{
appender.DatePattern = DATE_PATTERN;
}
if (string.IsNullOrEmpty(appender.MaximumFileSize))
{
appender.MaximumFileSize = MAXIMUM_FILE_SIZE;
}
if (string.IsNullOrEmpty(appender.Level))
{
appender.Level = LEVEL;
}
lock (lockObj)
{
appenderContainer[appenders[i].Name] = appender;
}
}
}
} /// <summary>
/// 文本日志
/// </summary>
/// <param name="loggerName"></param>
/// <returns></returns>
public static ILog GetCustomLogger(string loggerName, string category = null, bool additivity = false)
{
return loggerContainer.GetOrAdd(loggerName, delegate(string name)
{
RollingFileAppender newAppender = null;
ReadParamAppender appender = null;
if (appenderContainer.ContainsKey(loggerName))
{
appender = appenderContainer[loggerName];
newAppender = GetNewFileApender(loggerName, string.IsNullOrEmpty(appender.File) ? GetFile(category, loggerName) : appender.File, appender.MaxSizeRollBackups,
appender.AppendToFile, true, appender.MaximumFileSize, RollingFileAppender.RollingMode.Composite, appender.DatePattern, appender.LayoutPattern);
}
else
{
newAppender = GetNewFileApender(loggerName, GetFile(category, loggerName), MAX_SIZE_ROLL_BACKUPS, true, false, MAXIMUM_FILE_SIZE, RollingFileAppender.RollingMode.Date,
DATE_PATTERN, LAYOUT_PATTERN);
}
log4net.Repository.Hierarchy.Hierarchy repository = (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();
Logger logger = repository.LoggerFactory.CreateLogger(repository, loggerName);
logger.Hierarchy = repository;
logger.Parent = repository.Root;
logger.Level = GetLoggerLevel(appender == null ? LEVEL : appender.Level);
logger.Additivity = additivity;
logger.AddAppender(newAppender);
logger.Repository.Configured = true;
return new LogImpl(logger);
});
} //如果没有指定文件路径则在运行路径下建立 Log\{loggerName}.txt private static string GetFile(string category, string loggerName)
{
if (string.IsNullOrEmpty(category))
{
return string.Format(@"Log\{0}\", loggerName);
}
else
{
return string.Format(@"Log\{0}\{1}\", category, loggerName);
}
} private static Level GetLoggerLevel(string level)
{
if (!string.IsNullOrEmpty(level))
{
switch (level.ToLower().Trim())
{
case "debug":
return Level.Debug; case "info":
return Level.Info; case "warn":
return Level.Warn; case "error":
return Level.Error; case "fatal":
return Level.Fatal;
}
}
return Level.Debug;
} private static RollingFileAppender GetNewFileApender(string appenderName, string file, int maxSizeRollBackups, bool appendToFile = true, bool staticLogFileName = false, string maximumFileSize = "50MB", RollingFileAppender.RollingMode rollingMode = RollingFileAppender.RollingMode.Date, string datePattern = "yyyyMMdd\".log\"", string layoutPattern = "%d [%t] %-5p %c - %m%n")
{
RollingFileAppender appender = new RollingFileAppender
{
LockingModel = new FileAppender.MinimalLock(),
Name = appenderName,
File = file,
AppendToFile = appendToFile,
MaxSizeRollBackups = maxSizeRollBackups,
MaximumFileSize = maximumFileSize,
StaticLogFileName = staticLogFileName,
RollingStyle = rollingMode,
DatePattern = datePattern,
};
PatternLayout layout = new PatternLayout(layoutPattern);
appender.Layout = layout;
layout.ActivateOptions();
appender.ActivateOptions();
return appender;
}
}
/// <summary>
/// 自定义读取配置文件的Appender
/// </summary>
public class ReadParamAppender : log4net.Appender.AppenderSkeleton
{
private string _file;
public string File
{
get { return this._file; }
set { _file = value; }
} private int _maxSizeRollBackups;
public int MaxSizeRollBackups
{
get { return this._maxSizeRollBackups; }
set { _maxSizeRollBackups = value; }
} private bool _appendToFile = true;
public bool AppendToFile
{
get { return this._appendToFile; }
set { _appendToFile = value; }
} private string _maximumFileSize;
public string MaximumFileSize
{
get { return this._maximumFileSize; }
set { _maximumFileSize = value; }
} private string _layoutPattern;
public string LayoutPattern
{
get { return this._layoutPattern; }
set { _layoutPattern = value; }
} private string _datePattern;
public string DatePattern
{
get { return this._datePattern; }
set { _datePattern = value; }
} private string _level;
public string Level
{
get { return this._level; }
set { _level = value; }
} protected override void Append(log4net.Core.LoggingEvent loggingEvent)
{
}
} }
Quartz公共类,log4net 日志分目录 ,调度任务。的更多相关文章
- 【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】
一.需求分析 日志数据在很多行业中都是非常敏感的数据,它们不能删除只能保存和查看,这样日志表就会越来越大,我们不可能永远让它无限制的增长下去,必须采取一种手段将数据分散开来.假设现在整个数据库需要保存 ...
- Log4net日志使用教程-控制台、文本、数据库三种记录方式
一.log4net简介: 1. Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的 ...
- 使用log4net日志组件经验分享
常见步骤: 第一:在项目中引用log4net组件. 第二:配置log4net,一般都写在web.config中. 第三:调用部分. 具体怎么配置,大家可以参考博客其它博友写的,这里我只写我 ...
- 第一节:框架前期准备篇之Log4Net日志详解
一. Log4Net简介 Log4net是从Java中的Log4j迁移过来的一个.Net版的开源日志框架,它的功能很强大,可以将日志分为不同的等级,以不同的格式输出到不同的存储介质中,比如:数据库.t ...
- log4net日志组件经验分享
引自log4net日志组件经验分享 我们在开发WEB项目的时候,经常会出现这样的情况:在本地调试都是正常的,但是部署到服务器上就不行了.一般出现这种情况很大一部分原因是因为服务的环境和本地不同,数据库 ...
- Log4net 日志使用介绍
概述 Log4net 有三个主要组件:loggers,appenders 和 layouts.这三个组件一起工作使得开发者能够根据信息类型和等级(Level)记录信息,以及在运行时控制信息的格式化和信 ...
- log4net日志组件
转载:http://www.cnblogs.com/knowledgesea/archive/2012/04/26/2471414.html 一.什么是log4net组件 Log4net是基于.net ...
- C#Log4net日志记录组件的使用
一.Log4Net介绍 Log4net是基于.NET开发的一款非常著名的记录日志开源组件.它通过一套XML配置的日志引擎,将日志分不同的等级,分别是:FATAL . ERROR. WARN. INFO ...
- Log4net 日志
Log4net 日志使用介绍 概述 Log4net 有三个主要组件:loggers,appenders 和 layouts.这三个组件一起工作使得开发者能够根据信息类型和等级(Level)记录信息,以 ...
随机推荐
- QT_REQUIER_CONFIG
在qglobal.h中,定义了很多宏.下面这个QT_REQUIER_CONFIG,展开成: #define QT_REQUIRE_CONFIG(feature) Q_STATIC_ASSERT_X(Q ...
- maven下载源码
能下载到源代码的原则是仓库中打了resource的jar包 1.使用命令 mvn dependency:sources 下载依赖包的源代码. mvn dependency:sources -Ddown ...
- 用 Cobertura 测量测试覆盖率
尽管测试先行编程(test-first programming)和单元测试已不能算是新概念,但测试驱动的开发仍然是过去 10 年中最重要的编程创新.最好的一些编程人员在过去半个世纪中一直在使用这些 ...
- VBA在WORD应用中如何将格式应用于选定内容
下列示例使用 Selection 属性将字符和段落格式应用于选定文本.使用 Font 属性获得字体格式的属性和方法,使用 ParagraphFormat 属性获得段落格式的属性和方法. Sub For ...
- PC能替代服务器吗?
PC能替代服务器吗?全方位解析二者区别_华为服务器_服务器x86服务器-中关村在线http://server.zol.com.cn/536/5366835_all.html
- ionic 3.0中使用原生插件ionic-native
作为一个ionic的新手,今天使用了ionic的原生粘贴板插件 @ionic-native/clipboard,根据ionic官方文档上执行的命令 $ ionic cordova plugin ad ...
- 同一个服务器部署两个Tomcat并用Nginx实现反向代理
需求场景:由于服务器只有80端口可供外网访问,但需要部署两台tomcat来运行两个不同的项目,所以选择了nginx做反向代理 一个upstream tomcat_server对应一个 locatio ...
- python-django-01
1.Python工具 - pip 1.作用 Python的软件包管理器,有一些python包被集成到了pip中.只要被集成到pip中的包,都允许通过pip直接安装 2.安装 pip sudo apt ...
- DPDK- program_guide 2
Data Plane Development Kit(DPDK) RTE_SDK and RTE_TARGET must be configured. ~EAL ~librte_mempool ~li ...
- eclipse启动tomcat错误解决
clipse启动tomcat报出下面的错误提示: 控制台: 九月 06, 2018 9:01:31 下午 org.apache.tomcat.util.digester.SetPropertiesRu ...