You should consider looking at the more advanced Distributed Caching solutions. Gemstone's GemFire product solves the problem you stated by:
1. Easily creating clusters based on our technology's Distributed System and Group Membership Services. Use multicast for location transparency or TCP/IP with a lookup service if multicast is not available on your network.
2. Automatically load-balancing message distribution from a message source (or sources) into an application cluster (J2EE or J2SE). We use "namespace" instead of "topic", but they implemenation is logicaly equivalent (for example, you can use "dot" notation in subject creation).
3. Giving you the option of statically or dynamically partitioning data distribution (and thus message receipt event firing) within the cluster. You can choose specific primary and backup instances, or let the system dynamically assign these for you.
4. Guaranteeing that a callback event (equivalent of onMsg()) logically fires once and only once accross your cluster. The major advance in our newest product is that event firing is absolutely guaranteed across any failover boundary condition.
5. All HA/Failover and load balancing logic is handled by GemFire, both from the publisher and subscriber/cluster perspective.
So, we take care of clustering, guaranteed messaging, HA/Failover, and load balancing all through one product that's easy to configure and has an intuitive API. There are also many more great features--far to many to list here.
In fairness, you can get some (but not all) of these feature from some of our competitors as well.
gideon dot low at gemstone dot com
GemFire-The Enterprise Data Fabrichttp://www.gemstone.com