blob: 918f98f24e857e0a0c0ad78804119311007c98b1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ignite.internal.client;
import java.util.Collection;
import java.util.UUID;
/**
* Ignite Java client API.
* <p>
* Contains functionality to get projections for accessing remote
* data and compute functionality, as well as provide listeners on topology changes.
* <p>
* You can obtain an instance of {@code GridClient} through
* {@link GridClientFactory#start(GridClientConfiguration)}. Note that you
* can have multiple instances of {@code GridClient} running in the same VM. For
* information on how to start or stop Grid please refer to {@link GridClientFactory} class.
* <p>
* Use the following method to get access to remote cache functionality:
* <ul>
* <li>{@link #data(String)}</li>
* </ul>
* Use following methods to get access to remote compute functionality:
* <ul>
* <li>{@link #compute()}</li>
* </ul>
* <h1 class="header">Partition awareness</h1>
* One of the unique properties of the Ignite remote clients is that they are
* affinity aware. In other words, both compute and data APIs will optionally
* contact exactly the node where the data is cached based on some affinity key.
* This allows for collocation of computations and data and avoids extra network
* hops that would be necessary if non-affinity nodes were contacted.
* <p>
* If client can't access some of grid nodes directly (for example due to security restrictions)
* either dedicated Router component could be used or some of Grid nodes could act as routers.
* See {@link GridClientConfiguration#getRouters()} for more details.
* @see GridClientCompute
* @see GridClientData
*/
public interface GridClient extends AutoCloseable {
/**
* Gets a unique client identifier. This identifier is generated by factory on client creation
* and used in identification and authentication procedure on server node.
*
* @return Generated client id.
*/
public UUID id();
/**
* Gets a data projection for grid cache with name <tt>cacheName</tt>. If
* no data configuration with given name was provided at client startup, an
* exception will be thrown.
*
* @param cacheName Grid cache name for which data projection should be obtained.
* @return Data projection for grid cache with name <tt>cacheName</tt>.
* @throws GridClientException If client was closed or no configuration with given name was provided.
*/
public GridClientData data(String cacheName) throws GridClientException;
/**
* Gets a default compute projection. Default compute projection will include all nodes
* in remote grid. Selection of node that will be connected to perform operations will be
* done according to {@link org.apache.ignite.internal.client.balancer.GridClientLoadBalancer} provided in client configuration or
* according to affinity if projection call involves affinity key.
* <p>
* More restricted projection configurations may be created with {@link GridClientCompute} methods.
*
* @return Default compute projection.
*
* @see GridClientCompute
*/
public GridClientCompute compute();
/**
* Get client cluster state projection, for perform activate/deactivate operation on cluster.
*
* @return Cluster state projection.
*
* @see GridClientClusterState
*/
public GridClientClusterState state();
/**
* Adds topology listener. Remote grid topology is refreshed every
* {@link GridClientConfiguration#getTopologyRefreshFrequency()} milliseconds. If any node was added or removed,
* a listener will be notified.
*
* @param lsnr Listener to add.
*/
public void addTopologyListener(GridClientTopologyListener lsnr);
/**
* Removes previously added topology listener.
*
* @param lsnr Listener to remove.
*/
public void removeTopologyListener(GridClientTopologyListener lsnr);
/**
* Gets an unmodifiable snapshot of topology listeners list.
*
* @return List of topology listeners.
*/
public Collection<GridClientTopologyListener> topologyListeners();
/**
* Indicates whether client is connected to remote Grid.
* In other words it allow to determine if client is able to communicate
* with Grid right now. If it can't all methods on Compute and Data projections
* throw {@link GridClientDisconnectedException}.
* <p>
* Connection status is updated in background together with topology update.
* See {@link GridClientConfiguration#getTopologyRefreshFrequency()} for more
* details on how background topology update works.
* <p>
* Note that due to asynchronous nature of topology update and connectivity detection
* this method gives no guarantees for subsequent calls for projections methods.
* It can be used only fo diagnostic and monitoring purposes.
*
* @return Whether client is connected to remote Grid.
*/
public boolean connected();
/**
* Closes client instance. This method is identical to
* {@link GridClientFactory#stop(UUID) GridClientFactory.stop(clientId)}.
* <p>
* The method is invoked automatically on objects managed by the
* {@code try-with-resources} statement.
*/
@Override public void close();
/**
* Check for last topology errors.
*
* @return {@code Exception} if client was not connected.
*/
public GridClientException checkLastError();
}