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<Object>
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);
}
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 Optional<MemcachedClient> 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 Optional<MemcachedClient> getClient(List<InetSocketAddress> 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); Optional<MemcachedClient> 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"); Future<Object> 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
No comments:
Post a Comment