/** * Copy constructor. * * @param cfg Configuration to be copied. */ public GridClientConfiguration(GridClientConfiguration cfg) { // Preserve alphabetical order for maintenance; autoFetchAttrs = cfg.isAutoFetchAttributes(); autoFetchMetrics = cfg.isAutoFetchMetrics(); balancer = cfg.getBalancer(); connectTimeout = cfg.getConnectTimeout(); credProvider = cfg.getSecurityCredentialsProvider(); enableAttrsCache = cfg.isEnableAttributesCache(); enableMetricsCache = cfg.isEnableMetricsCache(); executor = cfg.getExecutorService(); marshaller = cfg.getMarshaller(); maxConnIdleTime = cfg.getMaxConnectionIdleTime(); pingInterval = cfg.getPingInterval(); pingTimeout = cfg.getPingTimeout(); proto = cfg.getProtocol(); routers = cfg.getRouters(); srvs = cfg.getServers(); sslCtxFactory = cfg.getSslContextFactory(); tcpNoDelay = cfg.isTcpNoDelay(); topRefreshFreq = cfg.getTopologyRefreshFrequency(); daemon = cfg.isDaemon(); marshaller = cfg.getMarshaller(); setDataConfigurations(cfg.getDataConfigurations()); }
/** * Create new connection to specified server. * * @param nodeId {@code UUID} of node for mapping with connection. {@code null} if no need of * mapping. * @param addr Remote socket to connect. * @return Established connection. * @throws IOException If connection failed. * @throws GridClientException If protocol error happened. * @throws InterruptedException If thread was interrupted before connection was established. */ protected GridClientConnection connect(@Nullable UUID nodeId, InetSocketAddress addr) throws IOException, GridClientException, InterruptedException { endpointStripedLock.lock(addr); try { GridClientConnection old = conns.get(addr); if (old != null) { if (old.isClosed()) { conns.remove(addr, old); if (nodeId != null) nodeConns.remove(nodeId, old); } else { if (nodeId != null) nodeConns.put(nodeId, old); return old; } } SecurityCredentials cred = null; try { if (cfg.getSecurityCredentialsProvider() != null) cred = cfg.getSecurityCredentialsProvider().credentials(); } catch (IgniteCheckedException e) { throw new GridClientException("Failed to obtain client credentials.", e); } GridClientConnection conn; if (cfg.getProtocol() == GridClientProtocol.TCP) { conn = new GridClientNioTcpConnection( srv, clientId, addr, sslCtx, pingExecutor, cfg.getConnectTimeout(), cfg.getPingInterval(), cfg.getPingTimeout(), cfg.isTcpNoDelay(), cfg.getMarshaller(), marshId, top, cred, keepPortablesThreadLocal()); } else throw new GridServerUnreachableException( "Failed to create client (protocol is not supported): " + cfg.getProtocol()); old = conns.putIfAbsent(addr, conn); assert old == null; if (nodeId != null) nodeConns.put(nodeId, conn); return conn; } finally { endpointStripedLock.unlock(addr); } }
/** * @param clientId Client ID. * @param sslCtx SSL context to enable secured connection or {@code null} to use unsecured one. * @param cfg Client configuration. * @param routers Routers or empty collection to use endpoints from topology info. * @param top Topology. * @param marshId Marshaller ID. * @throws GridClientException In case of error. */ @SuppressWarnings("unchecked") protected GridClientConnectionManagerAdapter( UUID clientId, SSLContext sslCtx, GridClientConfiguration cfg, Collection<InetSocketAddress> routers, GridClientTopology top, @Nullable Byte marshId, boolean routerClient) throws GridClientException { assert clientId != null : "clientId != null"; assert cfg != null : "cfg != null"; assert routers != null : "routers != null"; assert top != null : "top != null"; this.clientId = clientId; this.sslCtx = sslCtx; this.cfg = cfg; this.routers = new ArrayList<>(routers); this.top = top; log = Logger.getLogger(getClass().getName()); executor = cfg.getExecutorService() != null ? cfg.getExecutorService() : Executors.newCachedThreadPool(new GridClientThreadFactory("exec", true)); pingExecutor = cfg.getProtocol() == GridClientProtocol.TCP ? Executors.newScheduledThreadPool( Runtime.getRuntime().availableProcessors(), new GridClientThreadFactory("exec", true)) : null; this.marshId = marshId; if (marshId == null && cfg.getMarshaller() == null) throw new GridClientException("Failed to start client (marshaller is not configured)."); if (cfg.getProtocol() == GridClientProtocol.TCP) { try { IgniteLogger gridLog = new JavaLogger(false); GridNioFilter[] filters; GridNioFilter codecFilter = new GridNioCodecFilter(new GridTcpRestParser(routerClient), gridLog, false); if (sslCtx != null) { GridNioSslFilter sslFilter = new GridNioSslFilter(sslCtx, true, ByteOrder.nativeOrder(), gridLog); sslFilter.directMode(false); sslFilter.clientMode(true); filters = new GridNioFilter[] {codecFilter, sslFilter}; } else filters = new GridNioFilter[] {codecFilter}; srv = GridNioServer.builder() .address(U.getLocalHost()) .port(-1) .listener(new NioListener(log)) .filters(filters) .logger(gridLog) .selectorCount(Runtime.getRuntime().availableProcessors()) .sendQueueLimit(1024) .byteOrder(ByteOrder.nativeOrder()) .tcpNoDelay(cfg.isTcpNoDelay()) .directBuffer(true) .directMode(false) .socketReceiveBufferSize(0) .socketSendBufferSize(0) .idleTimeout(Long.MAX_VALUE) .gridName(routerClient ? "routerClient" : "gridClient") .daemon(cfg.isDaemon()) .build(); srv.start(); } catch (IOException | IgniteCheckedException e) { throw new GridClientException("Failed to start connection server.", e); } } }