1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
# --
# Copyright (C) 2001-2021 OTRS AG, https://otrs.com/
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (GPL). If you
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
# --
package Kernel::System::AsynchronousExecutor;
use strict;
use warnings;
use Kernel::System::VariableCheck qw(:all);
our @ObjectDependencies = (
'Kernel::Config',
'Kernel::System::Log',
'Kernel::System::Scheduler',
);
=head1 NAME
Kernel::System::AsynchronousExecutor - base class to delegate tasks to the OTRS Scheduler Daemon
=head1 DESCRIPTION
ObjectManager controlled modules can add this base class to execute some time consuming tasks in the
background using the separate process OTRS Scheduler Daemon.
=head1 PUBLIC INTERFACE
=head2 AsyncCall()
creates a scheduler daemon task to execute a function asynchronously.
my $Success = $Object->AsyncCall(
ObjectName => 'Kernel::System::Ticket', # optional, if not given the object is used from where
# this function was called
FunctionName => 'MyFunction', # the name of the function to execute
FunctionParams => \%MyParams, # a ref with the required parameters for the function
Attempts => 3, # optional, default: 1, number of tries to lock the
# task by the scheduler
MaximumParallelInstances => 1, # optional, default: 0 (unlimited), number of same
# function calls from the same object that can be
# executed at the the same time
);
Returns:
$Success = 1; # of false in case of an error
=cut
sub AsyncCall {
my ( $Self, %Param ) = @_;
# Do not schedule asynchronous task if the feature has been disabled.
return 1 if $Kernel::OM->Get('Kernel::Config')->Get('DisableAsyncCalls');
my $FunctionName = $Param{FunctionName};
if ( !IsStringWithData($FunctionName) ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Function needs to be a non empty string!",
);
return;
}
my $ObjectName = $Param{ObjectName} || ref $Self;
# create a new object
my $LocalObject;
eval {
$LocalObject = $Kernel::OM->Get($ObjectName);
};
# check if is possible to create the object
if ( !$LocalObject ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Could not create $ObjectName object!",
);
return;
}
# check if object reference is the same as expected
if ( ref $LocalObject ne $ObjectName ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "$ObjectName object is not valid!",
);
return;
}
# check if the object can execute the function
if ( !$LocalObject->can($FunctionName) ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "$ObjectName can not execute $FunctionName()!",
);
return;
}
if ( $Param{FunctionParams} && !ref $Param{FunctionParams} ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "FunctionParams needs to be a hash or list reference.",
);
return;
}
# define the task name with object name and concatenate the function name
my $TaskName = substr "$ObjectName-$FunctionName()", 0, 255;
# create a new task
my $TaskID = $Kernel::OM->Get('Kernel::System::Scheduler')->TaskAdd(
Type => 'AsynchronousExecutor',
Name => $TaskName,
Attempts => $Param{Attempts} || 1,
MaximumParallelInstances => $Param{MaximumParallelInstances} || 0,
Data => {
Object => $ObjectName,
Function => $FunctionName,
Params => $Param{FunctionParams} // {},
},
);
if ( !$TaskID ) {
$Kernel::OM->Get('Kernel::System::Log')->Log(
Priority => 'error',
Message => "Could not create new AsynchronousExecutor: '$TaskName' task!",
);
return;
}
return 1;
}
1;
=head1 TERMS AND CONDITIONS
This software is part of the OTRS project (L<https://otrs.org/>).
This software comes with ABSOLUTELY NO WARRANTY. For details, see
the enclosed file COPYING for license information (GPL). If you
did not receive this file, see L<https://www.gnu.org/licenses/gpl-3.0.txt>.
=cut
|