Never send a human to do a machine's job...



How many people use Oddjob?

It's really not known! From forum postings it looks like Oddjob has about five or six 'power' users. One could imagine there are twenty or thirty others using it quietly on simple tasks.

What inspired Oddob?

From the Development Guide, Background and Principles tells of the inspiration behind Oddjob. A decade later and Oddjob would now do everything the developer required when he looked for that product. Recent enhancements to Oddjob have been inspired by the time it took a developer to perform repetitive testing. Oddjob will continue to be inspired by eliminating the repetitive parts of the developers job.

How technical do you need to be to use Oddjob?

Oddjob is designed for three levels of user:


How do I set up a job to run only if another job succeeds?

Job 2 will only run if Job 1 succeeds.

Alternativley you can also use a trigger schedule instead.

How do I have two things happen at once and then a third thing happen when the first two have finished?

Again, you can also use a trigger schedule.

How do I change what oddjob runs when I double click run-oddjob.jar?

Oddjob processes the contents of the file oddjob.xml found in the same directory as the jar file. This can be changed with Oddjob Designer just like any other Oddjob file.


Oddjob doesn't fail! - it merely defers success. Oddjob is all about retrying and INCOMPLETE was intended to reflect this.

Why can you only configure a nested Oddjob?

It might seem slightly irritating that you can't specify a classpath or name attribute at the top level oddjob element but there are two problems with this. Firstly Oddjob is already running when it process the file so it would have to reconfigure itself mid flow. Secondly which configuration should Oddjob use? That applied on the nested Oddjob, or that in the top level element? To keep things simple only external configuration of Oddjob is supported. This does however mean that we sometimes need two Oddjob files to get something done.


Oddjob is heavily based on Ant - why not just use Ant?

Ant is a fantastic build tool, Ant was never designed for the business event model Oddjob is aimed at, the fact it comes so close is a great credit to it's design. But Ant has a few drawbacks for this purpose.

Ant has only two completion states. Complete or BuildException. For the business type flow of events I'm convinced there has to be three completion states which is why Oddjob has Complete, Incomplete and Exception.

Ant is designed to run from start to finish, not continuously. The way Ant uses dependencies works because the tasks run once. It would be difficult to configure an Ant target who's completion depended on successfully sending reports daily to a few dozen clients for the next ten years.

With version 0.11 you can now use most Ant tasks within Oddjob and that's the bit of Ant that business integration really needs. ftp, mail etc.

Is Oddjob an application framework?

It wasn't intended to be but if you wished to write a business component that is automatically configured, can log events, can be managed remotely, and can be triggered from within a container then Oddjob is a good choice. So yes, Oddjob is an application framework.

Why not use an existing application framework such as Spring?

Early Oddjob was based on Avalon but I didn't like the dependency of a Job on a particular framework. I looked at Spring as being the best POJO style application framework but the XML configuration necessary to produce a hierarchy of jobs was very verbose and I couldn't see an easy way of doing job by job runtime configuration, as Ant did. So I took the Ant code base merged in BeanUtils and created Arooa (A rip off of Ant) which I'm pretty happy with.

Why not use rules based XML configuration?

A rules based configuration such as Digester was a possibility but I felt it was better suited to the situation where there weren't going to be many components to configure. When writing lots of jobs I believe it's quicker to program to a particular style which is what Ant and Oddjob do.

Why Log4j not commons-logging?

Log4j allow a thread local context to be used which Oddjob will use to capture log message from Loggers in classes which a job uses when executing. There is no equivalent in commons-logging as far a I am aware.