Added runonce call

This commit is contained in:
2025-08-23 17:15:22 +02:00
parent e782852d6f
commit ca56a66713
2 changed files with 71 additions and 2 deletions

View File

@@ -56,8 +56,8 @@ public class PythonScriptable : IScriptable
public void ExecFunction(string name, ICallbackInfos? callbackInfos = null) public void ExecFunction(string name, ICallbackInfos? callbackInfos = null)
{ {
int retryCounter = 0; int retryCounter = 0;
retry: retry:
try try
{ {
using (Py.GIL()) using (Py.GIL())
@@ -113,6 +113,8 @@ public class ScriptToolSet
} }
} }
public class RunOnceCallbackInfos : ICallbackInfos {}
public class IntervalCallbackInfos : ICallbackInfos public class IntervalCallbackInfos : ICallbackInfos
{ {
public object? sender; public object? sender;

View File

@@ -61,6 +61,10 @@ public class WorkerCollection
switch (callConfig.Type) switch (callConfig.Type)
{ {
case "runonce":
RunOnceCall runOnceCall = new(worker, _logger, callConfig);
worker.Calls.Add(runOnceCall);
break;
case "interval": case "interval":
if (callConfig.Interval is null) if (callConfig.Interval is null)
{ {
@@ -241,6 +245,69 @@ public interface ICall
public DateTime? LastSuccessfulExecution { get; set; } public DateTime? LastSuccessfulExecution { get; set; }
} }
public class RunOnceCall : ICall
{
public ILogger _logger;
public bool IsEnabled { get; set; }
public bool IsExecuting { get; set; }
public Worker Worker { get; }
public CallConfig CallConfig { get; set; }
public DateTime? LastExecution { get; set; }
public DateTime? LastSuccessfulExecution { get; set; }
public RunOnceCall(Worker worker, ILogger logger, CallConfig callConfig)
{
Worker = worker;
_logger = logger;
CallConfig = callConfig;
IsEnabled = true;
IsExecuting = false;
IndexAsync();
}
public void Start()
{
IndexAsync();
IsEnabled = true;
}
public void Stop()
{
IsEnabled = false;
}
private async void IndexAsync()
{
try
{
DateTime beforeExecution = DateTime.Now;
IsExecuting = true;
try
{
await Task.Run(() => Worker.Scriptable.Update(new RunOnceCallbackInfos()));
}
finally
{
IsExecuting = false;
LastExecution = beforeExecution;
Worker.LastExecution = beforeExecution;
}
DateTime afterExecution = DateTime.Now;
WorkerCollection.UpdateCallAndWorkerTimestamps(this, Worker, beforeExecution, afterExecution);
}
catch (Exception ex)
{
_logger.LogError("Exception occurred in a Call of Worker \"{name}\": \"{ex}\"", Worker.Name, ex.Message);
}
}
public HealthCheckResult HealthCheck()
{
return HealthCheckResult.Healthy(); // TODO implement proper healthcheck
}
}
public class IntervalCall : ICall public class IntervalCall : ICall
{ {
public System.Timers.Timer Timer; public System.Timers.Timer Timer;