package
BackgroundJob;
sub
new {
my
$class
=
shift
;
my
$interval
=
shift
;
my
$self
=
$class
->SUPER::new(
@_
);
$self
->{INTERVAL} =
$interval
;
$self
->{COUNT} = 1;
$self
->{PAUSED} = 0;
return
$self
;
}
sub
execute {
my
$self
=
shift
;
return
if
$self
->paused;
my
$interval
=
$self
->{INTERVAL};
my
$count
=
$self
->{COUNT};
if
(
$count
eq
$interval
) {
$self
->SUPER::execute(
@_
);
$self
->{COUNT} = 1;
}
else
{
$self
->{COUNT} =
$count
+ 1
}
}
sub
paused {
my
$self
=
shift
;
$self
->{PAUSED} =
shift
if
@_
;
return
$self
->{PAUSED}
}
$VERSION
=
"0.08"
;
sub
new {
my
$class
=
shift
;
my
$self
=
$class
->SUPER::new(
@_
);
$self
->addPreConfig(
-cycleinterval
=> [
'PASSIVE'
,
undef
,
undef
, 10],
);
$self
->{JOBS} = {};
return
$self
;
}
sub
cycle {
my
$self
=
shift
;
delete
$self
->{
'cycle_id'
};
my
$jobs
=
$self
->_jobs;
for
(
keys
%$jobs
) {
my
$call
=
$jobs
->{
$_
};
$call
->execute;
}
$self
->cycleStart;
}
sub
cycleActive {
return
exists
$_
[0]->{
'cycle_id'
}
}
sub
cycleStart {
my
$self
=
shift
;
my
$cycle
=
$self
->configGet(
'-cycleinterval'
);
$self
->{
'cycle_id'
} =
$self
->
after
(
$cycle
, [
'cycle'
,
$self
])
unless
$self
->cycleActive;
}
sub
cycleStop {
my
$self
=
shift
;
my
$id
=
$self
->{
'cycle_id'
};
$self
->afterCancel(
$id
)
if
defined
$id
;
delete
$self
->{
'cycle_id'
};
}
sub
jobAdd {
my
(
$self
,
$name
,
$interval
,
@call
) =
@_
;
unless
(
defined
$name
) {
croak
"You must specify a name"
;
return
}
unless
(
defined
$interval
) {
croak
"You must specify an interval"
;
return
}
unless
(
@call
) {
croak
"No callback defined"
;
return
}
my
$new
= new BackgroundJob(
$interval
,
@call
);
my
$jobs
=
$self
->_jobs;
if
(
exists
$jobs
->{
$name
}) {
croak
"Job $name already exists"
;
return
}
$jobs
->{
$name
} =
$new
;
$self
->cycleStart;
}
sub
jobExists {
my
(
$self
,
$name
) =
@_
;
my
$jobs
=
$self
->_jobs;
return
exists
$jobs
->{
$name
}
}
sub
jobGet {
my
(
$self
,
$name
) =
@_
;
unless
(
defined
$name
) {
croak
"You must specify a name"
;
return
}
my
$jobs
=
$self
->_jobs;
unless
(
exists
$jobs
->{
$name
}) {
croak
"Job $name does not exist"
;
return
}
return
$jobs
->{
$name
};
}
sub
jobList {
my
$self
=
shift
;
my
$jobs
=
$self
->_jobs;
return
keys
%$jobs
}
sub
jobPause {
my
(
$self
,
$name
) =
@_
;
my
$job
=
$self
->jobGet(
$name
);
$job
->paused(1)
if
defined
$job
;
}
sub
jobRemove {
my
(
$self
,
$name
) =
@_
;
my
$job
=
$self
->jobGet(
$name
);
my
$jobs
=
$self
->_jobs;
delete
$jobs
->{
$name
}
if
defined
$job
;
my
@list
=
$self
->jobList;
$self
->cycleStop
unless
@list
;
}
sub
jobResume {
my
(
$self
,
$name
) =
@_
;
my
$job
=
$self
->jobGet(
$name
);
$job
->paused(0)
if
defined
$job
;
}
sub
_jobs {
return
$_
[0]->{JOBS}
}
1;