Commit 262a14433f77cec7839e1da3e1aa6dd081fdfaee
1 parent
ca09d8bb
v1.2.0
- monitor profilok megadási lehetőségének beépítése -pl: <add key="WebServerHostedService_iSchedulerHangfire:configlist" value="ALMiSchedulerMonitor:config=ALMiSchedulerMonitor:120,CPiSchedulerMonitor:config=CPiSchedulerMonitor:120" />
Showing
13 changed files
with
234 additions
and
76 deletions
Show diff stats
... | ... | @@ -0,0 +1,20 @@ |
1 | +using System; | |
2 | +using System.Collections.Generic; | |
3 | +using System.Linq; | |
4 | +using System.Text; | |
5 | +using System.Threading.Tasks; | |
6 | + | |
7 | +namespace TEST | |
8 | +{ | |
9 | + class Program | |
10 | + { | |
11 | + static void Main(string[] args) | |
12 | + { | |
13 | + int sec; | |
14 | + sec = 55; Console.WriteLine($"*/{(int)(sec / 60)} * * * *"); | |
15 | + sec = 75; Console.WriteLine($"*/{(int)(sec / 60)} * * * *"); | |
16 | + sec = 120; Console.WriteLine($"*/{(int)(sec / 60)} * * * *"); | |
17 | + Console.ReadLine(); | |
18 | + } | |
19 | + } | |
20 | +} | ... | ... |
... | ... | @@ -0,0 +1,36 @@ |
1 | +using System.Reflection; | |
2 | +using System.Runtime.CompilerServices; | |
3 | +using System.Runtime.InteropServices; | |
4 | + | |
5 | +// General Information about an assembly is controlled through the following | |
6 | +// set of attributes. Change these attribute values to modify the information | |
7 | +// associated with an assembly. | |
8 | +[assembly: AssemblyTitle("TEST")] | |
9 | +[assembly: AssemblyDescription("")] | |
10 | +[assembly: AssemblyConfiguration("")] | |
11 | +[assembly: AssemblyCompany("")] | |
12 | +[assembly: AssemblyProduct("TEST")] | |
13 | +[assembly: AssemblyCopyright("Copyright © 2023")] | |
14 | +[assembly: AssemblyTrademark("")] | |
15 | +[assembly: AssemblyCulture("")] | |
16 | + | |
17 | +// Setting ComVisible to false makes the types in this assembly not visible | |
18 | +// to COM components. If you need to access a type in this assembly from | |
19 | +// COM, set the ComVisible attribute to true on that type. | |
20 | +[assembly: ComVisible(false)] | |
21 | + | |
22 | +// The following GUID is for the ID of the typelib if this project is exposed to COM | |
23 | +[assembly: Guid("fa347448-26b1-4c84-a0e4-319744116dd7")] | |
24 | + | |
25 | +// Version information for an assembly consists of the following four values: | |
26 | +// | |
27 | +// Major Version | |
28 | +// Minor Version | |
29 | +// Build Number | |
30 | +// Revision | |
31 | +// | |
32 | +// You can specify all the values or you can default the Build and Revision Numbers | |
33 | +// by using the '*' as shown below: | |
34 | +// [assembly: AssemblyVersion("1.0.*")] | |
35 | +[assembly: AssemblyVersion("1.0.0.0")] | |
36 | +[assembly: AssemblyFileVersion("1.0.0.0")] | ... | ... |
... | ... | @@ -0,0 +1,53 @@ |
1 | +<?xml version="1.0" encoding="utf-8"?> | |
2 | +<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |
3 | + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> | |
4 | + <PropertyGroup> | |
5 | + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | |
6 | + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> | |
7 | + <ProjectGuid>{FA347448-26B1-4C84-A0E4-319744116DD7}</ProjectGuid> | |
8 | + <OutputType>Exe</OutputType> | |
9 | + <RootNamespace>TEST</RootNamespace> | |
10 | + <AssemblyName>TEST</AssemblyName> | |
11 | + <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion> | |
12 | + <FileAlignment>512</FileAlignment> | |
13 | + <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> | |
14 | + <Deterministic>true</Deterministic> | |
15 | + </PropertyGroup> | |
16 | + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> | |
17 | + <PlatformTarget>AnyCPU</PlatformTarget> | |
18 | + <DebugSymbols>true</DebugSymbols> | |
19 | + <DebugType>full</DebugType> | |
20 | + <Optimize>false</Optimize> | |
21 | + <OutputPath>bin\Debug\</OutputPath> | |
22 | + <DefineConstants>DEBUG;TRACE</DefineConstants> | |
23 | + <ErrorReport>prompt</ErrorReport> | |
24 | + <WarningLevel>4</WarningLevel> | |
25 | + </PropertyGroup> | |
26 | + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> | |
27 | + <PlatformTarget>AnyCPU</PlatformTarget> | |
28 | + <DebugType>pdbonly</DebugType> | |
29 | + <Optimize>true</Optimize> | |
30 | + <OutputPath>bin\Release\</OutputPath> | |
31 | + <DefineConstants>TRACE</DefineConstants> | |
32 | + <ErrorReport>prompt</ErrorReport> | |
33 | + <WarningLevel>4</WarningLevel> | |
34 | + </PropertyGroup> | |
35 | + <ItemGroup> | |
36 | + <Reference Include="System" /> | |
37 | + <Reference Include="System.Core" /> | |
38 | + <Reference Include="System.Xml.Linq" /> | |
39 | + <Reference Include="System.Data.DataSetExtensions" /> | |
40 | + <Reference Include="Microsoft.CSharp" /> | |
41 | + <Reference Include="System.Data" /> | |
42 | + <Reference Include="System.Net.Http" /> | |
43 | + <Reference Include="System.Xml" /> | |
44 | + </ItemGroup> | |
45 | + <ItemGroup> | |
46 | + <Compile Include="Program.cs" /> | |
47 | + <Compile Include="Properties\AssemblyInfo.cs" /> | |
48 | + </ItemGroup> | |
49 | + <ItemGroup> | |
50 | + <None Include="App.config" /> | |
51 | + </ItemGroup> | |
52 | + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> | |
53 | +</Project> | |
0 | 54 | \ No newline at end of file | ... | ... |
Vrh.Web.Reporting.sln
... | ... | @@ -28,6 +28,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Vrh.Web.iScheduler.Report.L |
28 | 28 | EndProject |
29 | 29 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Vrh.Web.Reporting", "Vrh.Web.Reporting\Vrh.Web.Reporting.csproj", "{C0EE2B4C-A281-4C18-BFC7-48427985F732}" |
30 | 30 | EndProject |
31 | +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TEST", "TEST\TEST.csproj", "{FA347448-26B1-4C84-A0E4-319744116DD7}" | |
32 | +EndProject | |
31 | 33 | Global |
32 | 34 | GlobalSection(SolutionConfigurationPlatforms) = preSolution |
33 | 35 | Debug|Any CPU = Debug|Any CPU |
... | ... | @@ -74,6 +76,10 @@ Global |
74 | 76 | {C0EE2B4C-A281-4C18-BFC7-48427985F732}.Debug|Any CPU.Build.0 = Debug|Any CPU |
75 | 77 | {C0EE2B4C-A281-4C18-BFC7-48427985F732}.Release|Any CPU.ActiveCfg = Release|Any CPU |
76 | 78 | {C0EE2B4C-A281-4C18-BFC7-48427985F732}.Release|Any CPU.Build.0 = Release|Any CPU |
79 | + {FA347448-26B1-4C84-A0E4-319744116DD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |
80 | + {FA347448-26B1-4C84-A0E4-319744116DD7}.Debug|Any CPU.Build.0 = Debug|Any CPU | |
81 | + {FA347448-26B1-4C84-A0E4-319744116DD7}.Release|Any CPU.ActiveCfg = Release|Any CPU | |
82 | + {FA347448-26B1-4C84-A0E4-319744116DD7}.Release|Any CPU.Build.0 = Release|Any CPU | |
77 | 83 | EndGlobalSection |
78 | 84 | GlobalSection(SolutionProperties) = preSolution |
79 | 85 | HideSolutionNode = FALSE | ... | ... |
Vrh.Web.Reporting/Properties/AssemblyInfo.cs
... | ... | @@ -36,6 +36,6 @@ using System.Runtime.InteropServices; |
36 | 36 | // You can specify all the values or you can default the Build and Revision Numbers |
37 | 37 | // by using the '*' as shown below: |
38 | 38 | // [assembly: AssemblyVersion("1.0.*")] |
39 | -[assembly: AssemblyVersion("1.1.2.0")] | |
40 | -[assembly: AssemblyFileVersion("1.1.2.0")] | |
41 | -[assembly: AssemblyInformationalVersion("1.1.2")] | |
39 | +[assembly: AssemblyVersion("1.2.0.0")] | |
40 | +[assembly: AssemblyFileVersion("1.2.0.0")] | |
41 | +[assembly: AssemblyInformationalVersion("1.2.0")] | ... | ... |
Vrh.Web.Reporting/WebServerHostedServiceStarter.cs
... | ... | @@ -217,27 +217,30 @@ namespace Vrh.Web.WebServerHostedServiceStarterNS |
217 | 217 | private object ExternalInitializerStarStopLocker = new object(); |
218 | 218 | private static readonly WebServerHostedServiceStarter IISHostedServiceStarterInstance = new WebServerHostedServiceStarter(); |
219 | 219 | private static List<Tuple<Action, Action>> externalinitializerList = new List<Tuple<Action, Action>>(); |
220 | - private static bool Config_DisablAutoStart | |
220 | + #endregion private members | |
221 | + | |
222 | + #region private members - appconfig elements | |
223 | + private static bool Config_DisableAutoStart | |
221 | 224 | { |
222 | 225 | get |
223 | 226 | { |
224 | - if (!config_disablautostart.HasValue) | |
227 | + if (!config_disableautostart.HasValue) | |
225 | 228 | { |
226 | 229 | string disableautostartstring = ConfigurationManager.AppSettings[DISABLEAUTOSTART]; |
227 | - if (string.IsNullOrWhiteSpace(disableautostartstring)) config_disablautostart = DISABLEAUTOSTARTDEFAULT; | |
228 | - else if (disableautostartstring.ToLower() == bool.TrueString.ToLower()) config_disablautostart = true; | |
229 | - else if (disableautostartstring.ToLower() != bool.FalseString.ToLower()) config_disablautostart = false; | |
230 | - else config_disablautostart = DISABLEAUTOSTARTDEFAULT; | |
230 | + if (string.IsNullOrWhiteSpace(disableautostartstring)) config_disableautostart = DISABLEAUTOSTARTDEFAULT; | |
231 | + else if (disableautostartstring.ToLower() == bool.TrueString.ToLower()) config_disableautostart = true; | |
232 | + else if (disableautostartstring.ToLower() != bool.FalseString.ToLower()) config_disableautostart = false; | |
233 | + else config_disableautostart = DISABLEAUTOSTARTDEFAULT; | |
231 | 234 | } |
232 | - return config_disablautostart.Value; | |
235 | + return config_disableautostart.Value; | |
233 | 236 | } |
234 | 237 | } |
235 | - private static bool? config_disablautostart = null; | |
236 | - private const string IISHOSTEDSERVICESTARTER = "IISHostedServiceStarter:"; | |
238 | + private static bool? config_disableautostart = null; | |
239 | + private const string IISHOSTEDSERVICESTARTER = "WebServerHostedServiceStarter:"; | |
237 | 240 | private const string DISABLEAUTOSTART = IISHOSTEDSERVICESTARTER + "disableautostart"; |
238 | 241 | private const bool DISABLEAUTOSTARTDEFAULT = false; |
239 | 242 | private const string NOEXTERNALINITIALIZERSAREREGISTERED = "No external initializers are registered!"; |
240 | - #endregion private members | |
243 | + #endregion private members - appconfig elements | |
241 | 244 | |
242 | 245 | #region private method - _SetupAutoStart |
243 | 246 | /// <summary> |
... | ... | @@ -302,8 +305,8 @@ namespace Vrh.Web.WebServerHostedServiceStarterNS |
302 | 305 | le.AddDataField("SetupAutoStart serviceAutoStartProviderTypeFullName", serviceAutoStartProviderTypeFullName); |
303 | 306 | le.AddDataField("SetupAutoStart serviceAutoStartProviderAssassemblyName", serviceAutoStartProviderAssassemblyName); |
304 | 307 | |
305 | - if (!disablemode.HasValue) disablemode = Config_DisablAutoStart; | |
306 | - le.AddDataField("DisablAautoStart", disablemode.Value); | |
308 | + if (!disablemode.HasValue) disablemode = Config_DisableAutoStart; | |
309 | + le.AddDataField("DisableautoStart", disablemode.Value); | |
307 | 310 | |
308 | 311 | string filecontent; |
309 | 312 | bool configchanged; | ... | ... |
Vrh.Web.iScheduler.Report.Lib/Areas/iSchedulerReport/Controllers/iSchedulerReportController.cs
... | ... | @@ -627,7 +627,7 @@ namespace Vrh.Web.iScheduler.Report.Areas.iSchedulerReport.Controllers |
627 | 627 | try |
628 | 628 | { |
629 | 629 | SchedulerPlugin schedulerPlugin = new SchedulerPlugin(); |
630 | - ReturnInfoJSON ri = schedulerPlugin.TimedTask( | |
630 | + ReturnInfoJSON ri = schedulerPlugin.ExecuteScheduledTask( | |
631 | 631 | model.XmlCs, |
632 | 632 | base.ForcedLanguageCode, |
633 | 633 | model.PackageName, |
... | ... | @@ -710,7 +710,7 @@ namespace Vrh.Web.iScheduler.Report.Areas.iSchedulerReport.Controllers |
710 | 710 | OperationId = OperationId ?? (SRConstants.Operations.EXECUTE_KEY); CheckIfParameterIsEmpty(OperationId, "OperationId"); |
711 | 711 | |
712 | 712 | if (String.IsNullOrEmpty(xml)) xml = "???"; |
713 | - executionmessage = (new SchedulerPlugin()).TimedTask(xml, base.ForcedLanguageCode, ObjectId, OperationId, TimeStamp, GroupId).ReturnMessage; | |
713 | + executionmessage = (new SchedulerPlugin()).ExecuteScheduledTask(xml, base.ForcedLanguageCode, ObjectId, OperationId, TimeStamp, GroupId).ReturnMessage; | |
714 | 714 | rijson.ReturnValue = 0; |
715 | 715 | } |
716 | 716 | catch (Exception ex) | ... | ... |
Vrh.iScheduler.Interface/ISchedulerPlugin.cs
... | ... | @@ -51,7 +51,7 @@ namespace Vrh.iScheduler.Interfaces |
51 | 51 | /// <returns> |
52 | 52 | /// Egy <c>ReturnInfoJSON</c> objektum a message részében formázott html üzenettel. |
53 | 53 | /// </returns> |
54 | - ReturnInfoJSON TimedTask(string xml, string lcid, string objectId, string operationId, string timeStamp, string groupId = null); | |
54 | + ReturnInfoJSON ExecuteScheduledTask(string xml, string lcid, string objectId, string operationId, string timeStamp, string groupId = null); | |
55 | 55 | |
56 | 56 | /// <summary> |
57 | 57 | /// Ütemezendő objektumok létezésének ellenőrzése. | ... | ... |
Vrh.iScheduler.Report/SchedulerPlugin.cs
... | ... | @@ -249,14 +249,14 @@ namespace Vrh.iScheduler.Report |
249 | 249 | /// <returns> |
250 | 250 | /// Egy <c>ReturnInfoJSON</c> objektum a message részében formázott html üzenettel. |
251 | 251 | /// </returns> |
252 | - public ReturnInfoJSON TimedTask(string xml, string lcid, string objectId, string operationId, string timeStamp, string groupId = null) | |
252 | + public ReturnInfoJSON ExecuteScheduledTask(string xml, string lcid, string objectId, string operationId, string timeStamp, string groupId = null) | |
253 | 253 | { |
254 | 254 | string errorOccured = "Error occured when the TimedTask method is running."; |
255 | 255 | try |
256 | 256 | { |
257 | 257 | #region DEBUG |
258 | 258 | #if DEBUG |
259 | - string thisfn = string.Concat(nameof(SchedulerPlugin), ".", nameof(TimedTask), ": "); | |
259 | + string thisfn = string.Concat(nameof(SchedulerPlugin), ".", nameof(ExecuteScheduledTask), ": "); | |
260 | 260 | System.Diagnostics.Debug.WriteLine($"{thisfn}START"); |
261 | 261 | var sw = new System.Diagnostics.Stopwatch(); |
262 | 262 | sw.Start(); | ... | ... |
Vrh.iScheduler/Monitor .cs
... | ... | @@ -32,16 +32,18 @@ namespace Vrh.iScheduler |
32 | 32 | var le = new DCLogEntry(LogLevel.Information, $"{typeof(WAHostedMonitorHangfire).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}"); |
33 | 33 | try |
34 | 34 | { |
35 | - _MonitorHangfireInstance._StartHangfire(le); | |
36 | - string ischedulerMonitorXml = "config=ALMiSchedulerMonitor";//TODO:hogy lehet ezt paraméterben átadni?????? | |
37 | - string ischedulerXml = ""; // vagy "config=ALMiScheduler;"; | |
38 | - var m_xmlp = new iSchedulerXMLProcessor(ischedulerMonitorXml, ischedulerXml); | |
39 | - Monitor.SetiSchedulerCommonXMLProcessor(m_xmlp); | |
40 | - if (m_xmlp.EnableWebAppExecution && m_xmlp.CheckInterval > 0) | |
35 | + _StartHangfire(le); | |
36 | + | |
37 | + foreach (string cf in Config_iSchedulerConfigList) | |
41 | 38 | { |
42 | - IntervalCronExpression = Cron.MinuteInterval((int)(m_xmlp.CheckInterval / 60));//"*/1 * * * *" | |
43 | - //RecurringJob.RemoveIfExists("ischedulermonitorcycle"); | |
44 | - RecurringJob.AddOrUpdate("ischedulermonitorcycle", () => new Monitor().Examination(null), IntervalCronExpression); | |
39 | + if (!ParseiSchedulerConfigString(cf, out string jobid, out string xmlcs, out int checkintervalinseconds)) { le.AddDataField("Adding iScheduler job", $"iScheduler job definition error, job skipped! definition:{cf}"); continue; }; | |
40 | + le.AddDataField("Adding iScheduler job", cf); | |
41 | + | |
42 | + IntervalCronExpression = $"*/{(int)(checkintervalinseconds / 60)} * * * *"; | |
43 | + RecurringJob.AddOrUpdate(jobid, () => Monitor.ExaminationRunOnce(Process.GetCurrentProcess().Id, xmlcs), IntervalCronExpression); | |
44 | + //Hangfire.SqlServer.SqlServerStorageOptions. | |
45 | + //IntervalCronExpression = Cron.MinuteInterval((int)(m_xmlp.CheckIntervalInSeconds / 60));//"*/1 * * * *" | |
46 | + //RecurringJob.RemoveIfExists("ischedulermonitorcycle"); | |
45 | 47 | //var HanfireJobId = BackgroundJob.Enqueue(() => new Monitor().Examination(null)); |
46 | 48 | //RecurringJob.AddOrUpdate("ischedulermonitorcycle", () => new Monitor(m_xmlp).Examination(null), intervalcron); //minutes interval |
47 | 49 | //RecurringJob.AddOrUpdate("ischedulermonitorcycle", () => new Monitor(m_xmlp).Examination(null), $"{(int)(m_xmlp.CheckInterval / 60)} * * * *"); // cron expression |
... | ... | @@ -54,12 +56,12 @@ namespace Vrh.iScheduler |
54 | 56 | public static void Stop() |
55 | 57 | { |
56 | 58 | var le = new DCLogEntry(LogLevel.Information, $"{typeof(WAHostedMonitorHangfire).FullName}.{System.Reflection.MethodBase.GetCurrentMethod().Name}"); |
57 | - try { _MonitorHangfireInstance._StopHangfire(le); } | |
59 | + try { _StopHangfire(le); } | |
58 | 60 | catch (Exception ex) { le.AddExceptionResult(ex); le.SetLogLevel(LogLevel.Error); } |
59 | 61 | finally { le.Write(); } |
60 | 62 | } |
61 | 63 | |
62 | - | |
64 | + #region private members - Cron expression | |
63 | 65 | /// <summary> |
64 | 66 | /// Cron Expression |
65 | 67 | /// <minute> <hour> <day-of-month> <month> <day-of-week> |
... | ... | @@ -143,15 +145,10 @@ namespace Vrh.iScheduler |
143 | 145 | /// At Every 4 Months at 6am on the 10th: "0 06 10 */4 *" |
144 | 146 | /// </summary> |
145 | 147 | private static string IntervalCronExpression = null; |
146 | - private static WAHostedMonitorHangfire _MonitorHangfireInstance = new WAHostedMonitorHangfire(); | |
148 | + #endregion private members - Cron expression | |
147 | 149 | |
148 | - private BackgroundJobServer _HangfireBackgroundJobServer { get; set; } | |
149 | - private static readonly object _HangfireStarterLocker = new object(); | |
150 | - private static bool _HangFireRunning = false; | |
151 | - const string HANGFIRE = "HangfireBootstrapper:"; | |
152 | - const string HANGFIREDBCONNECTIONSTRING = HANGFIRE + "dbconnectionstring"; | |
153 | - const string HANGFIRESQLDBCONNECTIONSTRINGNAMEDEFAULT = "HANGFIRESQLDB"; | |
154 | - private void _StartHangfire(DCLogEntry le) | |
150 | + #region private members - _StartHangfire,_StopHangfire | |
151 | + private static void _StartHangfire(DCLogEntry le) | |
155 | 152 | { |
156 | 153 | lock (_HangfireStarterLocker) |
157 | 154 | { |
... | ... | @@ -165,7 +162,7 @@ namespace Vrh.iScheduler |
165 | 162 | _HangFireRunning = true; |
166 | 163 | } |
167 | 164 | } |
168 | - private void _StopHangfire(DCLogEntry le) | |
165 | + private static void _StopHangfire(DCLogEntry le) | |
169 | 166 | { |
170 | 167 | lock (_HangfireStarterLocker) |
171 | 168 | { |
... | ... | @@ -175,20 +172,59 @@ namespace Vrh.iScheduler |
175 | 172 | _HangFireRunning = false; |
176 | 173 | } |
177 | 174 | } |
178 | - private string Config_HangFireConnectionString | |
175 | + //private static WAHostedMonitorHangfire _MonitorHangfireInstance = new WAHostedMonitorHangfire(); | |
176 | + private static BackgroundJobServer _HangfireBackgroundJobServer { get; set; } | |
177 | + private static readonly object _HangfireStarterLocker = new object(); | |
178 | + private static bool _HangFireRunning = false; | |
179 | + #endregion private members - _StartHangfire,_StopHangfire | |
180 | + | |
181 | + #region appconfig elements | |
182 | + const string WSHSHANGFIRE = "WebServerHostedService_iSchedulerHangfire:"; | |
183 | + const string HANGFIREDBCONNECTIONSTRING = WSHSHANGFIRE + "dbconnectionstring"; | |
184 | + const string HANGFIRECONFIGLIST = WSHSHANGFIRE + "configlist"; | |
185 | + private static List<string> Config_iSchedulerConfigList | |
186 | + { | |
187 | + get | |
188 | + { | |
189 | + if (config_ischedulerconfiglist == null) | |
190 | + { | |
191 | + string configliststring = ConfigurationManager.AppSettings[HANGFIRECONFIGLIST]; | |
192 | + if (string.IsNullOrWhiteSpace(configliststring)) configliststring = ""; | |
193 | + config_ischedulerconfiglist = configliststring.Split(new char[] { ',', ';' },StringSplitOptions.RemoveEmptyEntries).ToList(); | |
194 | + } | |
195 | + return config_ischedulerconfiglist; | |
196 | + } | |
197 | + } | |
198 | + private static List<string> config_ischedulerconfiglist = null; | |
199 | + private static bool ParseiSchedulerConfigString(string cf, out string jobid, out string xmlcs, out int checkintervalinseconds) | |
200 | + { | |
201 | + jobid = "";xmlcs = ""; checkintervalinseconds = 60; | |
202 | + if (string.IsNullOrWhiteSpace(cf)) return false; | |
203 | + try | |
204 | + { | |
205 | + jobid = cf.Split(':')[0]; | |
206 | + xmlcs = cf.Split(':')[1]; | |
207 | + checkintervalinseconds = int.Parse(cf.Split(':')[2]); | |
208 | + } | |
209 | + catch { } | |
210 | + if (checkintervalinseconds < 60) checkintervalinseconds = 60; | |
211 | + return !string.IsNullOrWhiteSpace(jobid) && !string.IsNullOrWhiteSpace(xmlcs) && checkintervalinseconds >= 60; | |
212 | + } | |
213 | + private static string Config_HangFireConnectionString | |
179 | 214 | { |
180 | 215 | get |
181 | 216 | { |
182 | 217 | if (config_hangfireconnectionstring == null) |
183 | 218 | { |
184 | 219 | string HangfireSqlDBConnectionString = ConfigurationManager.AppSettings[HANGFIREDBCONNECTIONSTRING]; |
185 | - if (string.IsNullOrWhiteSpace(HangfireSqlDBConnectionString)) HangfireSqlDBConnectionString = HANGFIRESQLDBCONNECTIONSTRINGNAMEDEFAULT; | |
220 | + if (string.IsNullOrWhiteSpace(HangfireSqlDBConnectionString)) HangfireSqlDBConnectionString = "HANGFIRESQLDB"; | |
186 | 221 | config_hangfireconnectionstring = ConnectionStringStore.GetSQL(HangfireSqlDBConnectionString); |
187 | 222 | } |
188 | 223 | return config_hangfireconnectionstring; |
189 | 224 | } |
190 | 225 | } |
191 | - private string config_hangfireconnectionstring = null; | |
226 | + private static string config_hangfireconnectionstring = null; | |
227 | + #endregion appconfig elements | |
192 | 228 | } |
193 | 229 | } |
194 | 230 | namespace Vrh.iScheduler |
... | ... | @@ -273,12 +309,7 @@ namespace Vrh.iScheduler |
273 | 309 | #region Private members |
274 | 310 | |
275 | 311 | private Timer m_timer; |
276 | - private iSchedulerXMLProcessor m_xmlp; | |
277 | - private static iSchedulerXMLProcessor CommonM_xmlp; | |
278 | - public static void SetiSchedulerCommonXMLProcessor(iSchedulerXMLProcessor m_xmlp) | |
279 | - { | |
280 | - CommonM_xmlp = m_xmlp; | |
281 | - } | |
312 | + private iSchedulerXMLProcessor m_xmlp=null; | |
282 | 313 | #endregion Private members |
283 | 314 | |
284 | 315 | #region Constructor |
... | ... | @@ -290,32 +321,26 @@ namespace Vrh.iScheduler |
290 | 321 | /// <param name="scheduleXmlPath">ScheduleExecute akció által használt iScheduler.xml elérési helye a névvel együtt |
291 | 322 | /// <param name="pluginReference">Az indító plugin példányra mutató referencia |
292 | 323 | /// a távoli gépen. Ha egy gépen fut, akkor nem kötelező.</param> |
293 | - public Monitor(string scheduleMonitorXmlPath, string scheduleXmlPath) | |
294 | - { | |
295 | - Init(new iSchedulerXMLProcessor(scheduleMonitorXmlPath, scheduleXmlPath)); | |
296 | - } | |
297 | - public Monitor(iSchedulerXMLProcessor m_xmlp) | |
298 | - { | |
299 | - Init(m_xmlp); | |
300 | - } | |
301 | - public Monitor() | |
302 | - { | |
303 | - Init(CommonM_xmlp); | |
304 | - } | |
305 | - private void Init(iSchedulerXMLProcessor m_xmlp) | |
324 | + public Monitor(string scheduleMonitorXmlPath, string scheduleXmlPath) { Init(new iSchedulerXMLProcessor(scheduleMonitorXmlPath, scheduleXmlPath)); } | |
325 | + public Monitor(iSchedulerXMLProcessor m_xmlp) { Init(m_xmlp); } | |
326 | + public Monitor() { } | |
327 | + private void Init(iSchedulerXMLProcessor m_xmlp,bool enabletimer=true) | |
306 | 328 | { |
307 | 329 | this.m_xmlp = m_xmlp; |
308 | 330 | //try |
309 | 331 | //{ |
310 | - m_timer = new Timer(m_xmlp.CheckInterval * 1000); // !!! Ez itt a jó sor !!! m_timer = new Timer(20000); meg a debug !!! | |
311 | - m_timer.Elapsed += OnExamination; | |
332 | + if (!enabletimer) | |
333 | + { | |
334 | + m_timer = new Timer(m_xmlp.CheckIntervalInSeconds * 1000); // !!! Ez itt a jó sor !!! m_timer = new Timer(20000); meg a debug !!! | |
335 | + m_timer.Elapsed += OnExamination; | |
336 | + } | |
312 | 337 | |
313 | 338 | var le = new DCLogEntry(LogLevel.Information, nameof(Monitor) + " constructor. Preparation ready."); |
314 | 339 | le.AddDataField("iSchedulerMonitor xml path", m_xmlp.ScheduleMonitorXmlPath); |
315 | 340 | le.AddDataField("iScheduler xml path", m_xmlp.ScheduleXmlPath); |
316 | 341 | le.AddDataField("Scheduled object type", m_xmlp.ObjectType); |
317 | 342 | le.AddDataField("Group Id", m_xmlp.GroupId); |
318 | - le.AddDataField("Check interval", m_xmlp.CheckInterval.ToString()); | |
343 | + le.AddDataField("Check interval", m_xmlp.CheckIntervalInSeconds.ToString()); | |
319 | 344 | le.Write(); |
320 | 345 | |
321 | 346 | //} |
... | ... | @@ -346,7 +371,7 @@ namespace Vrh.iScheduler |
346 | 371 | private void OnExamination(object sender, ElapsedEventArgs e) |
347 | 372 | { |
348 | 373 | m_timer.Stop(); |
349 | - Examination(e.SignalTime); | |
374 | + Examination(e.SignalTime,null); | |
350 | 375 | m_timer.Start(); |
351 | 376 | } |
352 | 377 | |
... | ... | @@ -356,23 +381,25 @@ namespace Vrh.iScheduler |
356 | 381 | /// </summary> |
357 | 382 | /// <param name="signalTime"></param> |
358 | 383 | [DisableConcurrentExecution(1000)] |
359 | - public void Examination(DateTime? signalTime) | |
384 | + public void Examination(DateTime? signalTime,DCLogEntry le) | |
360 | 385 | { |
361 | - var le = new DCLogEntry(LogLevel.Debug,nameof(Examination)); | |
386 | + bool writele = false; | |
387 | + if (le == null) { le = new DCLogEntry(LogLevel.Debug, nameof(Examination)); writele = true; } | |
362 | 388 | if (!signalTime.HasValue) signalTime = DateTime.Now; |
363 | 389 | try |
364 | 390 | { |
365 | 391 | using (SqlConnection cnn = new SqlConnection(m_xmlp.DatabaseConnectionString)) |
366 | 392 | { |
367 | 393 | cnn.Open(); |
368 | - le.AddDataField("Database connection opened", $"Connection string: {m_xmlp.DatabaseConnectionString}"); | |
394 | + le.AddDataField($"{nameof(Examination)}: Database connection opened", $"Connection string: {m_xmlp.DatabaseConnectionString}"); | |
369 | 395 | |
370 | 396 | string scmd = string.Concat( |
371 | 397 | " select *", |
372 | 398 | " from iScheduler.Schedules s", |
373 | 399 | " inner join iScheduler.ScheduleObjects so on s.ScheduleObjectId = so.Id", |
374 | 400 | " where s.[State] = 0 and s.OperationTime < @signalTime", |
375 | - " and so.ObjectType = @objectType and so.ObjectGroupId = @groupId"); | |
401 | + " and so.ObjectType = @objectType and so.ObjectGroupId = @groupId" | |
402 | + ); | |
376 | 403 | using (SqlCommand cmd = new SqlCommand(scmd, cnn)) |
377 | 404 | { |
378 | 405 | cmd.Parameters.Add(new SqlParameter("signalTime", signalTime)); |
... | ... | @@ -395,13 +422,13 @@ namespace Vrh.iScheduler |
395 | 422 | ScheduledJobCounter++; |
396 | 423 | int id = rdr.GetInt32(ixID); |
397 | 424 | DateTime jobstartedat = DateTime.Now; |
398 | - le.AddDataField($"Scheduled job #{ScheduledJobCounter} started", $"id={id}"); | |
425 | + le.AddDataField($"{nameof(Examination)}: Scheduled job #{ScheduledJobCounter} started", $"id={id}"); | |
399 | 426 | se.Run(id); |
400 | - le.AddDataField($"Scheduled job #{ScheduledJobCounter} finished at", (DateTime.Now).Subtract(jobstartedat).ToString(@"hh\:mm\:ss")); | |
401 | - le.AddSuccessResult("Scheduled job execution SUCCESS"); | |
427 | + le.AddDataField($"{nameof(Examination)}: Scheduled job #{ScheduledJobCounter} finished at", (DateTime.Now).Subtract(jobstartedat).ToString(@"hh\:mm\:ss")); | |
428 | + le.AddSuccessResult($"{nameof(Examination)}: Scheduled job execution SUCCESS"); | |
402 | 429 | }//while (rdr.Read()) |
403 | 430 | }//if (rdr.HasRows) |
404 | - else { le.AddSuccessResult($"No scheduled job found!"); } | |
431 | + else { le.AddSuccessResult($"{nameof(Examination)}: No scheduled job found!"); } | |
405 | 432 | } |
406 | 433 | } |
407 | 434 | } |
... | ... | @@ -410,6 +437,13 @@ namespace Vrh.iScheduler |
410 | 437 | le.SetLogLevel(LogLevel.Error); |
411 | 438 | le.AddExceptionResult(ex); |
412 | 439 | } |
440 | + finally { if (writele) le.Write(); } | |
441 | + } | |
442 | + public static void ExaminationRunOnce(int pid, string xmlcs) | |
443 | + { | |
444 | + var le = new DCLogEntry(LogLevel.Debug, nameof(ExaminationRunOnce)); | |
445 | + try { (new Monitor(xmlcs, "")).Examination(null, le); } | |
446 | + catch (Exception ex) { le.AddExceptionResult(ex); } | |
413 | 447 | finally { le.Write(); } |
414 | 448 | } |
415 | 449 | #endregion Examination | ... | ... |
Vrh.iScheduler/ScheduleExecute.cs
... | ... | @@ -164,7 +164,7 @@ namespace Vrh.iScheduler |
164 | 164 | #region Plugin elérési mód esetén |
165 | 165 | try |
166 | 166 | { |
167 | - rijson = this.Plugin.TimedTask( | |
167 | + rijson = this.Plugin.ExecuteScheduledTask( | |
168 | 168 | this.Scheduler.Plugin.ObjectXml, |
169 | 169 | this.Scheduler.LCID, |
170 | 170 | sch.ScheduleObject.ObjectId, | ... | ... |
Vrh.iScheduler/iSchedulerXMLProcessor.cs
... | ... | @@ -126,7 +126,7 @@ namespace Vrh.iScheduler |
126 | 126 | /// Minimum: 60 sec (1perc), maximum: 86400 sec (1nap). |
127 | 127 | /// Ha a tulajdonság nem létezik, vagy értelmezhetetlen, akkor a minimum lesz. |
128 | 128 | /// </summary> |
129 | - public int CheckInterval | |
129 | + public int CheckIntervalInSeconds | |
130 | 130 | { |
131 | 131 | get |
132 | 132 | { | ... | ... |