Dexecutor to the rescue, Dexecutor is designed to execute dependent independent tasks in a reliable way.
DexecutorConfig<Integer, Integer> config = new DexecutorConfig<>(executorService, new SleepyTaskProvider());
DefaultDexecutor<Integer, Integer> executor = new DefaultDexecutor<Integer, Integer>(config);
// Graph building
executor.addDependency(1, 2);
executor.addDependency(1, 2);
executor.addDependency(1, 3);
executor.addDependency(3, 4);
executor.addDependency(3, 5);
executor.addDependency(3, 6);
executor.addDependency(2, 7);
executor.addDependency(2, 9);
executor.addDependency(2, 8);
executor.addDependency(9, 10);
executor.addDependency(12, 13);
executor.addDependency(13, 4);
executor.addDependency(13, 14);
executor.addIndependent(11);
//Execution
executor.execute(ExecutionConfig.NON_TERMINATING);
Refer How Do I? for more detail
Why Dexecutor
- Ultra light weight
- Ultra Fast
- Immediate/Scheduled Retry Logic supported
- Non terminating behaviour supported
- Conditionally skip the task execution
- Good test coverage to keep you safe from harm
- Available in maven central
- Good amount of documentation
- Distribute Execution Supported (Ignite, Hazelcast, Infinispan)
Usefull links
Disclaimer : I am the owner