Messages can occur within groups to allow ordering of messages. In addition to ordering of messages, message grouping allows segmentation of large messages within the same group.
Message Groups for ActiveMQ are an enhancement to the Exclusive Consumer feature to provide:
• guarranteed ordering of the processing of related messages across a single queue
• load balancing of the processing of messages across multiple consumers
• high availability / auto-failover to other consumers if a JVM goes down
So logically Message Groups are kinda like a parallel Exclusive Consumer. Rather than all messages going to a single consumer, the standard JMS header JMSXGroupID is used to define which message group the message belongs to. The Message Group feature then ensures that all messages for the same message group will be sent to the same JMS consumer - while that consumer stays alive. As soon as the consumer dies another will be chosen.
Another way of explaining Message Groups is that it provides sticky load balancing of messages across consumers; where the JMSXGroupID is kinda like a HTTP session ID or cookie value and the message broker is acting like a HTTP load balancer.