This branch of the Riak Java Client is for the new v2.0 client, to be used with Riak 2.0.
Previous versions:
riak-client-1.4.4 - For use with Riak 1.4.x
riak-client-1.1.4 - For use with < Riak 1.4.0
This client is published to Maven Central and can be included in your project by adding:
<dependencies>
<dependency>
<groupId>com.basho.riak</groupId>
<artifactId>riak-client</artifactId>
<version>2.0.1</version>
</dependency>
...
</dependencies>
Version 2.0 of the Riak Java client is a completely new codebase. It relies on Netty4 in the core for handling network operations and all operations can be executed synchronously or asynchronously.
The new client is designed to model a Riak cluster:
The easiest way to get started with the client is using one of the static methods provided to instantiate and start the client:
RiakClient client =
RiakClient.newClient("192.168.1.1","192.168.1.2","192.168.1.3");
The RiakClient object is thread safe and may be shared across multiple threads.
For more complex configurations, you can instantiate a RiakCluster from the core packages and supply it to the RiakClient constructor.
RiakNode.Builder builder = new RiakNode.Builder();
builder.withMinConnections(10);
builder.withMaxConnections(50);
List<String> addresses = new LinkedList<String>();
addresses.add("192.168.1.1");
addresses.add("192.168.1.2");
addresses.add("192.168.1.3");
List<RiakNode> nodes = RiakNode.Builder.buildNodes(builder, addresses);
RiakCluster cluster = new RiakCluster.Builder(nodes).build();
cluster.start();
RiakClient client = new RiakClient(cluster)
Once you have a client, commands from the com.basho.riak.client.api.commands.* packages are built then executed by the client.
Some basic examples of building and executing these commands is shown below.
Namespace ns = new Namespace("default", "my_bucket");
Location location = new Location(ns, "my_key");
RiakObject riakObject = new RiakObject();
riakObject.setValue(BinaryValue.create("my_value"));
StoreValue store = new StoreValue.Builder(riakObject)
.withLocation(location)
.withOption(Option.W, new Quorum(3)).build();
client.execute(store);
Namespace ns = new Namespace("default","my_bucket");
Location location = new Location(ns, "my_key");
FetchValue fv = new FetchValue.Builder(location).build();
FetchValue.Response response = client.execute(fv);
RiakObject obj = response.getValue(RiakObject.class);
A bucket type must be created (in all local and remote clusters) before 2.0 data types can be used. In the example below, it is assumed that the type "my_map_type" has been created and associated to the "my_map_bucket" prior to this code executing.
Once a bucket has been associated with a type, all values stored in that bucket must belong to that data type.
Namespace ns = new Namespace("my_map_type", "my_map_bucket");
Location location = new Location(ns, "my_key");
RegisterUpdate ru1 = new RegisterUpdate(BinaryValue.create("map_value_1"));
RegisterUpdate ru2 = new RegisterUpdate(BinaryValue.create("map_value_2"));
MapUpdate mu = new MapUpdate();
mu.update("map_key_1", ru1);
mu.update("map_key_2", ru2);
UpdateMap update = new UpdateMap.Builder(location, mu).build();
client.execute(update);