Revision a354dfce
Von Moritz Bunkus vor etwa 5 Jahren hinzugefügt
SL/BackgroundJob/Test.pm | ||
---|---|---|
4 | 4 |
|
5 | 5 |
use parent qw(SL::BackgroundJob::Base); |
6 | 6 |
|
7 |
use SL::System::TaskServer; |
|
8 |
|
|
7 | 9 |
sub run { |
8 | 10 |
my ($self, $db_obj) = @_; |
9 | 11 |
my $data = $db_obj->data_as_hash; |
10 | 12 |
|
11 |
$::lxdebug->message(0, "Test job is being executed.");
|
|
13 |
$::lxdebug->message(0, "Test job ID " . $db_obj->id . " is being executed on node " . SL::System::TaskServer::node_id() . ".");
|
|
12 | 14 |
|
13 | 15 |
die "Oh cruel world: " . $data->{exception} if $data->{exception}; |
14 | 16 |
|
SL/DB/Manager/BackgroundJob.pm | ||
---|---|---|
8 | 8 |
use SL::DB::Helper::Paginated; |
9 | 9 |
use SL::DB::Helper::Sorted; |
10 | 10 |
|
11 |
use SL::System::TaskServer; |
|
12 |
|
|
11 | 13 |
sub object_class { 'SL::DB::BackgroundJob' } |
12 | 14 |
|
13 | 15 |
__PACKAGE__->make_manager_methods; |
... | ... | |
36 | 38 |
cron_spec => '', |
37 | 39 |
next_run_at => undef, |
38 | 40 |
next_run_at => { le => $now } ] ]); |
39 |
|
|
40 |
return $class->get_all(query => [ or => [ @interval_args, @once_args ] ]); |
|
41 |
my @node_filter; |
|
42 |
|
|
43 |
my $node_id = SL::System::TaskServer->node_id; |
|
44 |
if ($::lx_office_conf{task_server}->{only_run_tasks_for_this_node}) { |
|
45 |
@node_filter = (node_id => $node_id); |
|
46 |
} else { |
|
47 |
@node_filter = ( |
|
48 |
or => [ |
|
49 |
node_id => undef, |
|
50 |
node_id => '', |
|
51 |
node_id => $node_id, |
|
52 |
]); |
|
53 |
} |
|
54 |
|
|
55 |
return $class->get_all(query => [ or => [ @interval_args, @once_args ], @node_filter ]); |
|
41 | 56 |
} |
42 | 57 |
|
43 | 58 |
1; |
SL/DB/MetaSetup/BackgroundJob.pm | ||
---|---|---|
15 | 15 |
id => { type => 'serial', not_null => 1 }, |
16 | 16 |
last_run_at => { type => 'timestamp' }, |
17 | 17 |
next_run_at => { type => 'timestamp' }, |
18 |
node_id => { type => 'text' }, |
|
18 | 19 |
package_name => { type => 'varchar', length => 255 }, |
19 | 20 |
type => { type => 'varchar', length => 255 }, |
20 | 21 |
); |
SL/System/TaskServer.pm | ||
---|---|---|
11 | 11 |
use File::Slurp; |
12 | 12 |
use File::Spec::Functions qw(:ALL); |
13 | 13 |
use File::Temp; |
14 |
use Sys::Hostname (); |
|
14 | 15 |
|
15 | 16 |
use SL::System::Process; |
16 | 17 |
|
... | ... | |
22 | 23 |
|
23 | 24 |
use constant PID_BASE => "users/pid"; |
24 | 25 |
|
26 |
my $node_id; |
|
27 |
|
|
25 | 28 |
sub status { |
26 | 29 |
my ($self) = @_; |
27 | 30 |
|
... | ... | |
63 | 66 |
return kill('ALRM', $pid) ? 1 : undef; |
64 | 67 |
} |
65 | 68 |
|
69 |
sub node_id { |
|
70 |
return $node_id if $node_id; |
|
71 |
|
|
72 |
$node_id = ($::lx_office_conf{task_server} // {})->{node_id} || Sys::Hostname::hostname(); |
|
73 |
|
|
74 |
return $node_id; |
|
75 |
} |
|
76 |
|
|
66 | 77 |
# |
67 | 78 |
# private methods |
68 | 79 |
# |
config/kivitendo.conf.default | ||
---|---|---|
189 | 189 |
debug = 0 |
190 | 190 |
# Chose a system user the daemon should run under when started as root. |
191 | 191 |
run_as = |
192 |
# Task servers can run on multiple machines. Each needs its own unique |
|
193 |
# ID. If unset, it defaults to the host name. All but one task server |
|
194 |
# must have 'only_run_tasks_for_this_node' set to 1. |
|
195 |
node_id = |
|
196 |
only_run_tasks_for_this_node = 0 |
|
192 | 197 |
|
193 | 198 |
[task_server/notify_on_failure] |
194 | 199 |
# If you want email notifications for failed jobs then set this to a |
scripts/task_server.pl | ||
---|---|---|
322 | 322 |
run_single_job_for_all_clients(); |
323 | 323 |
return; |
324 | 324 |
} |
325 |
$::lxdebug->message(LXDebug::INFO(), "The task server for node " . SL::System::TaskServer::node_id() . " is up and running."); |
|
325 | 326 |
|
326 | 327 |
while (1) { |
327 | 328 |
$SIG{'ALRM'} = 'IGNORE'; |
sql/Pg-upgrade2/add_node_id_to_background_jobs.sql | ||
---|---|---|
1 |
-- @tag: add_node_id_to_background_jobs |
|
2 |
-- @description: Spalte 'node_id' in 'background_jobs' |
|
3 |
-- @depends: release_3_5_4 |
|
4 |
ALTER TABLE background_jobs |
|
5 |
ADD COLUMN node_id TEXT; |
Auch abrufbar als: Unified diff
Task-Server auf unterschiedlichen Maschinen laufen lassen können
Jede Task-Server-Instanz und jeder Hintergrundjob haben nun ein neues
Attribute »node_id«. Darüber kann gesteuert werden, dass bestimmte
Jobs nur von einer bestimmten Instanz ausgeführt werden.
Die »node_id« eines neu angelegten Jobs ist standardmäßig leer. Das
bedeutet, dass ein Job von einer beliebigen Task-Server-Instanz
ausgeführt werden kann.
Die »node_id« eines Task-Servers ist standardmäßig der Hostname (siehe
ausgabe von »perl -MSys::Hostname -le 'print hostname()'«), kann aber
in der Konfigurationsdatei überschrieben werden (»[task_server]« →
»node_id«).
Zusätzlich gibt es den Konfigurationsparameter »[task_server]« →
»only_run_tasks_for_this_node«. Ist dieser Parameter gesetzt, so führt
der Task-Server nur diejenigen Jobs aus, deren »node_id«-Feld mit der
»node_id« der Task-Server-Instanz übereinstimmt. Andernfalls werden
auch diejenigen Jobs ausgeführt, deren »node_id«-Feld leer ist.
Achtung: es findet momentan keinerlei Locking statt. Das bedeutet,
dass es für jede Datenbank nur eine Task-Server-Instanz geben darf,
bei der »only_run_tasks_for_this_node« nicht gesetzt ist. Für
Load-Balancing eignet sich das also bisher noch nicht.