I'm happy to announce a new and exciting TransactionManager's feature -- drum roll... PAUSE... :) ... CONTINUATIONS!.
You can now PAUSE a transaction (at a participant boundary) by returning
The transaction gets suspended and resumes once you place it again in the TransactionManager's queue (i.e. by calling txnmgr.queue (Context)).
Why this is important to us?
Imagine you have a transaction manager configured to run 100 simultaneous sessions.
Even if 100 is a big number, when you depend on external components (such as a remote host) that can go slow you can easily exhaust all sessions.
When you have a single remote host and it goes slow, there's nothing you can do about it, but when you connect to multiple acquirers and one of them goes slow, you don't want to penalize the rest.
This problem has been described here where we use multiple TransactionManagers (one per remote host) with a pre-configured reasonable number of sessions and we forward transactions from one transaction manager to the next.
With continuations, we can split a participant that has to wait on remote events (i.e. a QueryHost or QueryHSM kind of participant).
The first one just sends the request to the remote system and returns
The session gets free and ready to process new transactions.
Once we receive a response, we just queue the Context back into the TransactionManager (I'll add a Context.resume() method to ease finding the right space and queue) and the transaction continue processing.