Method processTxAttr() adds information about attributes and timeouts to maps. Keys in those maps are objects of class MethodTransactionAttributeKey. This class contains information about both method and context of invocation. So there is no protection against method will being called many times, but running it many times will leave those maps in the same state. On the other hand, I see one more problem here. Before my fix transaction timeouts were added to public @Timeout methods with context other than timer and it didn't prevented information about timeout to be propagated to those methods when they were executed from timer context.