View Javadoc

1   package com.atlassian.vcache.internal.memcached;
2   
3   import com.atlassian.marshalling.api.MarshallingPair;
4   import com.atlassian.vcache.DirectExternalCache;
5   import com.atlassian.vcache.ExternalCacheSettings;
6   import com.atlassian.vcache.JvmCache;
7   import com.atlassian.vcache.JvmCacheSettings;
8   import com.atlassian.vcache.StableReadExternalCache;
9   import com.atlassian.vcache.TransactionalExternalCache;
10  import com.atlassian.vcache.internal.core.service.AbstractVCacheService;
11  import com.atlassian.vcache.internal.core.service.GuavaJvmCache;
12  import com.atlassian.vcache.internal.guava.GuavaDirectExternalCache;
13  import com.atlassian.vcache.internal.guava.GuavaStableReadExternalCache;
14  import com.atlassian.vcache.internal.guava.GuavaTransactionalExternalCache;
15  import com.atlassian.vcache.internal.guava.GuavaUtils;
16  import org.slf4j.Logger;
17  import org.slf4j.LoggerFactory;
18  
19  import java.util.Optional;
20  
21  import static java.util.Objects.requireNonNull;
22  
23  /**
24   * Main service that is backed by <tt>Memcached</tt>.
25   */
26  public class MemcachedVCacheService extends AbstractVCacheService {
27      private static final Logger log = LoggerFactory.getLogger(MemcachedVCacheService.class);
28  
29      private final MemcachedVCacheServiceSettings serviceSettings;
30  
31      /**
32       * Creates an instance using the supplied settings.
33       *
34       * @param settings the settings to be used for creating the instance.
35       * @since 1.3.0
36       */
37      public MemcachedVCacheService(MemcachedVCacheServiceSettings settings) {
38          super(settings.getContextSupplier(),
39                  settings.getWorkContextContextSupplier(),
40                  settings.getDefaultsProvider(),
41                  settings.getCreationHandler(),
42                  settings.getMetricsCollector(),
43                  settings.getExternalCacheKeyGenerator(),
44                  settings.getBegunTransactionalActivityHandler(),
45                  settings.getLockTimeout());
46          this.serviceSettings = requireNonNull(settings);
47      }
48  
49      @Override
50      protected Logger log() {
51          return log;
52      }
53  
54      @Override
55      protected <K, V> JvmCache<K, V> createJvmCache(String name, JvmCacheSettings settings) {
56          return new GuavaJvmCache<>(name, settings, lockTimeout);
57      }
58  
59      @Override
60      protected <V> TransactionalExternalCache<V> createTransactionalExternalCache(String name,
61                                                                                   ExternalCacheSettings settings,
62                                                                                   MarshallingPair<V> valueMarshalling,
63                                                                                   boolean valueSerializable) {
64          if (serviceSettings.getDontExternaliseCache().apply(name)) {
65              log.trace("Cache {}: not being externalised", name);
66              return new GuavaTransactionalExternalCache<>(
67                      name,
68                      GuavaUtils.buildDelegate(settings),
69                      threadLocalContextSupplier,
70                      externalCacheKeyGenerator,
71                      (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
72                      transactionControlManager,
73                      metricsCollector,
74                      lockTimeout);
75          }
76  
77          return new MemcachedTransactionalExternalCache<>(
78                  serviceSettings,
79                  threadLocalContextSupplier,
80                  externalCacheKeyGenerator,
81                  name,
82                  valueMarshalling,
83                  settings,
84                  transactionControlManager,
85                  metricsCollector);
86      }
87  
88      @Override
89      protected <V> StableReadExternalCache<V> createStableReadExternalCache(String name,
90                                                                             ExternalCacheSettings settings,
91                                                                             MarshallingPair<V> valueMarshalling,
92                                                                             boolean valueSerializable) {
93          if (serviceSettings.getDontExternaliseCache().apply(name)) {
94              log.trace("Cache {}: not being externalised", name);
95              return new GuavaStableReadExternalCache<>(
96                      name,
97                      GuavaUtils.buildDelegate(settings),
98                      threadLocalContextSupplier,
99                      externalCacheKeyGenerator,
100                     (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
101                     metricsCollector,
102                     serviceSettings.getLockTimeout());
103         }
104 
105         return new MemcachedStableReadExternalCache<>(
106                 serviceSettings,
107                 threadLocalContextSupplier,
108                 externalCacheKeyGenerator,
109                 name,
110                 valueMarshalling,
111                 settings,
112                 metricsCollector);
113     }
114 
115     @Override
116     protected <V> DirectExternalCache<V> createDirectExternalCache(String name,
117                                                                    ExternalCacheSettings settings,
118                                                                    MarshallingPair<V> valueMarshalling,
119                                                                    boolean valueSerializable) {
120         if (serviceSettings.getDontExternaliseCache().apply(name)) {
121             log.trace("Cache {}: not being externalised", name);
122             return new GuavaDirectExternalCache<>(
123                     name,
124                     GuavaUtils.buildDelegate(settings),
125                     threadLocalContextSupplier,
126                     externalCacheKeyGenerator,
127                     (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
128                     lockTimeout);
129         }
130         return new MemcachedDirectExternalCache<>(
131                 serviceSettings,
132                 threadLocalContextSupplier,
133                 externalCacheKeyGenerator,
134                 name,
135                 valueMarshalling,
136                 settings);
137     }
138 }