1 8 package org.mmbase.applications.crontab.builders; 9 10 import org.mmbase.applications.crontab.*; 11 import org.mmbase.bridge.*; 12 import org.mmbase.module.core.*; 13 import org.mmbase.util.logging.*; 14 15 21 public class CronJobs extends MMObjectBuilder implements Runnable { 22 23 private static Logger log = Logging.getLoggerInstance(CronJobs.class); 24 25 CronDaemon cronDaemon = null; 26 27 public CronJobs() { 28 Thread t = new Thread (this); 29 t.setDaemon(true); 30 t.start(); 31 } 32 33 36 public void run() { 37 while (!MMBase.getMMBase().getState()) { 38 try { 39 Thread.sleep(2000); 40 } catch (InterruptedException e) { 41 log.warn("thread interrupted, cronjobs will not be loaded"); 42 return; 43 } 44 } 45 cronDaemon = CronDaemon.getInstance(); 46 47 NodeIterator nodeIterator = getCloud().getNodeManager(getTableName()).getList(null, null, null).nodeIterator(); 48 while (nodeIterator.hasNext()) { 49 Node node = nodeIterator.nextNode(); 50 CronEntry entry = null; 51 try { 52 entry = createCronEntry(node); 53 NodeList servers = node.getRelatedNodes("mmservers"); 54 if (servers.size() > 0) { 55 String machineName = MMBase.getMMBase().getMachineName(); 56 boolean found = false; 57 for (int i=0; i<servers.size(); i++) { 58 Node server = servers.getNode(i); 59 String name = server.getStringValue("name"); 60 if (name != null && name.equalsIgnoreCase(machineName)) { 61 log.service("Adding cron entry [" + entry + "] for server [" + name + "]"); 62 cronDaemon.add(entry); 63 found = true; 64 break; 65 } else { 66 log.service("Ignoring related server [" + name + "], does not equal servername [" + machineName + "]"); 67 } 68 } 69 if (!found) { 70 log.service("NOT Adding cron entry [" + entry + "], not related to server [" + machineName + "]"); 71 } 72 } else { 73 log.service("Adding cron entry [" + entry + "]"); 74 cronDaemon.add(entry); 75 } 76 } catch (Exception e) { 77 log.warn("did not add cronjob with id " + node.getNumber() + " because of error " + e.getMessage()); 78 } 79 } 80 } 81 82 85 public int insert(String owner, MMObjectNode objectNodenode) { 86 int number = super.insert(owner, objectNodenode); 87 try { 88 if (cronDaemon != null) { 89 Node node = getCloud().getNode(number); 90 cronDaemon.add(createCronEntry(node)); 91 } 92 } catch (Exception e) { 93 throw new RuntimeException ("error while creating cron entry with id " + number + " error " + e.getMessage(), e); 94 } 95 return number; 96 } 97 98 102 public boolean commit(MMObjectNode objectNodenode) { 103 boolean retval = super.commit(objectNodenode); 104 Node node = getCloud().getNode(objectNodenode.getNumber()); 105 CronEntry entry = cronDaemon.getCronEntry("" + node.getNumber()); 106 if (entry == null) { 107 log.warn("cron entry with ID " + node.getNumber() + " was not found. this usualy means it was invalid"); 108 } else { 109 cronDaemon.remove(entry); 110 } 111 try { 112 cronDaemon.add(createCronEntry(node)); 113 } catch (Exception e) { 114 throw new RuntimeException ("error while creating cron entry with id " + node.getNumber() + " error " + e.getMessage()); 115 } 116 return retval; 117 } 118 119 122 public void removeNode(MMObjectNode objectNodenode) { 123 String number = "" + objectNodenode.getNumber(); 124 super.removeNode(objectNodenode); 125 CronEntry entry = cronDaemon.getCronEntry(number); 126 if (entry != null) { 127 cronDaemon.remove(entry); 128 } 129 } 130 131 private CronEntry createCronEntry(Node node) throws Exception { 132 return new CronEntry("" + node.getNumber(), node.getStringValue("crontime"), node.getStringValue("name"), node.getStringValue("classfile"), node.getStringValue("config"),node.getIntValue("type")); 133 } 134 135 private Cloud getCloud() { 136 return LocalContext.getCloudContext().getCloud("mmbase"); 137 } 138 139 142 public void setDefaults(MMObjectNode node) { 143 super.setDefaults(node); 144 node.setValue("type", CronEntry.DEFAULT_JOB_TYPE); 145 node.setValue("crontime", "*/5 * * * *"); 146 } 147 148 } 149 | Popular Tags |