package Zing::Timer; use 5.014; use strict; use warnings; use registry 'Zing::Types'; use routines; use Data::Object::Class; use Data::Object::ClassHas; use Zing::Logic::Timer; extends 'Zing::Process'; our $VERSION = '0.27'; # VERSION # ATTRIBUTES has 'on_schedules' => ( is => 'ro', isa => 'Maybe[CodeRef]', opt => 1, ); # BUILDERS fun new_logic($self) { my $debug = $self->env->debug; Zing::Logic::Timer->new(debug => $debug, process => $self) } # METHODS method schedules(@args) { return $self if !$self->on_schedules; my $schedules = $self->on_schedules->($self, @args); return $schedules; } 1; =encoding utf8 =head1 NAME Zing::Timer - Timer Process =cut =head1 ABSTRACT Timer Process =cut =head1 SYNOPSIS package MyApp; use parent 'Zing::Timer'; sub schedules { [ # every ten minutes ['*/10 * * * *', ['tasks'], { do => 1 }], ] } package main; my $myapp = MyApp->new; # $myapp->execute; =cut =head1 DESCRIPTION This package provides a L which places pre-defined messages into message queues based on time-based scehdules. It supports minute-level resolution and functions similarly to a crontab (cron table). =cut =head1 INHERITS This package inherits behaviors from: L =cut =head1 LIBRARIES This package uses type constraints from: L =cut =head1 SCENARIOS This package supports the following scenarios: =cut =head2 schedules # given: synopsis $myapp->schedules; # schedule structure # [$interval, $queues, $message, $adjustment] # predefined intervals # @annually is at 00:00 on day-of-month 1 in january # @daily is at 00:00 every day # @hourly is at minute 0 every hour # @minute is at every minute # @monthly is at 00:00 on day-of-month 1 # @weekend is at 00:00 on saturday # @weekly is at 00:00 on monday # @yearly is at 00:00 on day-of-month 1 in january # other schedule examples # every minute # ['* * * * *', ['tasks'], { do => 1 }] # every hour (on the half hour) # ['30 * * * *', ['tasks'], { do => 1 }] # every 15th minute # ['*/15 * * * *', ['tasks'], { do => 1 }] The schedules method is meant to be implemented by a subclass and is automatically invoked when the process is executed, it should return a list of schedules. A single schedule takes the form of C<[$interval, $queues, $message]> where C<$interval> is represented as a cron-expression or using one of the predefined interval name, e.g. C<@yearly>, C<@annually>, C<@monthly>, C<@weekly>, C<@weekend>, C<@daily>, C<@hourly>, or C<@minute>. =cut =head1 ATTRIBUTES This package has the following attributes: =cut =head2 on_schedules on_schedules(Maybe[CodeRef]) This attribute is read-only, accepts C<(Maybe[CodeRef])> values, and is optional. =cut =head1 METHODS This package implements the following methods: =cut =head2 schedules schedules(Any @args) : ArrayRef[Schedule] The schedules method, when not overloaded, executes the callback in the L attribute and expects a list of crontab schedules to be processed. =over 4 =item schedules example #1 my $timer = Zing::Timer->new( on_schedules => sub { [['@hourly', ['tasks'], { do => 1 }]] }, ); $timer->schedules; =back =cut =head1 AUTHOR Al Newkirk, C =head1 LICENSE Copyright (C) 2011-2019, Al Newkirk, et al. This is free software; you can redistribute it and/or modify it under the terms of the The Apache License, Version 2.0, as elucidated in the L<"license file"|https://github.com/cpanery/zing/blob/master/LICENSE>. =head1 PROJECT L L L L L L =cut