We ended up resorting to process partitioning with sticky processes. All requests are round-robined across N jBPM5 nodes. Once a process instance is created on partition X it is tagged with that partition and it'll always be served by partition X. Each partition has an active and stand-by nodes for fail-over. It's not real clustering, but it does help to scale up... Evidently, jBPM 5.1 is not designed for clustering.