Commit 8f0de60592d1528482b6b338acb039ba418b82d5
1 parent
1fe85914
- Hangfire illesztés javítva
Showing
3 changed files
with
369 additions
and
166 deletions
Show diff stats
Vrh.Web.Reporting/Global.asax.cs
1 | using System; | 1 | using System; |
2 | using System.Collections.Generic; | 2 | using System.Collections.Generic; |
3 | +using System.Configuration; | ||
3 | using System.Diagnostics; | 4 | using System.Diagnostics; |
4 | using System.IO; | 5 | using System.IO; |
5 | using System.Linq; | 6 | using System.Linq; |
@@ -22,62 +23,28 @@ namespace Vrh.Web.Reporting | @@ -22,62 +23,28 @@ namespace Vrh.Web.Reporting | ||
22 | { | 23 | { |
23 | protected void Application_Start() | 24 | protected void Application_Start() |
24 | { | 25 | { |
25 | - var methodfullname = $"{typeof(HangfireBootstrapper).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}"; | ||
26 | - | ||
27 | - (new DCLogEntry(LogLevel.Information, methodfullname)).Write(); | 26 | + (new DCLogEntry(LogLevel.Information, $"{typeof(MvcApplication).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}")).Write(); |
28 | AreaRegistration.RegisterAllAreas(); | 27 | AreaRegistration.RegisterAllAreas(); |
29 | FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); | 28 | FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); |
30 | RouteConfig.RegisterRoutes(RouteTable.Routes); | 29 | RouteConfig.RegisterRoutes(RouteTable.Routes); |
31 | BundleConfig.RegisterBundles(BundleTable.Bundles); | 30 | BundleConfig.RegisterBundles(BundleTable.Bundles); |
32 | 31 | ||
33 | - ////////////////////////////////////////////////////////////////////////////////////// | ||
34 | - ///Enable webApp pool autostart, preload and alwaysrun | ||
35 | - ////////////////////////////////////////////////////////////////////////////////////// | ||
36 | - /// For web applications running on servers under your control, either physical or virtual, you can use the auto-start feature of IIS ≥ 7.5 shipped with | ||
37 | - /// Windows Server ≥ 2008 R2. Full setup requires the following steps to be done. Enable automatic start and AlwaysRunning mode for Application pool | ||
38 | - /// and configure Auto - start feature as written below. | ||
39 | - /// Edit the following file: C:\Windows\System32\inetsrv\config\applicationHost.config. | ||
40 | - /// All edits should be made below the <configuration><system.applicationHost> section. | ||
41 | - /// In the <applicationPools> section find the <add name="YourApplicationPoolName"> tag of the application pool to be autostarted. | ||
42 | - /// Add autoStart="true" and startMode="AlwaysRunning" attributes to this <add> tag. | ||
43 | - /// In the <sites><site name="YourWebsiteName"> section find the <application path="/YourWebApplicationName" applicationPool="YourApplicationPoolName"> tag of the web application | ||
44 | - /// running on the application pool with name "YourApplicationPoolName". | ||
45 | - /// Add serviceAutoStartEnabled="true" and serviceAutoStartProvider="AnyNameForYourAutoStartProvider" attributes to this <application> tag. | ||
46 | - /// Here YourWebsiteName is the name of the website where the web application, using the application pool belongs to. | ||
47 | - /// In the <serviceAutoStartProviders> section create the following element: | ||
48 | - /// <add name="AnyNameForYourAutoStartProvider" type="FullTypeNameOfTheAutostartProviderClass, NameOfTheAssemblyContainingTheAutostartProviderClass" /> | ||
49 | - /// Here AnyNameForYourAutoStartProvider can be any name, that is suitable for the xml standard. | ||
50 | - /// Here FullTypeNameOfTheAutostartProviderClass is the full type name (with namespace and class name) of the class that matches the IProcessHostPreloadClient interface; | ||
51 | - /// this class should not be within the root class of the mvc application, but for example another class on the same level! For what is in this code the tag is the following: | ||
52 | - /// <add name="ApplicationPreload" type="Vrh.Web.Reporting.ApplicationPreload, Vrh.Web.Reporting" /> | ||
53 | - /// Here NameOfTheAssemblyContainingTheAutostartProviderClass is the name of (for example the dll), but without the extension. | ||
54 | - ////////////////////////////////////////////////////////////////////////////////////// | 32 | + HangfireBootstrapper.Init(Vrh.iScheduler.Monitor.InitHangfire); |
55 | 33 | ||
56 | - (new HangfireBootstrapper()).Initialize(); | ||
57 | - | ||
58 | //Vrh.Web.Menu inicializáló beállításai | 34 | //Vrh.Web.Menu inicializáló beállításai |
59 | - Vrh.Web.Menu.Global.CustomerLogo = "~/Content/Images/Menu_LearLogo.jpg"; | ||
60 | - // ! ha azt szeretnénk, hogy a menükezelő kezelje a hitelesítést is, | ||
61 | - // ! akkor ezt itt igaz értékre kell állítani | ||
62 | - Vrh.Web.Menu.Global.IsUseAuthentication = true; | 35 | + Vrh.Web.Menu.Global.CustomerLogo = "~/Content/Images/Menu_LearLogo.jpg"; |
36 | + Vrh.Web.Menu.Global.IsUseAuthentication = true;// ! ha azt szeretnénk, hogy a menükezelő kezelje a hitelesítést is, akkor ezt itt igaz értékre kell állítani | ||
63 | } | 37 | } |
64 | 38 | ||
65 | - | ||
66 | protected void Application_End(object sender, EventArgs e) | 39 | protected void Application_End(object sender, EventArgs e) |
67 | { | 40 | { |
68 | - var methodfullname = $"{typeof(HangfireBootstrapper).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}"; | ||
69 | - (new DCLogEntry(LogLevel.Information, methodfullname)).Write(); | ||
70 | - HangfireBootstrapper.Instance.Stop(); | 41 | + (new DCLogEntry(LogLevel.Information, $"{typeof(MvcApplication).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}")).Write(); |
42 | + HangfireBootstrapper.Stop(); | ||
71 | } | 43 | } |
72 | /// <summary> | 44 | /// <summary> |
73 | - /// Ha "Internal Server Error 500" üzenetet kapsz, akkor | ||
74 | - /// ide érdemes a hívás előtt betenni egy break point-ot. | ||
75 | - /// Majd vizsgálni a this.Context.AllErrors tulajdonságot. | ||
76 | - /// Egyből kiderül, miért van az 500-as hiba :) | 45 | + /// Ha "Internal Server Error 500" üzenetet kapsz, akkor ide érdemes a hívás előtt betenni egy break point-ot. |
46 | + /// Majd vizsgálni a this.Context.AllErrors tulajdonságot. Egyből kiderül, miért van az 500-as hiba :) | ||
77 | /// </summary> | 47 | /// </summary> |
78 | - protected void Application_EndRequest() | ||
79 | - { | ||
80 | - //int i = 1; | ||
81 | - } | 48 | + protected void Application_EndRequest() { var thisContextAllErrors = this.Context.AllErrors; } |
82 | } | 49 | } |
83 | } | 50 | } |
Vrh.Web.Reporting/HangfireBootstrapper.cs
@@ -16,38 +16,200 @@ using System.Xml.Linq; | @@ -16,38 +16,200 @@ using System.Xml.Linq; | ||
16 | using Hangfire; | 16 | using Hangfire; |
17 | using Microsoft.Web.Administration; | 17 | using Microsoft.Web.Administration; |
18 | using Vrh.Logger; | 18 | using Vrh.Logger; |
19 | +using System.Configuration; | ||
19 | 20 | ||
20 | namespace Vrh.Web.HangfireBootstrapperNS | 21 | namespace Vrh.Web.HangfireBootstrapperNS |
21 | { | 22 | { |
22 | public class HangfireBootstrapper : IRegisteredObject, IProcessHostPreloadClient | 23 | public class HangfireBootstrapper : IRegisteredObject, IProcessHostPreloadClient |
23 | { | 24 | { |
25 | + /// <summary> | ||
26 | + /// Egy külső iniciátort hregisztrálására szolgál, amelyben lehetőség van a | ||
27 | + /// paraméterként megkapott BackgroundJobServer-re ütemezett feladatokat definiálni. | ||
28 | + /// </summary> | ||
29 | + public static void InitConfig(Action<object> externalinitializer=null) | ||
30 | + { | ||
31 | + if (externalinitializer == null) return; | ||
32 | + var le = new DCLogEntry(LogLevel.Information, $"{typeof(HangfireBootstrapper).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}"); | ||
33 | + try { _InitConfig(externalinitializer, le); } | ||
34 | + catch (Exception ex) { le.AddExceptionResult(ex);le.SetLogLevel(LogLevel.Error); } | ||
35 | + finally { le.Write(); } | ||
36 | + } | ||
37 | + private static void _InitConfig(Action<object> externalinitializer, DCLogEntry le) | ||
38 | + { | ||
39 | + if (externalinitializer != null) | ||
40 | + { | ||
41 | + externalinitializerList.Add(externalinitializer); | ||
42 | + le.AddDataField("ADD external initializer", $"{externalinitializer.Method.DeclaringType.FullName}.{externalinitializer.Method.Name}()"); | ||
43 | + } | ||
44 | + } | ||
45 | + /// <summary> | ||
46 | + /// A Hangfire rendszer elindítását, paraméterezését, konfigurálását és a külső iniciátorok meghívást végzi. | ||
47 | + /// </summary> | ||
48 | + const string HANGFIRE = "HangfireBootstrapper:"; | ||
49 | + const string HANGFIREDISABLEAUTOSTART = HANGFIRE + "disableautostart"; | ||
50 | + const bool DISABLEAUTOSTARTDEFAULT = false; | ||
51 | + const string HANGFIREDBCONNECTIONSTRING = HANGFIRE + "dbconnectionstring"; | ||
52 | + const string HANGFIRESQLDBCONNECTIONSTRINGNAMEDEFAULT = "HANGFIRESQLDB"; | ||
53 | + public static void Init(Action<object> externalinitializer=null) | ||
54 | + { | ||
55 | + var le = new DCLogEntry(LogLevel.Information, $"{typeof(HangfireBootstrapper).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}"); | ||
56 | + try | ||
57 | + { | ||
58 | + bool DisablAautoStart; | ||
59 | + string disableautostartstring = ConfigurationManager.AppSettings[HANGFIREDISABLEAUTOSTART]; | ||
60 | + if (string.IsNullOrWhiteSpace(disableautostartstring)) DisablAautoStart = DISABLEAUTOSTARTDEFAULT; | ||
61 | + else if (disableautostartstring.ToLower() == bool.TrueString.ToLower()) DisablAautoStart = true; | ||
62 | + else if (disableautostartstring.ToLower() != bool.FalseString.ToLower()) DisablAautoStart = false; | ||
63 | + else DisablAautoStart = DISABLEAUTOSTARTDEFAULT; | ||
64 | + | ||
65 | + le.AddDataField("DisablAautoStart", DisablAautoStart); | ||
66 | + _InitConfig(externalinitializer, le); | ||
67 | + HangfireBootstrapper.Instance._InstanceInitialize(DisablAautoStart,le); | ||
68 | + ExecuteExternalInitializers(le); | ||
69 | + } | ||
70 | + catch (Exception ex) { le.AddExceptionResult(ex); le.SetLogLevel(LogLevel.Error); } | ||
71 | + finally { le.Write(); } | ||
72 | + } | ||
73 | + | ||
74 | + /// <summary> | ||
75 | + /// A Hangfire rendszeer leállítását végzi; | ||
76 | + /// Ezt a metódust meg kell hívni a IProcessHostPreloadClient működéséhez! | ||
77 | + /// </summary> | ||
78 | + public static void Stop() | ||
79 | + { | ||
80 | + (new DCLogEntry(LogLevel.Information, $"{typeof(HangfireBootstrapper).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}")).Write(); | ||
81 | + HangfireBootstrapper.Instance._Stop(); | ||
82 | + } | ||
83 | + | ||
84 | + /// <summary> | ||
85 | + /// IProcessHostPreloadClient-et megvalósító metódus, amelyet a w3w worker process újratöltésekor hív meg az IIS | ||
86 | + /// </summary> | ||
87 | + /// <param name="parameters"></param> | ||
24 | public void Preload(string[] parameters) | 88 | public void Preload(string[] parameters) |
25 | { | 89 | { |
26 | - var methodfullname = $"{typeof(HangfireBootstrapper).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}"; | ||
27 | - (new DCLogEntry(LogLevel.Information, methodfullname)).Write(); | ||
28 | - Initialize(); | 90 | + var le = new DCLogEntry(LogLevel.Information, $"{typeof(HangfireBootstrapper).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}"); |
91 | + try | ||
92 | + { | ||
93 | + _InstanceInitialize(le:le); | ||
94 | + ExecuteExternalInitializers(le); | ||
95 | + le.AddSuccessResult("SUCCESS"); | ||
96 | + } | ||
97 | + catch (Exception ex) { le.AddExceptionResult(ex);le.SetLogLevel(LogLevel.Error); } | ||
98 | + finally { le.Write(); } | ||
29 | } | 99 | } |
30 | - public void Initialize() | 100 | + |
101 | + /// <summary> | ||
102 | + /// Kell legyen egy publikus paraméter nélküli konstruktor a webapp preload funkcióhoz!!! | ||
103 | + /// </summary> | ||
104 | + public HangfireBootstrapper() { } | ||
105 | + | ||
106 | + #region private members | ||
107 | + private static void ExecuteExternalInitializers(DCLogEntry le) | ||
31 | { | 108 | { |
32 | - SetupAutoStart(typeof(HangfireBootstrapper)); | ||
33 | - HangfireBootstrapper.Instance.SqlDBconnectionstring = Vrh.XmlProcessing.ConnectionStringStore.GetSQL(HANGFIRESQLDBCONNECTIONSTRINGNAME); | ||
34 | - HangfireBootstrapper.Instance.Start(); | ||
35 | - Vrh.iScheduler.Monitor.InitHangfire(HangfireBootstrapper.Instance._backgroundJobServer); | 109 | + int numofall = externalinitializerList.Count(); |
110 | + int counter = externalinitializerList.Count(); | ||
111 | + if (numofall==0) | ||
112 | + { | ||
113 | + le.AddDebugField("External initializer","Nothing to initialize!"); | ||
114 | + } | ||
115 | + else | ||
116 | + { | ||
117 | + foreach (var ei in externalinitializerList) | ||
118 | + { | ||
119 | + var externalinitializername = $"External initializer: {ei.Method.DeclaringType.FullName}.{ei.Method.Name}()"; | ||
120 | + try { ei.Invoke(HangfireBootstrapper.Instance._backgroundJobServer); le.AddDataField($"{externalinitializername} SUCCESS",$"{counter}of{numofall})"); } | ||
121 | + catch (Exception ex) { le.AddDataField($"{externalinitializername} EXCEPTION", ex.Message); } | ||
122 | + counter++; | ||
123 | + } | ||
124 | + } | ||
36 | } | 125 | } |
37 | 126 | ||
38 | - private const string HANGFIRESQLDBCONNECTIONSTRINGNAME = "MAINDBLOG4PRO"; | ||
39 | - private const string CONFIGFILEDIRECTORY = @"inetsrv\config"; | ||
40 | - private const string CONFIGFILENAME = @"applicationHost.config"; | ||
41 | - //public const string FILEPATH = @"C:\temp\applicationHost.config"; | ||
42 | - private const string POOLNAME = "Log4ProIS_REPORTING"; | ||
43 | - private const string WEBAPPNAME = "/Log4ProIS-REPORTING"; | ||
44 | - private const string WEBSITENAME = "Default Web Site"; | ||
45 | - private const string AUTOSTARTPROVIDERNAME = "ApplicationPreload"; | ||
46 | - private const string AUTOSTARTPROVIDERTYPENAME = "Vrh.Web.Reporting.ApplicationPreload"; | ||
47 | - private const string AUTOSTARTPROVIDERASSEMBLYNAME = "Vrh.Web.Reporting"; | 127 | + private void _InstanceInitialize(bool autostartsetupdisable =false,DCLogEntry le=null) |
128 | + { | ||
129 | + string HangfireSqlDBConnectionString = ConfigurationManager.AppSettings[HANGFIREDBCONNECTIONSTRING]; | ||
130 | + if (string.IsNullOrWhiteSpace(HangfireSqlDBConnectionString)) HangfireSqlDBConnectionString = HANGFIRESQLDBCONNECTIONSTRINGNAMEDEFAULT; | ||
131 | + le?.AddDataField("HangfireSqlDBConnectionString", HangfireSqlDBConnectionString); | ||
132 | + SetupAutoStart(typeof(HangfireBootstrapper),disablemode:autostartsetupdisable,le:le); | ||
133 | + HangfireBootstrapper.Instance.SqlDBconnectionstring = Vrh.XmlProcessing.ConnectionStringStore.GetSQL(HangfireSqlDBConnectionString); | ||
134 | + HangfireBootstrapper.Instance._Start(); | ||
135 | + } | ||
48 | 136 | ||
49 | - private static bool SetupAutoStart(Type serviceAutoStartProviderType) | 137 | + private static List<Action<object>> externalinitializerList = new List<Action<object>>(); |
138 | + private static readonly HangfireBootstrapper Instance = new HangfireBootstrapper(); | ||
139 | + private BackgroundJobServer _backgroundJobServer { get; set; } | ||
140 | + private string SqlDBconnectionstring { get; set; } = null; | ||
141 | + private readonly object _lockObject = new object(); | ||
142 | + private bool _started; | ||
143 | + | ||
144 | + | ||
145 | + private void _Start() | ||
146 | + { | ||
147 | + lock (_lockObject) | ||
148 | + { | ||
149 | + if (_started) return; | ||
150 | + _started = true; | ||
151 | + | ||
152 | + HostingEnvironment.RegisterObject(this); | ||
153 | + GlobalConfiguration.Configuration | ||
154 | + .UseSqlServerStorage(SqlDBconnectionstring) | ||
155 | + // Specify other options here | ||
156 | + ; | ||
157 | + | ||
158 | + _backgroundJobServer = new BackgroundJobServer(); | ||
159 | + } | ||
160 | + } | ||
161 | + | ||
162 | + private void _Stop() | ||
163 | + { | ||
164 | + lock (_lockObject) | ||
165 | + { | ||
166 | + if (_backgroundJobServer != null) { _backgroundJobServer.Dispose(); } | ||
167 | + HostingEnvironment.UnregisterObject(this); | ||
168 | + } | ||
169 | + } | ||
170 | + | ||
171 | + void IRegisteredObject.Stop(bool immediate) { _Stop(); } | ||
172 | + #endregion private members | ||
173 | + | ||
174 | + #region private method - SetupAutoStart | ||
175 | + /// <summary> | ||
176 | + /// Beállítja az autostart és alwaysrunning és a preload paramétereket a megadott websitra, | ||
177 | + /// web alkalmazásra és application pool-ra vonatkozóan. | ||
178 | + /// Enable webApp pool autostart, preload and alwaysrun | ||
179 | + /// For web applications running on servers under your control, either physical or virtual, you can use the auto-start feature of IIS ≥ 7.5 shipped with | ||
180 | + /// Windows Server ≥ 2008 R2. Full setup requires the following steps to be done. Enable automatic start and AlwaysRunning mode for Application pool | ||
181 | + /// and configure Auto - start feature as written below. | ||
182 | + /// Edit the following file: C:\Windows\System32\inetsrv\config\applicationHost.config. | ||
183 | + /// All edits should be made below the <configuration><system.applicationHost> section. | ||
184 | + /// In the <applicationPools> section find the <add name="YourApplicationPoolName"> tag of the application pool to be autostarted. | ||
185 | + /// Add autoStart="true" and startMode="AlwaysRunning" attributes to this <add> tag. | ||
186 | + /// In the <sites><site name="YourWebsiteName"> section find the <application path="/YourWebApplicationName" applicationPool="YourApplicationPoolName"> tag of the web application | ||
187 | + /// running on the application pool with name "YourApplicationPoolName". | ||
188 | + /// Add preloadEnabled="true", serviceAutoStartEnabled="true" and serviceAutoStartProvider="AnyNameForYourAutoStartProvider" attributes to this <application> tag. | ||
189 | + /// Here YourWebsiteName is the name of the website where the web application, using the application pool belongs to. | ||
190 | + /// In the <serviceAutoStartProviders> section create the following element: | ||
191 | + /// <add name="AnyNameForYourAutoStartProvider" type="FullTypeNameOfTheAutostartProviderClass, NameOfTheAssemblyContainingTheAutostartProviderClass" /> | ||
192 | + /// Here AnyNameForYourAutoStartProvider can be any name, that is suitable for the xml standard. | ||
193 | + /// Here FullTypeNameOfTheAutostartProviderClass is the full type name (with namespace and class name) of the class that matches the IProcessHostPreloadClient interface; | ||
194 | + /// this class should not be within the root class of the mvc application, but for example another class on the same level! For what is in this code the tag is the following: | ||
195 | + /// <add name="ApplicationPreload" type="Vrh.Web.Reporting.ApplicationPreload, Vrh.Web.Reporting" /> | ||
196 | + /// Here NameOfTheAssemblyContainingTheAutostartProviderClass is the name of (for example the dll), but without the extension. | ||
197 | + ////////////////////////////////////////////////////////////////////////////////////// | ||
198 | + /// </summary> | ||
199 | + /// <param name="serviceAutoStartProviderType"> | ||
200 | + /// annak a class-nak a típusa, amely megvalósítja a IProcessHostPreloadClient interfészt a Preload metódus-sal, | ||
201 | + /// amely metódus meghívásra kerül mindenkor, amikor a hozzájuk tartozó w3w worker processz ujraindításra kerül. | ||
202 | + /// </param> | ||
203 | + /// <param name="websitename">a website neve; alapértelmezés:a tartalmazó website</param> | ||
204 | + /// <param name="webapplicationname">a web app neve; alapértelmezés:a tartalmazó web app</param> | ||
205 | + /// <param name="applicationpoolname">az app pool neve; alapértelmezés:a tartalmazó pool</param> | ||
206 | + /// <returns></returns> | ||
207 | + private static void SetupAutoStart(Type serviceAutoStartProviderType, string websitename = null, string webapplicationname = null, string applicationpoolname = null, bool disablemode = false, DCLogEntry le = null) | ||
50 | { | 208 | { |
209 | + const string CONFIGFILEDIRECTORY = @"inetsrv\config"; | ||
210 | + const string CONFIGFILENAME = @"applicationHost.config"; | ||
211 | + //const string FILEPATH = @"C:\temp\applicationHost.config"; | ||
212 | + | ||
51 | const string SYSTEMAPPLICATIONHOST_ELEMENT = "system.applicationHost"; | 213 | const string SYSTEMAPPLICATIONHOST_ELEMENT = "system.applicationHost"; |
52 | const string APPLICATIONPOOLS_ELEMENT = "applicationPools"; | 214 | const string APPLICATIONPOOLS_ELEMENT = "applicationPools"; |
53 | const string SITES_ELEMENT = "sites"; | 215 | const string SITES_ELEMENT = "sites"; |
@@ -63,78 +225,124 @@ namespace Vrh.Web.HangfireBootstrapperNS | @@ -63,78 +225,124 @@ namespace Vrh.Web.HangfireBootstrapperNS | ||
63 | const string PATH_ATTRIBUTE = "path"; | 225 | const string PATH_ATTRIBUTE = "path"; |
64 | const string AUTOSTART_ATTRIBUTE = "autoStart"; | 226 | const string AUTOSTART_ATTRIBUTE = "autoStart"; |
65 | const string STARTMODE_ATTRIBUTE = "startMode"; | 227 | const string STARTMODE_ATTRIBUTE = "startMode"; |
228 | + const string PRELOADENABLED_ATTRIBUTE = "preloadEnabled"; | ||
66 | 229 | ||
67 | - string applicationpoolname = GetCurrentApplicationPoolName(); | ||
68 | - string websitename = System.Web.Hosting.HostingEnvironment.SiteName; | ||
69 | - string webapplicationname = System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath; | ||
70 | - string autostartprovidername = (websitename + "____" + applicationpoolname + "____" + webapplicationname).Replace(" ", "_").Replace("-", "_").Replace("/", "_"); | ||
71 | - string serviceAutoStartProviderTypeFullName = serviceAutoStartProviderType.FullName; | ||
72 | - string serviceAutoStartProviderAssassemblyName = serviceAutoStartProviderType.Assembly.GetName().Name; | ||
73 | - var methodfullname = $"{typeof(HangfireBootstrapper).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}"; | ||
74 | - var le = new DCLogEntry(LogLevel.Information, methodfullname); | 230 | + bool writele = le == null; |
231 | + if (le == null) { le = new DCLogEntry(LogLevel.Information, $"{typeof(HangfireBootstrapper).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}"); }; | ||
75 | try | 232 | try |
76 | { | 233 | { |
234 | + websitename = websitename ?? HostingEnvironment.SiteName; //websitename = System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName(); | ||
235 | + webapplicationname = webapplicationname ?? HostingEnvironment.ApplicationVirtualPath; //webapplicationname = System.Web.HttpRuntime.AppDomainAppVirtualPath; | ||
236 | + applicationpoolname = applicationpoolname ?? GetCurrentApplicationPoolName(websitename); | ||
237 | + string autostartprovidername = (websitename + "____" + applicationpoolname + "____" + webapplicationname).Replace(" ", "_").Replace("-", "_").Replace("/", "_"); | ||
238 | + string serviceAutoStartProviderTypeFullName = serviceAutoStartProviderType.FullName; | ||
239 | + string serviceAutoStartProviderAssassemblyName = serviceAutoStartProviderType.Assembly.GetName().Name; | ||
77 | string configfilepath = Path.Combine(NativeSystemPath, CONFIGFILEDIRECTORY, CONFIGFILENAME); | 240 | string configfilepath = Path.Combine(NativeSystemPath, CONFIGFILEDIRECTORY, CONFIGFILENAME); |
78 | - le.AddDataField("configfilepath", configfilepath); | ||
79 | - le.AddDataField("applicationpoolname", applicationpoolname); | ||
80 | - le.AddDataField("websitename", websitename); | ||
81 | - le.AddDataField("webapplicationname", webapplicationname); | ||
82 | - le.AddDataField("serviceAutoStartProviderTypeFullName", serviceAutoStartProviderTypeFullName); | ||
83 | - le.AddDataField("serviceAutoStartProviderAssassemblyName", serviceAutoStartProviderAssassemblyName); | ||
84 | - | ||
85 | - | ||
86 | var filecontent = System.IO.File.ReadAllText(configfilepath); | 241 | var filecontent = System.IO.File.ReadAllText(configfilepath); |
87 | XElement configxml = XElement.Parse(filecontent, LoadOptions.PreserveWhitespace); //XElement.Load(configfilepath); | 242 | XElement configxml = XElement.Parse(filecontent, LoadOptions.PreserveWhitespace); //XElement.Load(configfilepath); |
88 | - | ||
89 | XElement myconfigrootxml = configxml.Element(XName.Get(SYSTEMAPPLICATIONHOST_ELEMENT)); | 243 | XElement myconfigrootxml = configxml.Element(XName.Get(SYSTEMAPPLICATIONHOST_ELEMENT)); |
244 | + | ||
245 | + le.AddDataField("SetupAutoStart configfilepath", configfilepath); | ||
246 | + le.AddDataField("SetupAutoStart applicationpoolname", applicationpoolname); | ||
247 | + le.AddDataField("SetupAutoStart websitename (System.Web.Hosting.HostingEnvironment.SiteName)", websitename); | ||
248 | + le.AddDataField("SetupAutoStart webapplicationname (System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath)", webapplicationname); | ||
249 | + //le.AddDataField("System.Web.HttpRuntime.AppDomainAppVirtualPath", HttpRuntime.AppDomainAppVirtualPath); | ||
250 | + //le.AddDataField("System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName()", System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName()); | ||
251 | + le.AddDataField("SetupAutoStart serviceAutoStartProviderTypeFullName", serviceAutoStartProviderTypeFullName); | ||
252 | + le.AddDataField("SetupAutoStart serviceAutoStartProviderAssassemblyName", serviceAutoStartProviderAssassemblyName); | ||
253 | + | ||
90 | XElement myapplicationpooladdelement = myconfigrootxml?.Element(XName.Get(APPLICATIONPOOLS_ELEMENT))? | 254 | XElement myapplicationpooladdelement = myconfigrootxml?.Element(XName.Get(APPLICATIONPOOLS_ELEMENT))? |
91 | .Elements(XName.Get(ADD_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(NAME_ATTRIBUTE)).Value == applicationpoolname); | 255 | .Elements(XName.Get(ADD_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(NAME_ATTRIBUTE)).Value == applicationpoolname); |
92 | XElement mysiteapplicationelement = myconfigrootxml?.Element(XName.Get(SITES_ELEMENT))? | 256 | XElement mysiteapplicationelement = myconfigrootxml?.Element(XName.Get(SITES_ELEMENT))? |
93 | .Elements(XName.Get(SITE_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(NAME_ATTRIBUTE)).Value == websitename) | 257 | .Elements(XName.Get(SITE_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(NAME_ATTRIBUTE)).Value == websitename) |
94 | .Elements(XName.Get(APPLICATION_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(PATH_ATTRIBUTE)).Value == webapplicationname && e.Attribute(XName.Get(APPLICATIONPOOL_ATTRIBUTE)).Value == applicationpoolname); | 258 | .Elements(XName.Get(APPLICATION_ELEMENT))?.FirstOrDefault(e => e.Attribute(XName.Get(PATH_ATTRIBUTE)).Value == webapplicationname && e.Attribute(XName.Get(APPLICATIONPOOL_ATTRIBUTE)).Value == applicationpoolname); |
95 | - if (myapplicationpooladdelement == null) return false; | ||
96 | - if (mysiteapplicationelement == null) return false; | 259 | + if (myapplicationpooladdelement == null) return; |
260 | + if (mysiteapplicationelement == null) return; | ||
97 | 261 | ||
98 | - bool configchanged = false; | ||
99 | - configchanged = SetOrAddAttribute(AUTOSTART_ATTRIBUTE, myapplicationpooladdelement, "true") || configchanged; | ||
100 | - configchanged = SetOrAddAttribute(STARTMODE_ATTRIBUTE, myapplicationpooladdelement, "AlwaysRunning") || configchanged; | ||
101 | - configchanged = SetOrAddAttribute(SERVICEAUTOSTARTENABLED_ATTRIBUTE, mysiteapplicationelement, "true") || configchanged; | ||
102 | - configchanged = SetOrAddAttribute(SERVICEAUTOSTARTPROVIDER_ATTRIBUTE, mysiteapplicationelement, autostartprovidername) || configchanged; | 262 | + bool configchanged=false; |
263 | + if (disablemode) | ||
264 | + { | ||
265 | + configchanged = SetOrAddAttribute(AUTOSTART_ATTRIBUTE, myapplicationpooladdelement, bool.FalseString.ToLower()) || configchanged; | ||
266 | + configchanged = SetOrAddAttribute(STARTMODE_ATTRIBUTE, myapplicationpooladdelement, StartMode.OnDemand.ToString()) || configchanged; | ||
267 | + configchanged = SetOrAddAttribute(SERVICEAUTOSTARTENABLED_ATTRIBUTE, mysiteapplicationelement, bool.FalseString.ToLower()) || configchanged; | ||
268 | + configchanged = SetOrAddAttribute(PRELOADENABLED_ATTRIBUTE, mysiteapplicationelement, bool.FalseString.ToLower()) || configchanged; | ||
269 | + configchanged = RemoveAttribute(SERVICEAUTOSTARTPROVIDER_ATTRIBUTE, mysiteapplicationelement) || configchanged; | ||
270 | + | ||
271 | + XElement myautostartproviderselement = myconfigrootxml.Element(XName.Get(SERVICEAUTOSTARTPROVIDERS_ELEMENT)); | ||
272 | + configchanged = RemoveElementWithSelectorAttribute(ADD_ELEMENT, myautostartproviderselement, NAME_ATTRIBUTE, autostartprovidername,removecontainerifnochild:true) || configchanged; | ||
273 | + } | ||
274 | + else | ||
275 | + { | ||
276 | + configchanged = SetOrAddAttribute(AUTOSTART_ATTRIBUTE, myapplicationpooladdelement, bool.TrueString.ToLower()) || configchanged; | ||
277 | + configchanged = SetOrAddAttribute(STARTMODE_ATTRIBUTE, myapplicationpooladdelement, StartMode.AlwaysRunning.ToString()) || configchanged; | ||
278 | + configchanged = SetOrAddAttribute(SERVICEAUTOSTARTENABLED_ATTRIBUTE, mysiteapplicationelement, bool.TrueString.ToLower()) || configchanged; | ||
279 | + configchanged = SetOrAddAttribute(PRELOADENABLED_ATTRIBUTE, mysiteapplicationelement, bool.TrueString.ToLower()) || configchanged; | ||
280 | + configchanged = SetOrAddAttribute(SERVICEAUTOSTARTPROVIDER_ATTRIBUTE, mysiteapplicationelement, autostartprovidername) || configchanged; | ||
103 | 281 | ||
104 | - XElement myautostartproviderselement = null; | ||
105 | - XElement myautostartprovideraddelement = null; | ||
106 | - configchanged = SetOrAddElement(SERVICEAUTOSTARTPROVIDERS_ELEMENT, myconfigrootxml, "", out myautostartproviderselement) || configchanged; | ||
107 | - configchanged = SetOrAddElementWithSelectorAttribute(ADD_ELEMENT, myautostartproviderselement, NAME_ATTRIBUTE, autostartprovidername, "", out myautostartprovideraddelement) || configchanged; | ||
108 | - configchanged = SetOrAddAttribute(TYPE_ATTRIBUTE, myautostartprovideraddelement, $"{serviceAutoStartProviderTypeFullName},{serviceAutoStartProviderAssassemblyName }") || configchanged; | 282 | + configchanged = SetOrAddElement(SERVICEAUTOSTARTPROVIDERS_ELEMENT, myconfigrootxml, "", out XElement myautostartproviderselement) || configchanged; |
283 | + configchanged = SetOrAddElementWithSelectorAttribute(ADD_ELEMENT, myautostartproviderselement, NAME_ATTRIBUTE, autostartprovidername, "", out XElement myautostartprovideraddelement) || configchanged; | ||
284 | + configchanged = SetOrAddAttribute(TYPE_ATTRIBUTE, myautostartprovideraddelement, $"{serviceAutoStartProviderTypeFullName},{serviceAutoStartProviderAssassemblyName }") || configchanged; | ||
285 | + } | ||
109 | 286 | ||
110 | if (configchanged) | 287 | if (configchanged) |
111 | { | 288 | { |
112 | //configxml.Save(configfilepath); | 289 | //configxml.Save(configfilepath); |
113 | System.IO.File.WriteAllText(configfilepath, configxml.ToString()); | 290 | System.IO.File.WriteAllText(configfilepath, configxml.ToString()); |
114 | } | 291 | } |
115 | - le.AddDataField("configchanged", configchanged); | ||
116 | - //le.AddDataField("myconfigrootxml", myconfigrootxml); | ||
117 | - le.AddSuccessResult("SUCCESS"); | ||
118 | - return true; | 292 | + string modetxt = disablemode ? "DISABLED" : "ENABLED"; |
293 | + le.AddSuccessResult("SetupAutoStart " + (configchanged ? $"SUCCESSFULLY {modetxt}" : $"NO CHANGE, ALREADY {modetxt}")); | ||
119 | } | 294 | } |
120 | - catch (Exception ex) { le.AddExceptionResult(ex); le.SetLogLevel(LogLevel.Error); return false; } | ||
121 | - finally { le.Write(); } | 295 | + catch (Exception ex) { le.AddExceptionResult(ex); le.SetLogLevel(LogLevel.Error); return; } |
296 | + finally { if (writele) le.Write(); } | ||
297 | + } | ||
298 | + private static bool RemoveAttribute(string attributetoremovename, XElement attrcontainer) | ||
299 | + { | ||
300 | + XAttribute attr = attrcontainer.Attribute(XName.Get(attributetoremovename)); | ||
301 | + if (attr == null) return false; | ||
302 | + attr.Remove(); | ||
303 | + return true; | ||
122 | } | 304 | } |
123 | - private static bool SetOrAddElement(string elementname, XElement elementcontainer, string elementvalue, out XElement myelement) | 305 | + private static bool RemoveElement(string elementtoremovename, XElement elementcontainer,bool removecontainerifnochild=false) |
124 | { | 306 | { |
125 | bool configchanged = false; | 307 | bool configchanged = false; |
126 | - myelement = elementcontainer?.Element(XName.Get(elementname)); | ||
127 | - if (myelement == null) { myelement = new XElement(XName.Get(elementname), ""); elementcontainer.Add(myelement); configchanged = true; } | 308 | + XElement elementtoremove = elementcontainer?.Element(XName.Get(elementtoremovename)); |
309 | + if (elementtoremove == null) return configchanged; | ||
310 | + elementtoremove.Remove(); | ||
311 | + if (removecontainerifnochild) | ||
312 | + { | ||
313 | + var childelements = elementcontainer.Elements(); | ||
314 | + if (childelements == null || !childelements.Any()) elementcontainer.Remove(); | ||
315 | + } | ||
316 | + return (configchanged=true); | ||
317 | + } | ||
318 | + private static bool RemoveElementWithSelectorAttribute(string elementtoremovename, XElement elementcontainer,string selectorattributename, string selectorattributevalue,bool removecontainerifnochild=false) | ||
319 | + { | ||
320 | + bool configchanged = false; | ||
321 | + XElement elementtoremove = elementcontainer?.Elements(XName.Get(elementtoremovename))?.FirstOrDefault(e => e.Attribute(XName.Get(selectorattributename)).Value == selectorattributevalue); | ||
322 | + if (elementtoremove == null) return configchanged; | ||
323 | + elementtoremove.Remove(); | ||
324 | + if (removecontainerifnochild) | ||
325 | + { | ||
326 | + var childelements = elementcontainer.Elements(); | ||
327 | + if (childelements == null || !childelements.Any()) elementcontainer.Remove(); | ||
328 | + } | ||
329 | + return (configchanged = true); | ||
330 | + } | ||
331 | + private static bool SetOrAddElement(string elementtosetname, XElement elementcontainer, string elementvalue, out XElement myelement) | ||
332 | + { | ||
333 | + bool configchanged = false; | ||
334 | + myelement = elementcontainer?.Element(XName.Get(elementtosetname)); | ||
335 | + if (myelement == null) { myelement = new XElement(XName.Get(elementtosetname), ""); elementcontainer.Add(myelement); configchanged = true; } | ||
128 | if (myelement.Value != elementvalue) { myelement.Value = elementvalue; configchanged = true; } | 336 | if (myelement.Value != elementvalue) { myelement.Value = elementvalue; configchanged = true; } |
129 | return configchanged; | 337 | return configchanged; |
130 | } | 338 | } |
131 | - private static bool SetOrAddElementWithSelectorAttribute(string elementname, XElement elementcontainer, string selectorattributename, string selectorattributevalue, string elementvalue, out XElement myelement) | 339 | + private static bool SetOrAddElementWithSelectorAttribute(string elementtosetname, XElement elementcontainer, string selectorattributename, string selectorattributevalue, string elementvalue, out XElement myelement) |
132 | { | 340 | { |
133 | bool configchanged = false; | 341 | bool configchanged = false; |
134 | - myelement = elementcontainer?.Elements(XName.Get(elementname))?.FirstOrDefault(e => e.Attribute(XName.Get(selectorattributename)).Value == selectorattributevalue); | 342 | + myelement = elementcontainer?.Elements(XName.Get(elementtosetname))?.FirstOrDefault(e => e.Attribute(XName.Get(selectorattributename)).Value == selectorattributevalue); |
135 | if (myelement == null) | 343 | if (myelement == null) |
136 | { | 344 | { |
137 | - myelement = new XElement(XName.Get(elementname), ""); | 345 | + myelement = new XElement(XName.Get(elementtosetname), ""); |
138 | elementcontainer.Add(myelement); | 346 | elementcontainer.Add(myelement); |
139 | SetOrAddAttribute(selectorattributename, myelement, selectorattributevalue); | 347 | SetOrAddAttribute(selectorattributename, myelement, selectorattributevalue); |
140 | configchanged = true; | 348 | configchanged = true; |
@@ -142,76 +350,24 @@ namespace Vrh.Web.HangfireBootstrapperNS | @@ -142,76 +350,24 @@ namespace Vrh.Web.HangfireBootstrapperNS | ||
142 | if (myelement.Value != elementvalue) { myelement.Value = elementvalue; configchanged = true; } | 350 | if (myelement.Value != elementvalue) { myelement.Value = elementvalue; configchanged = true; } |
143 | return configchanged; | 351 | return configchanged; |
144 | } | 352 | } |
145 | - private static bool SetOrAddAttribute(string attrname, XElement attrcontainer, string attrvalue) | 353 | + private static bool SetOrAddAttribute(string attributetosetname, XElement attrcontainer, string attrvalue) |
146 | { | 354 | { |
147 | bool configchanged = false; | 355 | bool configchanged = false; |
148 | - XAttribute attr = attrcontainer.Attribute(XName.Get(attrname)); | ||
149 | - if (attr == null) { attr = new XAttribute(XName.Get(attrname), ""); attrcontainer.Add(attr); configchanged = true; } | 356 | + XAttribute attr = attrcontainer.Attribute(XName.Get(attributetosetname)); |
357 | + if (attr == null) { attr = new XAttribute(XName.Get(attributetosetname), ""); attrcontainer.Add(attr); configchanged = true; } | ||
150 | if (attr.Value != attrvalue) { attr.Value = attrvalue; configchanged = true; } | 358 | if (attr.Value != attrvalue) { attr.Value = attrvalue; configchanged = true; } |
151 | return configchanged; | 359 | return configchanged; |
152 | } | 360 | } |
153 | private static string NativeSystemPath | 361 | private static string NativeSystemPath |
154 | { | 362 | { |
155 | - get | ||
156 | - { | ||
157 | - if (Environment.Is64BitOperatingSystem) | ||
158 | - { | ||
159 | - return System.IO.Path.Combine( | ||
160 | - Environment.GetFolderPath(Environment.SpecialFolder.Windows), | ||
161 | - "Sysnative"); | ||
162 | - } | ||
163 | - return Environment.GetFolderPath(Environment.SpecialFolder.System); | ||
164 | - } | 363 | + get { return System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), Environment.Is64BitOperatingSystem?"Sysnative":""); } |
165 | } | 364 | } |
166 | - | ||
167 | - private static string GetCurrentApplicationPoolName() | 365 | + private static string GetCurrentApplicationPoolName(string websitename=null) |
168 | { | 366 | { |
169 | - string appPoolName = string.Empty; | ||
170 | - foreach (Application app in (new ServerManager()).Sites[System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName()].Applications) | ||
171 | - { | ||
172 | - if (app.Path == HttpRuntime.AppDomainAppVirtualPath) { appPoolName = app.ApplicationPoolName; } | ||
173 | - } | ||
174 | - return appPoolName; | 367 | + return (new ServerManager()).Sites[websitename ?? System.Web.Hosting.HostingEnvironment.SiteName].Applications? |
368 | + .FirstOrDefault(app => app.Path == HttpRuntime.AppDomainAppVirtualPath)? | ||
369 | + .ApplicationPoolName; | ||
175 | } | 370 | } |
176 | - | ||
177 | - public static readonly HangfireBootstrapper Instance = new HangfireBootstrapper(); | ||
178 | - private BackgroundJobServer _backgroundJobServer { get; set; } | ||
179 | - private string SqlDBconnectionstring { get; set; } = null; | ||
180 | - private readonly object _lockObject = new object(); | ||
181 | - private bool _started; | ||
182 | - | ||
183 | - | ||
184 | - public HangfireBootstrapper() | ||
185 | - { | ||
186 | - } | ||
187 | - | ||
188 | - public void Start() | ||
189 | - { | ||
190 | - lock (_lockObject) | ||
191 | - { | ||
192 | - if (_started) return; | ||
193 | - _started = true; | ||
194 | - | ||
195 | - HostingEnvironment.RegisterObject(this); | ||
196 | - | ||
197 | - GlobalConfiguration.Configuration | ||
198 | - .UseSqlServerStorage(SqlDBconnectionstring) | ||
199 | - // Specify other options here | ||
200 | - ; | ||
201 | - | ||
202 | - _backgroundJobServer = new BackgroundJobServer(); | ||
203 | - } | ||
204 | - } | ||
205 | - | ||
206 | - public void Stop() | ||
207 | - { | ||
208 | - lock (_lockObject) | ||
209 | - { | ||
210 | - if (_backgroundJobServer != null) { _backgroundJobServer.Dispose(); } | ||
211 | - HostingEnvironment.UnregisterObject(this); | ||
212 | - } | ||
213 | - } | ||
214 | - | ||
215 | - void IRegisteredObject.Stop(bool immediate) { Stop(); } | 371 | + #endregion private method - SetupAutoStart |
216 | } | 372 | } |
217 | } | 373 | } |
Vrh.iScheduler/Monitor .cs
@@ -21,7 +21,7 @@ namespace Vrh.iScheduler | @@ -21,7 +21,7 @@ namespace Vrh.iScheduler | ||
21 | 21 | ||
22 | public class Monitor : IDisposable | 22 | public class Monitor : IDisposable |
23 | { | 23 | { |
24 | - public static void InitHangfire(BackgroundJobServer backgroundserver) | 24 | + public static void InitHangfire(object parameters) |
25 | { | 25 | { |
26 | string ischedulerMonitorXml = "config=ALMiSchedulerMonitor";//TODO:hogy lehet ezt paraméterben átadni?????? | 26 | string ischedulerMonitorXml = "config=ALMiSchedulerMonitor";//TODO:hogy lehet ezt paraméterben átadni?????? |
27 | string ischedulerXml = ""; // vagy "config=ALMiScheduler;"; | 27 | string ischedulerXml = ""; // vagy "config=ALMiScheduler;"; |
@@ -29,6 +29,86 @@ namespace Vrh.iScheduler | @@ -29,6 +29,86 @@ namespace Vrh.iScheduler | ||
29 | Monitor.SetiSchedulerCommonXMLProcessor(m_xmlp); | 29 | Monitor.SetiSchedulerCommonXMLProcessor(m_xmlp); |
30 | if (m_xmlp.EnableWebAppExecution && m_xmlp.CheckInterval > 0) | 30 | if (m_xmlp.EnableWebAppExecution && m_xmlp.CheckInterval > 0) |
31 | { | 31 | { |
32 | + | ||
33 | + //Cron Expression | ||
34 | + // <minute> <hour> <day-of-month> <month> <day-of-week> | ||
35 | + // <minute>:0-59 | ||
36 | + // <hour>:0-23 | ||
37 | + // <day-of-month>:1-31 | ||
38 | + // <month>:1-12 | ||
39 | + // <day-of-week>:0-6 (Sunday to Saturday; 7 is Sunday on some systems) | ||
40 | + //Special Characters in Cron Expression | ||
41 | + // * (all) all values. event should happen for every time unit. For example, “*” in the<minute> field means “for every minute.” | ||
42 | + // ? (any) any value. used for the <day-of-month> and <day-of-week> fields. For example “?” in the<day-of-week> field and 5 in the <day-of-month> | ||
43 | + // field means “5th of every month” irrespective of what day is this of the week. | ||
44 | + // – (range) value range. For example, “10-11” in the<hour> field means “10th and 11th hours.” | ||
45 | + // , (values) multiple values. For example, “MON, WED, FRI“ in <day-of-week> field means on the days “Monday, Wednesday and Friday.” | ||
46 | + // / (increments) specifies the incremental values.For example, a “5/15” in the<minute> field means at “5, 20, 35 and 50 minutes of an hour.” | ||
47 | + // L (last) has different meanings when used in various fields. For example, if it's applied in the <day-of-month> field, it means last day of the month, | ||
48 | + // i.e. “31st of January” and so on as per the calendar month. It can be used with an offset value, like “L-3”, | ||
49 | + // which denotes the “third to last day of the calendar month.” In <day-of-week>, it specifies the “last day of a week.” It can also be used with | ||
50 | + // another value in <day-of-week>, like “6L”, which denotes the “last Friday.” | ||
51 | + // W (weekday) determines the weekday (Monday to Friday) nearest to a given day of the month.For example, if we specify “10W” in the<day-of-month> field, | ||
52 | + // it means the “weekday near to 10th of that month.” So if “10th” is a Saturday, the job will be triggered on “9th,” and if “10th” is a Sunday, | ||
53 | + // it will trigger on “11th.” If we specify “1W” in <day-of-month> and if “1st” is Saturday, the job will be triggered on “3rd,” which is Monday, | ||
54 | + // and it will not jump back to the previous month. | ||
55 | + // # specifies the “N-th” occurrence of a weekday of the month, for example, “third Friday of the month” can be indicated as “6#3”. | ||
56 | + //Cron Special Strings | ||
57 | + // run once at the startup: "@reboot" | ||
58 | + // run once a year: "@yearly" or "@annualy" (="0 0 1 1 *") | ||
59 | + // run once a month: "@monthly" (="0 0 1 * *") | ||
60 | + // run once a week: "@weekly" (="0 0 * * 0") | ||
61 | + // run once a day: "@daily" or "@midnight" (="0 0 * * *") | ||
62 | + // run hourly: "@hourly" (="0 * * * *") | ||
63 | + | ||
64 | + //At 12:00pm (noon) every day: "0 12 * * ?" | ||
65 | + //At Every five minutes starting at 1pm and ending at 1:55pm and then starting at 6pm and ending at 6:55pm, every day: "0/5 13,18 * * ?" | ||
66 | + //At Every minute starting at 1pm and ending at 1:05pm, every day: "0-5 13 * * ?" | ||
67 | + //At 1:15pm and 1:45pm every Tuesday in the month of June: "15,45 13 ? 6 Tue" | ||
68 | + //At 9:30am every Monday, Tuesday, Wednesday, Thursday and Friday: "30 9 ? *MON - FRI" | ||
69 | + //At 9:30am on the 15th day of every month: "30 9 15 * ?" | ||
70 | + //At 6pm on the last day of every month: "0 18 L * ?" | ||
71 | + //At 6pm on the third to last day of every month: "0 18 L - 3 * ?" | ||
72 | + //At 10:30am on the last Thursday of every month: "30 10 ? *5L" | ||
73 | + //At 10am on the third Monday of every month: "0 10 ? *2#3" | ||
74 | + //At 12 midnight on every 5th day, starting from the 10th until the end of the month: "0 0 10 / 5 * ?" | ||
75 | + | ||
76 | + //At every hour: "0 * * * *" | ||
77 | + //At every hour: "@hourly" | ||
78 | + //At once a day at midnight: "0 0 * * *" | ||
79 | + //At every Sunday at midnight: "0 0 * * 0" | ||
80 | + //At every hour on Mondays: "0 * * *1" | ||
81 | + //At twice a day at 6am and 6pm: "0 6,18 * * *" | ||
82 | + //At every 10 minutes: "*/10 * * * *" | ||
83 | + //At every minute on July 20: "* * 20 7 *" | ||
84 | + //At every weekday(Monday to Friday) at 10pm: "0 22 * * 1-5" | ||
85 | + //At at midnight every Tuesday: "0 0 * * 2 *" | ||
86 | + //At every minute during January, February, and May "* * * 1,2,5 *" | ||
87 | + //At every 10 minutes at 5am, starting from 5:10am: "10-59/10 5 * * *" | ||
88 | + //At quarterly on the first day of the month at 8am "0 8 1 */3 *" | ||
89 | + //At every time you turn on the system: "@reboot" | ||
90 | + //At the first Monday of each month, at 8am: "0 8 1-7 * 1" | ||
91 | + //At every Sunday at 4:05 am: "5 4 * * 0" | ||
92 | + //At at 9:15 pm on the 1st and 20th of every month: "15 9 1,20 * *" | ||
93 | + //At at midnight every Wednesday between the 1st and 15th of every month: "0 0 1,15 * 3" | ||
94 | + //At the first day of every month at 2:15pm: "15 14 1 * *" | ||
95 | + //At every day from Monday to Friday every hour from 8 to 5pm: "00 08-17 * * 1-5" | ||
96 | + //At every January 1st at 6:15am: "15 6 1 1 *" | ||
97 | + //At at midnight on the 15th of every month: "0 0 15 * *" | ||
98 | + //At every Monday and Friday: "* * * * 1,5" | ||
99 | + | ||
100 | + //At Every Minute of Every Day: "* * * * *" or "0-59 0-23 0-31 0-12 0-7" | ||
101 | + //At Every 10 Minutes of Every Day: "*/10 * * * *" or "0-59/10 * * * *" or "0,10,20,30,40,50 * * * *" | ||
102 | + //At Every 5 Minutes of the 6am hour starting at 6:07 (tu run at 6:07, 6:012, 6:17, 6:22, 6:27, and so on until 6:57):"07-59/5 06 * * *" | ||
103 | + //At Every day at midnight: "0 0 * * *" or "0 0 * * 0-7" | ||
104 | + //At Thrice Daily: "0 */8 * * *" or "0 0-23/8 * * *" or "0 0,8,16 * * *" | ||
105 | + //At Every weekday at 6am: "0 06 * * 1-5" | ||
106 | + //At Weekends at 6am: "0 06 * * 6,7" or "0 06 * * 6-7" | ||
107 | + //At Once a month on the 20th at 6am: "0 06 20 * *" | ||
108 | + //At Every 4 days at 6am: "0 06 */4 * *" | ||
109 | + //At Every 4 Months at 6am on the 10th: "0 06 10 */4 *" | ||
110 | + | ||
111 | + | ||
32 | string intervalcron = Cron.MinuteInterval((int)(m_xmlp.CheckInterval / 60));//"*/1 * * * *" | 112 | string intervalcron = Cron.MinuteInterval((int)(m_xmlp.CheckInterval / 60));//"*/1 * * * *" |
33 | //RecurringJob.RemoveIfExists("ischedulermonitorcycle"); | 113 | //RecurringJob.RemoveIfExists("ischedulermonitorcycle"); |
34 | RecurringJob.AddOrUpdate("ischedulermonitorcycle", () => new Monitor().Examination(null), intervalcron); | 114 | RecurringJob.AddOrUpdate("ischedulermonitorcycle", () => new Monitor().Examination(null), intervalcron); |
@@ -100,7 +180,7 @@ namespace Vrh.iScheduler | @@ -100,7 +180,7 @@ namespace Vrh.iScheduler | ||
100 | m_timer = new Timer(m_xmlp.CheckInterval * 1000); // !!! Ez itt a jó sor !!! m_timer = new Timer(20000); meg a debug !!! | 180 | m_timer = new Timer(m_xmlp.CheckInterval * 1000); // !!! Ez itt a jó sor !!! m_timer = new Timer(20000); meg a debug !!! |
101 | m_timer.Elapsed += OnExamination; | 181 | m_timer.Elapsed += OnExamination; |
102 | 182 | ||
103 | - var le = new DCLogEntry(LogLevel.Debug, nameof(Monitor) + " constructor. Preparation ready."); | 183 | + var le = new DCLogEntry(LogLevel.Information, nameof(Monitor) + " constructor. Preparation ready."); |
104 | le.AddDataField("iSchedulerMonitor xml path", m_xmlp.ScheduleMonitorXmlPath); | 184 | le.AddDataField("iSchedulerMonitor xml path", m_xmlp.ScheduleMonitorXmlPath); |
105 | le.AddDataField("iScheduler xml path", m_xmlp.ScheduleXmlPath); | 185 | le.AddDataField("iScheduler xml path", m_xmlp.ScheduleXmlPath); |
106 | le.AddDataField("Scheduled object type", m_xmlp.ObjectType); | 186 | le.AddDataField("Scheduled object type", m_xmlp.ObjectType); |