Some times Memcached may delay the processing. In some situations like Memcached serve is down (or) disabled MemcachedConnection will continue to attempt to reconnect and replay pending operations until it comes back up. To prevent this from causing your application to hang, you can use one of the asynchronous mechanisms to time out a request and Cancel the operation to the server.
Future
try {
String data = (String) future.get(5, TimeUnit.SECONDS);
System.out.println("Data is " + data);
} catch (Exception e) {
// Since we don't need this, go ahead and cancel the operation.
// This is not strictly necessary, but it'll save some work on
// the server. It is okay to cancel it if running.
future.cancel(true);
}
Above statement waits maximum of 5 seconds to get reply, if it is unable to get the reply, it cancel the task.
package com.sampe.cache;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import net.spy.memcached.MemcachedClient;
/**
* Utility class to create client.
*
* @author harikrishna_gurram
*
*/
public class CacheClientUtil {
private static MemcachedClient client = null;
private static Logger logger = LogManager.getLogger();
public static OptionalMemcachedClient> getClient(InetSocketAddress addr) {
if (Objects.isNull(addr)) {
logger.error("getClient: addr shouldn't be null");
return Optional.empty();
}
try {
client = new MemcachedClient(addr);
} catch (IOException e) {
logger.error(e);
return Optional.empty();
}
return Optional.of(client);
}
public static OptionalMemcachedClient> getClient(ListInetSocketAddress> addrs) {
if (Objects.isNull(addrs)) {
logger.error("getClient: addrs shouldn't be null");
return Optional.empty();
}
try {
client = new MemcachedClient(addrs);
} catch (IOException e) {
logger.error(e);
return Optional.empty();
}
return Optional.of(client);
}
public static void shutdownClient(MemcachedClient client) {
if (Objects.isNull(client)) {
logger.error("shutdownClient: client object is already closed");
return;
}
client.shutdown();
}
}
package com.sampe.cache;
import java.net.InetSocketAddress;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import net.spy.memcached.MemcachedClient;
public class Test {
private static Logger logger = LogManager.getLogger();
public static void main(String args[]) throws InterruptedException, ExecutionException {
/* Get MemcachedClient */
InetSocketAddress address = new InetSocketAddress("127.0.0.1", 11211);
OptionalMemcachedClient> client = CacheClientUtil.getClient(address);
if (!client.isPresent()) {
logger.error("Unable to create client instance");
return;
}
MemcachedClient memClient = client.get();
memClient.set("E2345", 900, "Hari Krishna Gurram");
FutureObject> future = memClient.asyncGet("E2345");
try {
String data = (String) future.get(5, TimeUnit.SECONDS);
System.out.println("Data is " + data);
} catch (Exception e) {
// Since we don't need this, go ahead and cancel the operation.
// This is not strictly necessary, but it'll save some work on
// the server. It is okay to cancel it if running.
future.cancel(true);
}
CacheClientUtil.shutdownClient(memClient);
}
}
Output
Data is Hari Krishna Gurram
This post first appeared on Java Tutorial : Blog To Learn Java Programming, please read the originial post: here