ActionScript 3 Cronjob [beta]

I wrote a cronjob class in actionscript 3 during my flight back to Lima from San Francisco. This could help you manage repetitive or single tasks in the future using a cron task syntax.

Here is the cronjob main class:

  1. package utils {
  2. import flash.events.EventDispatcher;
  3. import flash.events.TimerEvent;
  4. import flash.utils.Timer;
  5. import events.CronEvent;
  6. public class Cron extends EventDispatcher {
  7. private var $__timer:Timer = new Timer(60000);
  8. private var $__running:Boolean = false;
  9. private var $__tasks:Array = new Array();
  10. private var $__tasksId:Object = new Object();
  11. public function Cron(){
  12. $__timer.addEventListener(TimerEvent.TIMER, checkTask);
  13. }
  14. public function start():void{
  15. if(!$__running){
  16. var secRes:uint = (60 - ((new Date()).getSeconds() + 1)) * 1000;
  17. var delay:Timer = new Timer(secRes, 1);
  18. delay.addEventListener(TimerEvent.TIMER, function(event:TimerEvent):void{
  19. checkTask((event.clone() as TimerEvent));
  20. $__timer.start();
  21. });
  22. delay.start();
  23. $__running = true;
  24. }
  25. }
  26. public function stop():void{
  27. $__running = false;
  28. $__timer.stop();
  29. }
  30. public function addTask(task:String):void{
  31. task = trim(task);
  32. validateTask(task);
  33. $__tasksId[task.split(" ").pop()] = $__tasks.push(task);
  34. }
  35. public function removeTask(id:String):void{
  36. if($__tasksId[id] == null) throw new Error("Task id " + id + " not found");
  37. $__tasks[$__tasksId[id]] = null;
  38. $__tasksId[id] = null;
  39. delete $__tasksId[id];
  40. }
  41. public function get running():Boolean{
  42. return $__running;
  43. }
  44. private function trim(str:String):String{
  45. return str.replace(/^\s+|\s+$/g, '');
  46. }
  47. private function validateTask(str:String):void{
  48. if(str.split(" ").length != 6) throw new Error("Task format error");
  49. if($__tasks[str.split(" ").pop()] != null) throw new Error("Task id already exists");
  50. }
  51. private function toObject(list:Array):Object{
  52. var res:Object = new Object();
  53. for(var i:uint=0;i<list.length;i++){
  54. if(list[i] != "") res[list[i]] = true;
  55. }
  56. return res;
  57. }
  58. private function $__transform(item:String):*{
  59. if(item.indexOf(",") != -1 && item.indexOf("/") == -1){
  60. return toObject(item.split(","));
  61. }else if(item.indexOf("/") != -1 && item.indexOf(",") == -1){
  62. var items:Array = new Array("0");
  63. for(var i:uint=0;i<(60 - uint(item.split("/")[1]));){
  64. i += uint(item.split("/")[1]);
  65. items.push(i);
  66. }
  67. return toObject(items);
  68. }else{
  69. return item;
  70. }
  71. }
  72. private function $__check(item:*, index:int, array:Array):void{
  73. var date:Date = new Date();
  74. var pieces:Array = item.split(" ");
  75. var mins:* = $__transform(pieces.shift());
  76. var hours:* = $__transform(pieces.shift());
  77. var days:* = $__transform(pieces.shift());
  78. var months:* = $__transform(pieces.shift());
  79. var weekDay:* = $__transform(pieces.shift());
  80. var id:String = pieces.shift();
  81. var dispatch:Boolean = (mins is String) ? (date.getMinutes().toString() == mins || mins == "*"): ((date.getMinutes() + 1).toString() in mins);
  82. dispatch = dispatch && ((hours is String) ? (date.getHours().toString() == hours || hours == "*"): ((date.getHours() + 1).toString() in hours));
  83. dispatch = dispatch && ((days is String) ? (date.getDate().toString() == days || days == "*"): ((date.getDate() + 1).toString() in days));
  84. dispatch = dispatch && ((months is String) ? ((date.getMonth() + 1).toString() == months || months == "*"): ((date.getMonth() + 2).toString() in months));
  85. dispatch = dispatch && ((weekDay is String) ? (date.getDay().toString() == weekDay || weekDay == "*"): ((date.getDay() + 1).toString() in weekDay));
  86. dispatchEvent(new CronEvent(CronEvent.TASK, id));
  87. }
  88. private function checkTask(event:TimerEvent):void{
  89. $__tasks.forEach($__check);
  90. }
  91. }
  92. }

And here is the CronEvent class:

  1. package events {
  2. import flash.events.Event;
  3. public class CronEvent extends Event {
  4. public static const TASK:String = "task";
  5. public var id:String = "";
  6. public function CronEvent(type:String, id:String=""){
  7. this.id = id;
  8. super(type);
  9. }
  10. override public function clone():Event{
  11. return new CronEvent(type, id);
  12. }
  13. }
  14. }

Here is how you can use it:

  1. import utils.Cron;
  2. import events.CronEvent;
  3. var c:Cron = new Cron();
  4. c.addEventListener(CronEvent.TASK, taskHandler);
  5. function taskHandler(event:CronEvent):void{
  6. trace ("The task id is: " + event.id);
  7. }
  8. c.addTask("* * * * * mainID"); // repetitive task (every minute)
  9. c.addTask("0 0 * * * otherID"); // repetitive task every day at 00:00
  10. c.start();

I haven’t had the chance to test it carefully. Please let me know if you find anything.

—fernando