We create a transacted session with:
QueueSession session = conn.createQueueSession(true, -1);
It means all the messages created in that session are apart of an atomic unit and there can be none interposing in that order. However the starting of a transacted session doesn't take a destination as a parameter. So it couldn't be blocking at this time, other destinations should be able to accept whatever messages they please.
So is the transaction started when we call
QueueSender senderJMS = session.createSender(Destination);
or in fact is not really a transaction at all so other "transactions" started after this one but who finished before it, actualy get their group of messages before this transaction's group?
How are you starting and stopping the transaction? It's either a UserTransaction or Container one.