Skip to content

Commit 36871e4

Browse files
committed
use Guava cache to return ListenableFuture
1 parent faaca72 commit 36871e4

File tree

1 file changed

+20
-7
lines changed

1 file changed

+20
-7
lines changed

src/main/java/com/wego/httpcache/services/impl/AsyncHttpCacheServiceImpl.java

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.wego.httpcache.services.impl;
22

3+
import com.google.common.cache.Cache;
4+
import com.google.common.cache.CacheBuilder;
35
import com.google.common.collect.Lists;
46
import com.google.inject.Inject;
57
import com.google.inject.assistedinject.Assisted;
@@ -11,18 +13,25 @@
1113
import com.wego.httpcache.dao.models.CachedResponse;
1214
import com.wego.httpcache.services.AsyncHttpCacheService;
1315
import com.wego.httpcache.services.CachedResponseService;
16+
1417
import java.util.Optional;
18+
import java.util.concurrent.TimeUnit;
19+
1520
import org.apache.commons.lang3.StringUtils;
21+
1622
import redis.clients.util.MurmurHash;
1723

1824
public class AsyncHttpCacheServiceImpl implements AsyncHttpCacheService {
19-
2025
private static final String DELIMITER = ":";
2126
@Inject private CachedResponseService cachedResponseService;
2227
private String serviceName;
2328
private AsyncHttpClient asyncHttpClient;
2429
private long ttl;
2530

31+
private final Cache<String, ListenableFuture<Response>> cache = CacheBuilder.newBuilder()
32+
.expireAfterWrite(2, TimeUnit.MINUTES)
33+
.build();
34+
2635
@Inject
2736
public AsyncHttpCacheServiceImpl(
2837
@Assisted String serviceName, @Assisted AsyncHttpClient asyncHttpClient, @Assisted long ttl) {
@@ -49,9 +58,11 @@ public Optional<ListenableFuture<Response>> executeRequest(
4958
if (cachedResponse.isPresent()) {
5059
handler.onCompleted(cachedResponse.get());
5160
} else {
52-
responseListenableFuture =
53-
this.asyncHttpClient.executeRequest(
54-
request, buildCachingHandler(handler, responseId, ttl));
61+
responseListenableFuture = cache.get(responseId, () -> {
62+
return this.asyncHttpClient.executeRequest(request,
63+
buildCachingHandler(handler, responseId, ttl));
64+
});
65+
handler.onCompleted(responseListenableFuture.get());
5566
}
5667

5768
return Optional.ofNullable(responseListenableFuture);
@@ -60,7 +71,8 @@ public Optional<ListenableFuture<Response>> executeRequest(
6071
private String buildResponseId(Request request) {
6172
String requestStringId =
6273
StringUtils.join(
63-
request, request.getStringData(), Lists.newArrayList(request.getCookies()).toString());
74+
request, request.getStringData(), Lists.newArrayList(request.getCookies())
75+
.toString());
6476
return StringUtils.joinWith(
6577
DELIMITER, serviceName, String.valueOf(MurmurHash.hash64A(requestStringId.getBytes(), 0)));
6678
}
@@ -72,10 +84,11 @@ private AsyncCompletionHandlerBase buildCachingHandler(
7284
@Override
7385
public Response onCompleted(Response response) throws Exception {
7486
CachedResponse cachedResponse =
75-
new CachedResponse.Builder(response).setId(responseId).build();
87+
new CachedResponse.Builder(response).setId(responseId)
88+
.build();
7689
cachedResponseService.save(cachedResponse, cachingTtl);
7790

78-
return handler.onCompleted(response);
91+
return response;
7992
}
8093

8194
@Override

0 commit comments

Comments
 (0)