zoukankan      html  css  js  c++  java
  • Quartz.Net系列(十五):Quartz.Net四种修改配置的方式

    案例:修改默认线程个数

    1.NameValueCollection

                System.Collections.Specialized.NameValueCollection collection = new System.Collections.Specialized.NameValueCollection();
    
                collection.Add("quartz.threadPool.ThreadCount","20");          
    
                var factory= new StdSchedulerFactory(collection);
    
                var scheduler= await factory.GetScheduler();
    
                await scheduler.Start();
    
                var metData=await scheduler.GetMetaData();
    
                Console.WriteLine(metData.ThreadPoolSize);

    原理

    通过反射实例化对象DefaultThreadPool

                Type tpType = loadHelper.LoadType(threadPoolTypeString) ?? typeof(DefaultThreadPool);
    
                try
                {
                    tp = ObjectUtils.InstantiateType<IThreadPool>(tpType);
                }
                catch (Exception e)
                {
                    initException = new SchedulerException("ThreadPool type '{0}' could not be instantiated.".FormatInvariant(tpType), e);
                    throw initException;
                }
                tProps = cfg.GetPropertyGroup(PropertyThreadPoolPrefix, true);
                try
                {
                    ObjectUtils.SetObjectProperties(tp, tProps);
                }
                catch (Exception e)
                {
                    initException = new SchedulerException("ThreadPool type '{0}' props could not be configured.".FormatInvariant(tpType), e);
                    throw initException;
                }

    设置对象的属性

     public static void SetObjectProperties(object obj, NameValueCollection props)
            {
                // remove the type
                props.Remove("type");
    
                foreach (string name in props.Keys)
                {
                    string propertyName = CultureInfo.InvariantCulture.TextInfo.ToUpper(name.Substring(0, 1)) +
                                          name.Substring(1);
    
                    try
                    {
                        object value = props[name];
                        SetPropertyValue(obj, propertyName, value);
                    }
                    catch (Exception nfe)
                    {
                        throw new SchedulerConfigException(
                            $"Could not parse property '{name}' into correct data type: {nfe.Message}", nfe);
                    }
                }
            }

    通过反射设置属性的值

     public static void SetPropertyValue(object target, string propertyName, object value)
            {
                Type t = target.GetType();
    
                PropertyInfo pi = t.GetProperty(propertyName);
    
                if (pi == null || !pi.CanWrite)
                {
                    // try to find from interfaces
                    foreach (var interfaceType in target.GetType().GetInterfaces())
                    {
                        pi = interfaceType.GetProperty(propertyName);
                        if (pi != null && pi.CanWrite)
                        {
                            // found suitable
                            break;
                        }
                    }
                }
    
                if (pi == null)
                {
                    // not match from anywhere
                    throw new MemberAccessException($"No writable property '{propertyName}' found");
                }
    
                MethodInfo mi = pi.GetSetMethod();
    
                if (mi == null)
                {
                    throw new MemberAccessException($"Property '{propertyName}' has no setter");
                }
    
                if (mi.GetParameters()[0].ParameterType == typeof(TimeSpan))
                {
                    // special handling
                    value = GetTimeSpanValueForProperty(pi, value);
                }
                else
                {
                    value = ConvertValueIfNecessary(mi.GetParameters()[0].ParameterType, value);
                }
    
                mi.Invoke(target, new[] {value});
            }

    结果图

     2.App.config(只在.NETFramework生效)

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <configSections>
            <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
        </configSections>
    
        <quartz>
            <add key="quartz.threadPool.ThreadCount" value="11"/>
        </quartz>
        <startup>
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
        </startup>
    </configuration>
            static void Main(string[] args)
            {
                var scheduler =new StdSchedulerFactory().GetScheduler().Result;
    
                scheduler.Start();
    
                var metaData=scheduler.GetMetaData().Result;
    
                Console.WriteLine(metaData.ThreadPoolSize);
    
                Console.Read();
            }

    结果图

     原理

    通过ConfigurationManager.GetSection()来获取App.config里面的值,如果有就转换成NameValueCollection

             public virtual void Initialize()
            {
                // short-circuit if already initialized
                if (cfg != null)
                {
                    return;
                }
                if (initException != null)
                {
                    throw initException;
                }
    
                var props = Util.Configuration.GetSection(ConfigurationSectionName);
             }
    internal static NameValueCollection GetSection(string sectionName)
            {
                try
                {
                    return (NameValueCollection) ConfigurationManager.GetSection(sectionName);
                }
                catch (Exception e)
                {
                    log.Warn("could not read configuration using ConfigurationManager.GetSection: " + e.Message);
                    return null;
                }
            }

    3.quartz.config

    quartz.threadPool.ThreadCount=20
                System.Collections.Specialized.NameValueCollection collection = new System.Collections.Specialized.NameValueCollection();
    
                //collection.Add("quartz.threadPool.ThreadCount","20");          
    
                //var factory= new StdSchedulerFactory(collection);
    
                var factory = new StdSchedulerFactory();
    
                var scheduler= await factory.GetScheduler();
    
                await scheduler.Start();
    
                var metData=await scheduler.GetMetaData();
    
                Console.WriteLine(metData.ThreadPoolSize);

    结果图

    原理

    判断当前程序中是否有quartz.config这个文件

    如果有则读取

                if (props == null && File.Exists(propFileName))
                {
                    // file system
                    try
                    {
                        PropertiesParser pp = PropertiesParser.ReadFromFileResource(propFileName);
                        props = pp.UnderlyingProperties;
                        Log.Info($"Quartz.NET properties loaded from configuration file '{propFileName}'");
                    }
                    catch (Exception ex)
                    {
                        Log.ErrorException("Could not load properties for Quartz from file {0}: {1}".FormatInvariant(propFileName, ex.Message), ex);
                    }
                }

    #表示注释

    !END代表结束,如果没有就读取全部

            public static PropertiesParser ReadFromFileResource(string fileName)
            {
                return ReadFromStream(File.OpenRead(fileName));
            }
    
            private static PropertiesParser ReadFromStream(Stream stream)
            {
                NameValueCollection props = new NameValueCollection();
                using (StreamReader sr = new StreamReader(stream))
                {
                    string line;
                    while ((line = sr.ReadLine()) != null)
                    {
                        line = line.TrimStart();
    
                        if (line.StartsWith("#"))
                        {
                            // comment line
                            continue;
                        }
                        if (line.StartsWith("!END"))
                        {
                            // special end condition
                            break;
                        }
                        string[] lineItems = line.Split(new[] { '=' }, 2);
                        if (lineItems.Length == 2)
                        {
                            props[lineItems[0].Trim()] = lineItems[1].Trim();
                        }
                    }
                }
                return new PropertiesParser(props);
            }

    4.Environment(环境变量)

                Environment.SetEnvironmentVariable("quartz.threadPool.ThreadCount","50");
               
                System.Collections.Specialized.NameValueCollection collection = new System.Collections.Specialized.NameValueCollection();
    
                //collection.Add("quartz.threadPool.ThreadCount","20");          
    
                //var factory= new StdSchedulerFactory(collection);
    
                var factory = new StdSchedulerFactory();
    
                var scheduler= await factory.GetScheduler();
    
                await scheduler.Start();
    
                var metData=await scheduler.GetMetaData();
    
                Console.WriteLine(metData.ThreadPoolSize);

    结果图

     原理

    public virtual void Initialize()
    {
      。。。。。。
      Initialize(OverrideWithSysProps(props));
    }

    获取所有的环境变量,然后赋值给NameValueCollection

            private static NameValueCollection OverrideWithSysProps(NameValueCollection props)
            {
                NameValueCollection retValue = new NameValueCollection(props);
                IDictionary<string, string> vars = QuartzEnvironment.GetEnvironmentVariables();
    
                foreach (string key in vars.Keys)
                {
                    retValue.Set(key, vars[key]);
                }
    
                return retValue;
            }

     quartz.config<app.config<环境变量<NameValueCollection

  • 相关阅读:
    TP5.0防跳墙访问
    TP5.0上传添加数据库
    抽象类与接口
    instanceof 关键字
    abstract 抽象类
    extends 继承
    单例模式
    类的加载过程和对象的创建
    静态成员变量和非静态成员变量的区别
    this关键字
  • 原文地址:https://www.cnblogs.com/vic-tory/p/13291631.html
Copyright © 2011-2022 走看看