Writing an Oddjob job.
Oddjob's philosophy is to be as unobtrusive as possible. A job in Oddjob is just an
java.lang.Runnable or a java.util.concurrent.Callable.
For all but the most advanced interaction with the framework, you don't need Oddjob on the classpath.
Here's how easy it is to write a job:
package org.oddjob.devguide;
public class HelloWorldJob implements Runnable {
public void run() {
System.out.println("Hello World!");
}
}
To get Oddjob to run our job we need to create a configuration file:
<oddjob>
<job>
<bean class="org.oddjob.devguide.HelloWorldJob"/>
</job>
</oddjob>
And run it:
$ java -jar run-oddjob.jar -cp examples/classes -f examples/devguide/hello1.xml
Hello World!
Notice that the classpath option -cp is after the -jar. This is Oddjobs option, not Java's. This is because -jar ignores any existing classpath and any classpath option.
We can now also load it in Oddjob Explorer (but we need still need the classpath).
$ java -jar run-oddjob.jar -cp examples/classes examples/devguide/hello1.xml
We get:
Here's a configurable job.
package org.oddjob.devguide;
public class HelloPeopleJob implements Runnable {
private String[] who;
public void setWho(String[] who) {
this.who = who;
}
public String[] getWho() {
return who;
}
public void run() {
for (int i = 0; i < who.length; ++i) {
System.out.println("Hello " + who[i] + "!");
}
}
public String toString() {
return "Hello People";
}
}
With a configuration:
<oddjob>
<job>
<bean class="org.oddjob.devguide.HelloPeopleJob">
<who>
<list>
<values>
<value value="Rod"/>
<value value="Jane"/>
<value value="Freddy"/>
</values>
</list>
</who>
</bean>
</job>
</oddjob>
And fire it up as before:
The job also has a nice name. We also gave our new job a toString()
method, and that's what explorer uses to label the job.
So lets take a moment to reflect on what we've got:
Not bad for a dozen lines of code.