First up, thank you for providing such a wondefully stable implementation! I have a small feature request:
At present whenever a, say, SFSB throws a RuntimeException, JTA goes into 'rollback' mode. From then on, anyone who tries to do any further work (including when the SessionContext tries to remove the rolled back SFSB) will trigger a different RuntimeException saying, in short, 'Already marked for rollback'.
It would be very helpful if the 'Already marked for rollback' Exception could include, as its getCause (which is standard as of JDK 1.4), the original exception that started off the rollback? At present we are often left with the situation where all the original caller gets back is a 'Already marked for rollback' Exception, and there is no way to 'drill down' to find what the original cause was.
Of course, you could also argue that the SessionContext should be smarter about trying to remove rolled back EJBs.