1 package org.oddjob.jobs.job; 2 3 import org.oddjob.Stateful; 4 import org.oddjob.Stoppable; 5 import org.oddjob.framework.SimpleJob; 6 import org.oddjob.state.JobState; 7 import org.oddjob.state.JobStateEvent; 8 import org.oddjob.state.JobStateListener; 9 import org.oddjob.state.StateMemory; 10 import org.oddjob.util.OddjobConfigException; 11 12 20 21 public class DependsJob extends SimpleJob implements Stoppable, 22 JobStateListener { 23 private static final long serialVersionUID = 20050806; 24 25 30 private transient Stateful job; 31 32 private transient volatile JobStateEvent event; 33 34 40 synchronized public void setJob(Stateful node) { 41 this.job = node; 42 } 43 44 49 synchronized public Stateful getJob() { 50 return this.job; 51 } 52 53 58 protected int execute() throws Throwable { 59 if (job == null) { 60 throw new OddjobConfigException("Job must be set."); 61 } 62 try { 63 job.addJobStateListener(this); 64 while (!stop) { 65 JobState state = event.getJobState(); 66 logger().debug("State is [" + state + "]"); 67 long sleep = 10; 68 if (state == JobState.READY) { 69 if (job instanceof Runnable ) { 70 StateMemory remember = new StateMemory(); 71 remember.run((Runnable ) job); 72 if (remember.getJobState() == JobState.COMPLETE) { 73 return 0; 74 } else if (remember.getJobState() == JobState.NOT_COMPLETE) { 75 return 1; 76 } else if (remember.getJobState() == JobState.EXCEPTION) { 77 throw remember.getThrowable(); 78 } 79 } 83 else { 84 sleep = 0; 86 } 87 } else if (state == JobState.COMPLETE) { 88 return 0; 89 } else if (state == JobState.NOT_COMPLETE) { 90 return 1; 91 } else if (state == JobState.EXCEPTION) { 92 throw event.getException(); 93 } else { 94 logger().debug("[" + job + "] still executing..."); 95 sleep = 1000; 96 } 97 sleep(sleep); 98 } 99 100 return 0; 101 } finally { 102 job.removeJobStateListener(this); 103 } 104 } 105 106 111 public void jobStateChange(JobStateEvent event) { 112 this.event = event; 113 synchronized (this) { 114 notifyAll(); 115 } 116 } 117 } 118 | Popular Tags |