Files
fpc-cron/examples/interval_task.pas

85 lines
2.1 KiB
ObjectPascal

{ interval_task -- minimal example: schedule a 5-second interval
task and let it run for ~12 seconds.
Build:
bash build.sh
/opt/fpcup/fpc/bin/x86_64-linux/fpc -O2 -Sh \
-Fusrc -Fu../fpc-db/src -Fu../fpc-events/src \
-FUbuild -FEbuild -obuild/interval_task examples/interval_task.pas
Run:
./build/interval_task }
program interval_task;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}cthreads,{$ENDIF}
Classes, SysUtils, fpjson, DateUtils,
database.types, database.pool,
log.types, cron.types, cron.runner;
type
THost = class
public
procedure RunTask(const APluginName, ATaskName: string);
procedure Log(Level: TLogLevel; const Category, Msg: string);
end;
procedure THost.RunTask(const APluginName, ATaskName: string);
begin
Writeln(FormatDateTime('hh:nn:ss', Now), ' -- ',
APluginName, '/', ATaskName, ' fired');
end;
procedure THost.Log(Level: TLogLevel; const Category, Msg: string);
begin
Writeln('[', LogLevelChar(Level), '] ', Category, ': ', Msg);
end;
var
Pool: TDBPool;
Sched: TCron;
Host: THost;
Params: TJSONObject;
DBFile: string;
begin
DBFile := '/tmp/fpcsched_example_' + IntToStr(GetProcessID) + '.sqlite3';
if FileExists(DBFile) then DeleteFile(DBFile);
Pool := TDBPool.Create;
Pool.Init(dbSQLite, DBFile);
Host := THost.Create;
try
Sched := TCron.Create(Pool, @Host.RunTask, nil, @Host.Log);
try
Params := TJSONObject.Create;
try
Params.Add('nr',
FormatDateTime('yyyy-mm-dd hh:nn:ss',
LocalTimeToUniversal(Now) - 1));
Pool.ExecSQL(
'INSERT INTO system_scheduler ' +
'(task_name, plugin_name, schedule_type, interval_seconds, ' +
' enabled, next_run, description) VALUES ' +
'(''heartbeat'', ''demo'', ''interval'', 5, 1, :nr, ''demo'')',
Params);
finally
Params.Free;
end;
Sched.RefreshTasks;
Sched.Start;
Sleep(12000);
Sched.Terminate;
finally
Sched.Free;
end;
finally
Host.Free;
Pool.Free;
DeleteFile(DBFile);
end;
end.