Maciej
Wanted to add another thing that you might want to address and also let other know. Perhaps it will also help you with the Quartz work that you are experimenting.
If you are scheduling the task with Quartz for example using a global scheduler, that means is persisted, the scheduling would be done in a different transaction.
This is because in TaskServiceSession::addTask() the persistence of task data is done in one transaction - doOperationInTransaction(), and the scheduling is done afterwards. So, if the scheduling fails from some reason the task won't be scheduled anymore as it isn't possible to rollback the persistence of task data.
There are a couple of alternatives in short term and conceivably in long term (which is what I consider).
In long term perhaps this can be addressed inside of the TaskServiceSession (for example by allowing custom persistence activites be included as needed - with diligence of course).
Regards
Marian B