log.debug("Cluster topology changed for family " + familyName + " new view id " + fci.getCurrentViewId()
+ " - Updating JNDI bindings for container " + beanClusteringInfo.getContainerName());
for (JndiReferenceBinding binding : bindings.getDefaultRemoteBindings())
{
RefAddr refAddr = getFirstRefAddr(binding.getReference(),
ClusteredProxyFactoryReferenceAddressTypes.REF_ADDR_TYPE_CLUSTER_FAMILY_NAME);
if (refAddr != null && familyName.equals(refAddr.getContent()))
{
redecorateReferenceForClusteringTargets(binding.getReference(), fci);
rebind(context, binding.getJndiName(), binding.getReference());
}
// The remote proxyfactory in JNDI too needs to be updated with the changes in the
// clustering family. This involves unbinding the remote proxyfactory from JNDI,
// creating a new proxy for the proxyfactory with this new FamilyCluster info
// and finally binding this new proxy for the proxyfactory to the JNDI
String proxyFactoryKey = this.getSingleRequiredRefAddr(binding.getReference(),
ProxyFactoryReferenceAddressTypes.REF_ADDR_TYPE_PROXY_FACTORY_REGISTRY_KEY);
// first create a new proxy. if we run into problems creating a new proxy,
// let's NOT unbind the existing one since a change in topology should not
// result in loss of proxy factory
ProxyFactory existingProxyFactoryInJNDI = null;
try
{
existingProxyFactoryInJNDI = (ProxyFactory) context.lookup(proxyFactoryKey);
}
catch (NamingException ne)
{
// ignore and skip. If there is not proxyfactory bound or if there is some other
// issue related to naming, let's not try to "update" the proxy factory.
log.debug("Could not update the cluster topology changes to proxyfactory at key " + proxyFactoryKey);
continue;
}
// create a new proxy to proxyfactory with the available information in JNDI Reference,
// the previously bound proxy to the proxyfactory and the beanClusteringInfo which has
// contains the updated information of the cluster topology
ProxyFactory updatedProxyToProxyFactory = this.updateProxyForRemoteProxyFactory(proxyFactoryKey, binding
.getReference(), existingProxyFactoryInJNDI, beanClusteringInfo);
try
{
Util.rebind(context, proxyFactoryKey, updatedProxyToProxyFactory);
log.debug("Bound an updated proxyfactory at key " + proxyFactoryKey);
}
catch (NamingException ne)
{
// let's just log a WARN since we don't want the other operations to fail because of this
log.warn("Exception while rebinding a new proxyfactory at key " + proxyFactoryKey
+ " with updated clustered topology", ne);
}
}
for (JndiReferenceBinding binding : bindings.getHomeRemoteBindings())
{
RefAddr refAddr = getFirstRefAddr(binding.getReference(),
ClusteredProxyFactoryReferenceAddressTypes.REF_ADDR_TYPE_CLUSTER_FAMILY_NAME);
if (refAddr != null && familyName.equals(refAddr.getContent()))
{
redecorateReferenceForClusteringTargets(binding.getReference(), fci);
rebind(context, binding.getJndiName(), binding.getReference());
}
}
for (Set<JndiReferenceBinding> businessBindings : bindings.getBusinessRemoteBindings().values())
{
for (JndiReferenceBinding binding : businessBindings)
{
RefAddr refAddr = getFirstRefAddr(binding.getReference(),
ClusteredProxyFactoryReferenceAddressTypes.REF_ADDR_TYPE_CLUSTER_FAMILY_NAME);
if (refAddr != null && familyName.equals(refAddr.getContent()))
{
redecorateReferenceForClusteringTargets(binding.getReference(), fci);
rebind(context, binding.getJndiName(), binding.getReference());
}
}