/** * <summary> * This method will create a client with default configuration. Note that this method expects that * first node will bind rest binary protocol on default port.</summary> * * <returns>Client instance.</returns> * <exception cref="GridClientException">If client could not be created.</exception> */ private static IGridClient CreateClient() { var cacheCfg = new GridClientDataConfiguration(); // Set remote cache name. cacheCfg.Name = "partitioned"; // Set client partitioned affinity for this cache. cacheCfg.Affinity = new GridClientPartitionAffinity(); var cfg = new GridClientConfiguration(); cfg.DataConfigurations.Add(cacheCfg); cfg.Credentials = "good.user:password"; // Point client to a local node. Note that this server is only used // for initial connection. After having established initial connection // client will make decisions which grid node to use based on collocation // with key affinity or load balancing. cfg.Servers.Add(ServerAddress + ':' + GridClientConfiguration.DefaultTcpPort); return(GridClientFactory.Start(cfg)); }
/** * <summary> * Creates a new client based on a given configuration.</summary> * * <param name="id">Client identifier.</param> * <param name="cfg0">Client configuration.</param> * <exception cref="GridClientException">If client configuration is incorrect.</exception> * <exception cref="GridClientServerUnreachableException">If none of the servers specified in configuration can be reached.</exception> */ public GridClientImpl(Guid id, IGridClientConfiguration cfg0) { Id = id; cfg = new GridClientConfiguration(cfg0); ICollection <IPEndPoint> srvs = ParseServers(cfg.Servers); ICollection <IPEndPoint> routers = ParseServers(cfg.Routers); top = new GridClientTopology(id, cfg.IsTopologyCacheEnabled); Action <Object> addTopLsnr = o => { var lsnr = o as IGridClientTopologyListener; if (lsnr != null) { top.AddTopologyListener(lsnr); } }; // Add to topology as listeners. foreach (IGridClientDataConfiguration dataCfg in cfg.DataConfigurations) { addTopLsnr(dataCfg.Affinity); } addTopLsnr(cfg.Balancer); addTopLsnr(topUpdateBalancer); if (srvs.Count == 0) { // Use routers for initial connection. srvs = routers; } else { // Disable routers for connection manager. routers = new HashSet <IPEndPoint>(); } connMgr = new GridClientConnectionManager(Id, top, routers, cfg.Credentials, cfg.Protocol, cfg.SslContext, cfg.ConnectTimeout); int retries = 3; while (true) { IGridClientConnection conn = null; try { // Create connection to a server from the list of endpoints. conn = connMgr.connection(srvs); // Request topology at start to determine which node we connected to. // Also this request validates TCP connection is alive. conn.Topology(false, false, Guid.Empty).WaitDone(); break; } catch (GridClientAuthenticationException) { if (conn != null) { conn.Close(false); } top.Dispose(); throw; } catch (GridClientException e) { if (conn != null) { conn.Close(false); } if (retries-- <= 0) { top.Dispose(); throw new GridClientException("Failed to update grid topology.", e); } } } IDictionary <String, GridClientCacheMode> overallCaches = new GridClientNullDictionary <String, GridClientCacheMode>(); // Topology is now updated, so we can identify current connection. foreach (GridClientNodeImpl node in top.Nodes()) { foreach (KeyValuePair <String, GridClientCacheMode> pair in node.Caches) { overallCaches[pair.Key] = pair.Value; } } foreach (KeyValuePair <String, GridClientCacheMode> entry in overallCaches) { if (Affinity(entry.Key) is GridClientPartitionAffinity && entry.Value != GridClientCacheMode.Partitioned) { Dbg.WriteLine(typeof(GridClientPartitionAffinity) + " is used for a cache configured " + "for non-partitioned mode [cacheName=" + entry.Key + ", cacheMode=" + entry.Value + ']'); } } idleCheckThread = new Thread(checkIdle); idleCheckThread.Name = "grid-check-idle-worker--client#" + id; idleCheckThread.Start(); topUpdateThread = new Thread(updateTopology); topUpdateThread.Name = "grid-topology-update-worker--client#" + id; topUpdateThread.Start(); _compute = new GridClientComputeImpl(this, null, null, cfg.Balancer); Dbg.WriteLine("Client started. Id: " + Id); }