From 36871e4f5ec51a70a208b51b04aa8f020ae91cec Mon Sep 17 00:00:00 2001 From: Vibhav Kumar Date: Wed, 21 Jun 2017 15:06:28 +0530 Subject: [PATCH] use Guava cache to return ListenableFuture --- .../impl/AsyncHttpCacheServiceImpl.java | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/wego/httpcache/services/impl/AsyncHttpCacheServiceImpl.java b/src/main/java/com/wego/httpcache/services/impl/AsyncHttpCacheServiceImpl.java index ca640e0..12a7be0 100644 --- a/src/main/java/com/wego/httpcache/services/impl/AsyncHttpCacheServiceImpl.java +++ b/src/main/java/com/wego/httpcache/services/impl/AsyncHttpCacheServiceImpl.java @@ -1,5 +1,7 @@ package com.wego.httpcache.services.impl; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import com.google.common.collect.Lists; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; @@ -11,18 +13,25 @@ import com.wego.httpcache.dao.models.CachedResponse; import com.wego.httpcache.services.AsyncHttpCacheService; import com.wego.httpcache.services.CachedResponseService; + import java.util.Optional; +import java.util.concurrent.TimeUnit; + import org.apache.commons.lang3.StringUtils; + import redis.clients.util.MurmurHash; public class AsyncHttpCacheServiceImpl implements AsyncHttpCacheService { - private static final String DELIMITER = ":"; @Inject private CachedResponseService cachedResponseService; private String serviceName; private AsyncHttpClient asyncHttpClient; private long ttl; + private final Cache> cache = CacheBuilder.newBuilder() + .expireAfterWrite(2, TimeUnit.MINUTES) + .build(); + @Inject public AsyncHttpCacheServiceImpl( @Assisted String serviceName, @Assisted AsyncHttpClient asyncHttpClient, @Assisted long ttl) { @@ -49,9 +58,11 @@ public Optional> executeRequest( if (cachedResponse.isPresent()) { handler.onCompleted(cachedResponse.get()); } else { - responseListenableFuture = - this.asyncHttpClient.executeRequest( - request, buildCachingHandler(handler, responseId, ttl)); + responseListenableFuture = cache.get(responseId, () -> { + return this.asyncHttpClient.executeRequest(request, + buildCachingHandler(handler, responseId, ttl)); + }); + handler.onCompleted(responseListenableFuture.get()); } return Optional.ofNullable(responseListenableFuture); @@ -60,7 +71,8 @@ public Optional> executeRequest( private String buildResponseId(Request request) { String requestStringId = StringUtils.join( - request, request.getStringData(), Lists.newArrayList(request.getCookies()).toString()); + request, request.getStringData(), Lists.newArrayList(request.getCookies()) + .toString()); return StringUtils.joinWith( DELIMITER, serviceName, String.valueOf(MurmurHash.hash64A(requestStringId.getBytes(), 0))); } @@ -72,10 +84,11 @@ private AsyncCompletionHandlerBase buildCachingHandler( @Override public Response onCompleted(Response response) throws Exception { CachedResponse cachedResponse = - new CachedResponse.Builder(response).setId(responseId).build(); + new CachedResponse.Builder(response).setId(responseId) + .build(); cachedResponseService.save(cachedResponse, cachingTtl); - return handler.onCompleted(response); + return response; } @Override