Commit 262a14433f77cec7839e1da3e1aa6dd081fdfaee

Authored by Schwirg László
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" />
TEST/App.config 0 → 100644
... ... @@ -0,0 +1,6 @@
  1 +<?xml version="1.0" encoding="utf-8" ?>
  2 +<configuration>
  3 + <startup>
  4 + <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
  5 + </startup>
  6 +</configuration>
0 7 \ No newline at end of file
... ...
TEST/Program.cs 0 → 100644
... ... @@ -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 +}
... ...
TEST/Properties/AssemblyInfo.cs 0 → 100644
... ... @@ -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")]
... ...
TEST/TEST.csproj 0 → 100644
... ... @@ -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(&quot;{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}&quot;) = &quot;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 {
... ...