1
1
package com .wego .httpcache .services .impl ;
2
2
3
+ import com .google .common .cache .Cache ;
4
+ import com .google .common .cache .CacheBuilder ;
3
5
import com .google .common .collect .Lists ;
4
6
import com .google .inject .Inject ;
5
7
import com .google .inject .assistedinject .Assisted ;
11
13
import com .wego .httpcache .dao .models .CachedResponse ;
12
14
import com .wego .httpcache .services .AsyncHttpCacheService ;
13
15
import com .wego .httpcache .services .CachedResponseService ;
16
+
14
17
import java .util .Optional ;
18
+ import java .util .concurrent .TimeUnit ;
19
+
15
20
import org .apache .commons .lang3 .StringUtils ;
21
+
16
22
import redis .clients .util .MurmurHash ;
17
23
18
24
public class AsyncHttpCacheServiceImpl implements AsyncHttpCacheService {
19
-
20
25
private static final String DELIMITER = ":" ;
21
26
@ Inject private CachedResponseService cachedResponseService ;
22
27
private String serviceName ;
23
28
private AsyncHttpClient asyncHttpClient ;
24
29
private long ttl ;
25
30
31
+ private final Cache <String , ListenableFuture <Response >> cache = CacheBuilder .newBuilder ()
32
+ .expireAfterWrite (2 , TimeUnit .MINUTES )
33
+ .build ();
34
+
26
35
@ Inject
27
36
public AsyncHttpCacheServiceImpl (
28
37
@ Assisted String serviceName , @ Assisted AsyncHttpClient asyncHttpClient , @ Assisted long ttl ) {
@@ -49,9 +58,11 @@ public Optional<ListenableFuture<Response>> executeRequest(
49
58
if (cachedResponse .isPresent ()) {
50
59
handler .onCompleted (cachedResponse .get ());
51
60
} 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 ());
55
66
}
56
67
57
68
return Optional .ofNullable (responseListenableFuture );
@@ -60,7 +71,8 @@ public Optional<ListenableFuture<Response>> executeRequest(
60
71
private String buildResponseId (Request request ) {
61
72
String requestStringId =
62
73
StringUtils .join (
63
- request , request .getStringData (), Lists .newArrayList (request .getCookies ()).toString ());
74
+ request , request .getStringData (), Lists .newArrayList (request .getCookies ())
75
+ .toString ());
64
76
return StringUtils .joinWith (
65
77
DELIMITER , serviceName , String .valueOf (MurmurHash .hash64A (requestStringId .getBytes (), 0 )));
66
78
}
@@ -72,10 +84,11 @@ private AsyncCompletionHandlerBase buildCachingHandler(
72
84
@ Override
73
85
public Response onCompleted (Response response ) throws Exception {
74
86
CachedResponse cachedResponse =
75
- new CachedResponse .Builder (response ).setId (responseId ).build ();
87
+ new CachedResponse .Builder (response ).setId (responseId )
88
+ .build ();
76
89
cachedResponseService .save (cachedResponse , cachingTtl );
77
90
78
- return handler . onCompleted ( response ) ;
91
+ return response ;
79
92
}
80
93
81
94
@ Override
0 commit comments