If job is marked as non restartable but step is marked as allowRestartIfCompleted, a step can restart in a job that is otherwise not supposed to restart. This seems to be because a second instance of the same job can be created with the same job identifier/parameters. Throwing an exception at the repository/dao level should fix this. This means that if a non-restartable job fails, it will need to be reinvoked with new paramters (i.e. manually).
See forum thread: http://forum.springframework.org/showthread.php?p=162451