diff --git a/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/core/AbstractRiakTemplate.java b/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/core/AbstractRiakTemplate.java
index 345e97745..aeced402e 100644
--- a/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/core/AbstractRiakTemplate.java
+++ b/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/core/AbstractRiakTemplate.java
@@ -104,10 +104,6 @@ public abstract class AbstractRiakTemplate extends RestGatewaySupport implements
* Whether or not to use the ETag-based cache.
*/
protected boolean useCache = true;
- /**
- * {@link java.util.concurrent.ExecutorService} to use for running asynchronous jobs.
- */
- protected ExecutorService executorService = Executors.newCachedThreadPool();
/**
* The URI to use inside the RestTemplate.
*/
@@ -124,6 +120,10 @@ public abstract class AbstractRiakTemplate extends RestGatewaySupport implements
* The default QosParameters to use for all operations through this template.
*/
protected QosParameters defaultQosParameters = null;
+ /**
+ * {@link java.util.concurrent.ExecutorService} to use for running asynchronous jobs.
+ */
+ protected ExecutorService workerPool = Executors.newCachedThreadPool();
protected Class> defaultType = String.class;
protected ClassLoader classLoader = null;
@@ -192,6 +192,15 @@ public abstract class AbstractRiakTemplate extends RestGatewaySupport implements
this.defaultQosParameters = defaultQosParameters;
}
+ public ExecutorService getWorkerPool() {
+ return workerPool;
+ }
+
+ public void setWorkerPool(ExecutorService workerPool) {
+ this.workerPool = workerPool;
+ }
+
+
/**
* Get the default type to use if none can be inferred.
*
@@ -257,14 +266,6 @@ public abstract class AbstractRiakTemplate extends RestGatewaySupport implements
return "/riak";
}
- public ExecutorService getExecutorService() {
- return executorService;
- }
-
- public void setExecutorService(ExecutorService executorService) {
- this.executorService = executorService;
- }
-
public void afterPropertiesSet() throws Exception {
Assert.notNull(conversionService,
"Must specify a valid ConversionService.");
diff --git a/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/core/AsyncRiakTemplate.java b/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/core/AsyncRiakTemplate.java
index b099e5260..55fe982c6 100644
--- a/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/core/AsyncRiakTemplate.java
+++ b/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/core/AsyncRiakTemplate.java
@@ -38,16 +38,43 @@ import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.*;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
/**
+ * An implementation of {@link AsyncBucketKeyValueStoreOperations} and {@link
+ * AsyncMapReduceOperations} for the Riak datastore.
+ *
+ * To use the AsyncRiakTemplate, create a singleton in your Spring application-context.xml:
+ *
+ * <bean id="riak" class="org.springframework.data.keyvalue.riak.core.AsyncRiakTemplate"
+ * p:defaultUri="http://localhost:8098/riak/{bucket}/{key}"
+ * p:mapReduceUri="http://localhost:8098/mapred"/>
+ *
+ * To store and retrieve objects in Riak, use the setXXX and getXXX methods (example in
+ * Groovy):
+ *
+ * def callback = [
+ * completed: { v, meta ->
+ * ... do something with results ...
+ * },
+ * failed: { err ->
+ * }
+ * ] as AsyncKeyValueStoreOperation
+ * def obj = new TestObject(name: "My Name", age: 40)
+ * def future = riak.set("mybucket", "mykey", obj, callback)
+ * ... this runs asynchronously, so do other work ...
+ * def name = future.get().name
+ * println "Hello $name!"
+ *
+ *
* @author J. Brisbin
*/
public class AsyncRiakTemplate extends AbstractRiakTemplate implements AsyncBucketKeyValueStoreOperations, AsyncMapReduceOperations {
protected final Logger log = LoggerFactory.getLogger(getClass());
- protected ExecutorService workerPool = Executors.newCachedThreadPool();
protected AsyncKeyValueStoreOperation defaultErrorHandler = new LoggingErrorHandler();
public AsyncRiakTemplate() {
@@ -58,14 +85,6 @@ public class AsyncRiakTemplate extends AbstractRiakTemplate implements AsyncBuck
super(requestFactory);
}
- public ExecutorService getWorkerPool() {
- return workerPool;
- }
-
- public void setWorkerPool(ExecutorService workerPool) {
- this.workerPool = workerPool;
- }
-
public AsyncKeyValueStoreOperation getDefaultErrorHandler() {
return defaultErrorHandler;
}
diff --git a/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/core/RiakTemplate.java b/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/core/RiakTemplate.java
index 518bde723..d00abd718 100644
--- a/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/core/RiakTemplate.java
+++ b/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/core/RiakTemplate.java
@@ -129,7 +129,10 @@ public class RiakTemplate extends AbstractRiakTemplate implements BucketKeyValue
KeyValueStoreMetaData origMeta = getMetaData(bucket, keyName);
String vclock = null;
if (null != origMeta) {
- vclock = origMeta.getProperties().get(RIAK_VCLOCK).toString();
+ Object o = origMeta.getProperties().get(RIAK_VCLOCK);
+ if (null != o) {
+ vclock = o.toString();
+ }
}
RestTemplate restTemplate = getRestTemplate();
HttpHeaders headers = new HttpHeaders();
@@ -552,7 +555,7 @@ public class RiakTemplate extends AbstractRiakTemplate implements BucketKeyValue
@SuppressWarnings({"unchecked"})
public Future> submit(MapReduceJob job) {
// Run this job asynchronously.
- return executorService.submit(job);
+ return workerPool.submit(job);
}
/*----------------- Link Operations -----------------*/
diff --git a/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/groovy/RiakBuilder.java b/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/groovy/RiakBuilder.java
index 2c17e027b..5dced9278 100644
--- a/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/groovy/RiakBuilder.java
+++ b/spring-data-riak/src/main/java/org/springframework/data/keyvalue/riak/groovy/RiakBuilder.java
@@ -37,6 +37,21 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
+ * A Groovy Builder that implements a powerful and syntactically succinct DSL for Riak datastore
+ * access using SDKV for Riak's {@link AsyncRiakTemplate}.
+ *
+ * The DSL responds to most of the important methods from the AsyncRiakTemplate:
+ * - set
- setAsBytes
- put
- get
- getAsBytes
+ * - getAsType
- containsKey
- delete
- foreach
+ *
+ * An example of DSL usage (to delete all entries in a bucket):
+ * riak.foreach(bucket: "test") {
+ * completed { v, meta ->
+ * delete(bucket: "test", key: meta.key)
+ * }
+ * }
+ *
+ *
* @author J. Brisbin
*/
public class RiakBuilder extends BuilderSupport {
@@ -310,7 +325,9 @@ public class RiakBuilder extends BuilderSupport {
@SuppressWarnings({"unchecked"})
@Override
protected void nodeCompleted(Object parent, Object node) {
- log.debug("nodeCompleted: parent=" + parent + ", node=" + node);
+ if (log.isDebugEnabled()) {
+ log.debug("nodeCompleted: parent=" + parent + ", node=" + node);
+ }
if (parent instanceof RiakMapReduceOperation && node instanceof QueryPhase) {
QueryPhase p = (QueryPhase) node;
MapReduceOperation oper = null;
@@ -339,7 +356,9 @@ public class RiakBuilder extends BuilderSupport {
@SuppressWarnings({"unchecked"})
@Override
protected Object postNodeCompletion(Object parent, Object node) {
- log.debug("postNodeCompletion: " + parent + " " + node);
+ if (log.isDebugEnabled()) {
+ log.debug("postNodeCompletion: " + parent + " " + node);
+ }
if (node instanceof RiakOperation) {
RiakOperation