Package org.jboss.jms.client.container

Source Code of org.jboss.jms.client.container.ClusteringAspect

/*     */ package org.jboss.jms.client.container;
/*     */
/*     */ import java.util.Arrays;
/*     */ import java.util.Iterator;
/*     */ import java.util.Map;
/*     */ import java.util.Map.Entry;
/*     */ import java.util.Set;
/*     */ import javax.jms.JMSException;
/*     */ import org.jboss.aop.joinpoint.Invocation;
/*     */ import org.jboss.aop.joinpoint.MethodInvocation;
/*     */ import org.jboss.jms.client.FailoverCommandCenter;
/*     */ import org.jboss.jms.client.delegate.ClientClusteredConnectionFactoryDelegate;
/*     */ import org.jboss.jms.client.delegate.ClientConnectionDelegate;
/*     */ import org.jboss.jms.client.delegate.ClientConnectionFactoryDelegate;
/*     */ import org.jboss.jms.client.delegate.DelegateSupport;
/*     */ import org.jboss.jms.client.plugin.LoadBalancingPolicy;
/*     */ import org.jboss.jms.client.remoting.ConsolidatedRemotingConnectionListener;
/*     */ import org.jboss.jms.client.remoting.JMSRemotingConnection;
/*     */ import org.jboss.jms.client.state.ConnectionState;
/*     */ import org.jboss.jms.delegate.CreateConnectionResult;
/*     */ import org.jboss.jms.exception.MessagingNetworkFailureException;
/*     */ import org.jboss.logging.Logger;
/*     */
/*     */ public class ClusteringAspect
/*     */ {
/*  52 */   private static final Logger log = Logger.getLogger(ClusteringAspect.class);
/*     */
/*  54 */   private boolean trace = log.isTraceEnabled();
/*     */   public static final int MAX_RECONNECT_HOP_COUNT = 10;
/*     */   private ClientClusteredConnectionFactoryDelegate clusteredDelegate;
/*     */
/*     */   public CreateConnectionResult handleCreateConnectionDelegate(Invocation invocation)
/*     */     throws Throwable
/*     */   {
/*  76 */     if (this.trace)
/*     */     {
/*  78 */       log.trace(this + " handleCreateConnectionDelegate");
/*     */     }
/*     */
/*  83 */     if (this.clusteredDelegate == null)
/*     */     {
/*  85 */       this.clusteredDelegate = ((ClientClusteredConnectionFactoryDelegate)invocation.getTargetObject());
/*     */     }
/*     */
/*  88 */     boolean supportsFailover = this.clusteredDelegate.isSupportsFailover();
/*     */
/*  93 */     MethodInvocation mi = (MethodInvocation)invocation;
/*  94 */     String username = (String)mi.getArguments()[0];
/*  95 */     String password = (String)mi.getArguments()[1];
/*  96 */     Integer failedNodeID = (Integer)mi.getArguments()[2];
/*     */
/* 101 */     int attemptCount = 0;
/* 102 */     ClientConnectionFactoryDelegate delegate = null;
/*     */
/* 104 */     while (attemptCount < 10)
/*     */     {
/* 108 */       attemptCount++;
/*     */
/* 110 */       int nextHopingServer = -1;
/*     */       try
/*     */       {
/* 113 */         int failedNodeIDToServer = -1;
/* 114 */         if (delegate == null)
/*     */         {
/* 116 */           if ((failedNodeID != null) && (failedNodeID.intValue() >= 0))
/*     */           {
/* 119 */             delegate = getFailoverDelegateForNode(failedNodeID);
/* 120 */             failedNodeIDToServer = failedNodeID.intValue();
/* 121 */             nextHopingServer = delegate.getServerID();
/*     */           }
/*     */           else
/*     */           {
/* 126 */             LoadBalancingPolicy loadBalancingPolicy = this.clusteredDelegate.getLoadBalancingPolicy();
/* 127 */             delegate = (ClientConnectionFactoryDelegate)loadBalancingPolicy.getNext();
/*     */           }
/*     */         }
/*     */
/* 131 */         log.trace(this + " has chosen " + delegate + " as target, " + (attemptCount == 0 ? "first connection attempt" : new StringBuilder().append(attemptCount).append(" connection attempts").toString()));
/*     */
/* 134 */         CreateConnectionResult res = delegate.createConnectionDelegate(username, password, failedNodeIDToServer);
/*     */
/* 137 */         ClientConnectionDelegate cd = res.getDelegate();
/*     */
/* 139 */         if (cd != null)
/*     */         {
/* 143 */           log.trace(this + " got local connection delegate " + cd);
/*     */
/* 145 */           if (supportsFailover)
/*     */           {
/* 147 */             ConnectionState state = (ConnectionState)cd.getState();
/*     */
/* 149 */             state.initializeFailoverCommandCenter();
/*     */
/* 151 */             FailoverCommandCenter fcc = state.getFailoverCommandCenter();
/*     */
/* 155 */             state.getRemotingConnection().getConnectionListener().setDelegateListener(new ConnectionFailureListener(fcc, state.getRemotingConnection()));
/*     */
/* 158 */             log.trace(this + " installed failure listener on " + cd);
/*     */
/* 162 */             state.setUsername(username);
/* 163 */             state.setPassword(password);
/*     */
/* 167 */             state.setClusteredConnectionFactoryDeleage(this.clusteredDelegate);
/*     */
/* 169 */             log.trace("Successfully initialised new connection");
/*     */           }
/*     */
/* 172 */           return res;
/*     */         }
/*     */
/* 177 */         if (!supportsFailover)
/*     */         {
/* 179 */           throw new IllegalStateException("Doesn't support failover so must return a connection delegate");
/*     */         }
/*     */
/* 184 */         int actualServerID = res.getActualFailoverNodeID();
/*     */
/* 186 */         if (actualServerID == -1)
/*     */         {
/* 194 */           log.debug("Client attempted failover, but no failover attempt has been detected on the server side. We will now try again on the original server in case there was a temporary glitch on the client--server network");
/*     */
/* 198 */           delegate = getDelegateForNode(failedNodeID.intValue());
/*     */
/* 203 */           Thread.sleep(2000L);
/*     */         }
/*     */         else
/*     */         {
/* 210 */           log.trace("Server side failover occurred, but we were non the wrong node! Actual node = " + actualServerID);
/*     */
/* 212 */           delegate = getDelegateForNode(actualServerID);
/*     */         }
/*     */
/* 215 */         if (delegate == null)
/*     */         {
/* 220 */           throw new JMSException("Cannot find a cached connection factory delegate for node " + actualServerID);
/*     */         }
/*     */
/*     */       }
/*     */       catch (MessagingNetworkFailureException e)
/*     */       {
/* 229 */         failedNodeID = new Integer(nextHopingServer);
/* 230 */         delegate = null;
/* 231 */         log.warn("Exception captured on createConnection... hopping to a new connection factory on server (" + failedNodeID + ")", e);
/*     */
/* 233 */         Thread.sleep(2000L);
/*     */       }
/*     */     }
/*     */
/* 237 */     throw new JMSException("Maximum number of failover attempts exceeded. Cannot find a server to failover onto.");
/*     */   }
/*     */
/*     */   public String toString()
/*     */   {
/* 243 */     return "ClusteringAspect[" + this.clusteredDelegate + "]";
/*     */   }
/*     */
/*     */   private synchronized ClientConnectionFactoryDelegate getFailoverDelegateForNode(Integer nodeID)
/*     */   {
/* 254 */     log.trace("Getting failover delegate for node id " + nodeID);
/*     */
/* 256 */     ClientConnectionFactoryDelegate[] delegates = this.clusteredDelegate.getDelegates();
/*     */
/* 258 */     if (nodeID.intValue() < 0)
/*     */     {
/* 260 */       throw new IllegalArgumentException("nodeID must be 0 or positive");
/*     */     }
/*     */
/* 263 */     Map failoverMap = this.clusteredDelegate.getFailoverMap();
/*     */
/* 265 */     if (this.trace) dumpFailoverMap(failoverMap);
/*     */
/* 267 */     Integer failoverNodeID = (Integer)failoverMap.get(nodeID);
/*     */
/* 269 */     log.trace("Found failover node id = " + failoverNodeID);
/*     */
/* 274 */     if (failoverNodeID == null)
/*     */     {
/* 276 */       log.trace("Couldn't find failover node id on map so guessing it");
/* 277 */       failoverNodeID = guessFailoverID(failoverMap, nodeID);
/* 278 */       log.trace("Guess is " + failoverNodeID);
/*     */     }
/*     */
/* 281 */     for (int i = 0; i < delegates.length; i++)
/*     */     {
/* 283 */       if (delegates[i].getServerID() == failoverNodeID.intValue())
/*     */       {
/* 285 */         return delegates[i];
/*     */       }
/*     */     }
/*     */
/* 289 */     return null;
/*     */   }
/*     */
/*     */   private void dumpFailoverMap(Map failoverMap)
/*     */   {
/* 294 */     log.trace("Dumping failover map");
/* 295 */     Iterator iter = failoverMap.entrySet().iterator();
/* 296 */     while (iter.hasNext())
/*     */     {
/* 298 */       Map.Entry entry = (Map.Entry)iter.next();
/* 299 */       log.trace(entry.getKey() + "-->" + entry.getValue());
/*     */     }
/*     */   }
/*     */
/*     */   private static Integer guessFailoverID(Map failoverMap, Integer nodeID)
/*     */   {
/* 313 */     log.trace("Guessing failover id for node " + nodeID);
/* 314 */     Integer failoverNodeID = null;
/* 315 */     Integer[] nodes = (Integer[])(Integer[])failoverMap.keySet().toArray(new Integer[failoverMap.size()]);
/*     */
/* 318 */     Arrays.sort(nodes);
/*     */
/* 320 */     for (int i = 0; i < nodes.length; i++)
/*     */     {
/* 322 */       if (nodeID.intValue() >= nodes[i].intValue())
/*     */         continue;
/* 324 */       failoverNodeID = nodes[i];
/* 325 */       break;
/*     */     }
/*     */
/* 330 */     if (failoverNodeID == null)
/*     */     {
/* 332 */       failoverNodeID = nodes[0];
/*     */     }
/*     */
/* 335 */     log.trace("Returning guess " + failoverNodeID);
/*     */
/* 337 */     return failoverNodeID;
/*     */   }
/*     */
/*     */   private synchronized ClientConnectionFactoryDelegate getDelegateForNode(int nodeID)
/*     */   {
/* 342 */     log.trace("Getting delegate for node id " + nodeID);
/*     */
/* 344 */     ClientConnectionFactoryDelegate[] delegates = this.clusteredDelegate.getDelegates();
/*     */
/* 346 */     for (int i = 0; i < delegates.length; i++)
/*     */     {
/* 348 */       if (delegates[i].getServerID() != nodeID)
/*     */         continue;
/* 350 */       log.trace("Found " + delegates[i]);
/* 351 */       return delegates[i];
/*     */     }
/*     */
/* 355 */     log.trace("Didn't find any delegate");
/* 356 */     return null;
/*     */   }
/*     */ }

/* Location:           /home/mnovotny/projects/EMBEDDED_JBOSS_BETA3_COMMUNITY/embedded/output/lib/embedded-jboss/lib/jboss-embedded-all.jar
* Qualified Name:     org.jboss.jms.client.container.ClusteringAspect
* JD-Core Version:    0.6.0
*/
TOP

Related Classes of org.jboss.jms.client.container.ClusteringAspect

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.