There are a few topics on that subject here, some very detailed.
It's basically a question of correct transaction handling. Execute workflows inside a transaction and you can rollback and start where you were coming from.
Whatever triggered the execution (timer, gui, jms message, etc.) would have to be repeated but this could be wrapped in the same transaction (except for the gui, that would be handled by a error message and a request to try again.)