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.getClientSupplier(),
79                  threadLocalContextSupplier,
80                  externalCacheKeyGenerator,
81                  name,
82                  valueMarshalling,
83                  settings,
84                  transactionControlManager,
85                  metricsCollector,
86                  lockTimeout);
87      }
88  
89      @Override
90      protected <V> StableReadExternalCache<V> createStableReadExternalCache(String name,
91                                                                             ExternalCacheSettings settings,
92                                                                             MarshallingPair<V> valueMarshalling,
93                                                                             boolean valueSerializable) {
94          if (serviceSettings.getDontExternaliseCache().apply(name)) {
95              log.trace("Cache {}: not being externalised", name);
96              return new GuavaStableReadExternalCache<>(
97                      name,
98                      GuavaUtils.buildDelegate(settings),
99                      threadLocalContextSupplier,
100                     externalCacheKeyGenerator,
101                     (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
102                     metricsCollector,
103                     serviceSettings.getLockTimeout());
104         }
105 
106         return new MemcachedStableReadExternalCache<>(
107                 serviceSettings.getClientSupplier(),
108                 threadLocalContextSupplier,
109                 externalCacheKeyGenerator,
110                 name,
111                 valueMarshalling,
112                 settings,
113                 metricsCollector,
114                 serviceSettings.getLockTimeout());
115     }
116 
117     @Override
118     protected <V> DirectExternalCache<V> createDirectExternalCache(String name,
119                                                                    ExternalCacheSettings settings,
120                                                                    MarshallingPair<V> valueMarshalling,
121                                                                    boolean valueSerializable) {
122         if (serviceSettings.getDontExternaliseCache().apply(name)) {
123             log.trace("Cache {}: not being externalised", name);
124             return new GuavaDirectExternalCache<>(
125                     name,
126                     GuavaUtils.buildDelegate(settings),
127                     threadLocalContextSupplier,
128                     externalCacheKeyGenerator,
129                     (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
130                     lockTimeout);
131         }
132         return new MemcachedDirectExternalCache<>(
133                 serviceSettings.getClientSupplier(),
134                 threadLocalContextSupplier,
135                 externalCacheKeyGenerator,
136                 name,
137                 valueMarshalling,
138                 settings,
139                 lockTimeout);
140     }
141 }