Hello John,
It is more than helpful, it is clear complete and documented with lot of reference. I knew that the Cache was a singleton but I did not make the link you presented in your response. Thank you very much for your time and your attention. I really appreciate it Best regards Paul From: John Blum [mailto:[email protected]] Sent: 23 January 2017 00:12 To: [email protected]; [email protected] Subject: Re: Access to Cache reference from Listener code deployed in a server Hi Paul- Yes, the later... > Or may be there is another solution I completely missed? A Geode cache instance is a "Singleton" in the Geode JVM process (technically, by ClassLoader, however, you only ever create 1 instance per JVM). So... You can use the <http://data-docs-samples.cfapps.io/docs-gemfire/latest/javadocs/japi/com/gemstone/gemfire/cache/CacheFactory.html#getAnyInstance()> CacheFactory.getAnyInstance() [1] to return the "single" instance of a Geode "peer" cache (server-side) and the <http://data-docs-samples.cfapps.io/docs-gemfire/latest/javadocs/japi/com/gemstone/gemfire/cache/client/ClientCacheFactory.html#getAnyInstance()> ClientCacheFactory.getAnyInstance() [2] to get the "single" instance of a Geode "client" cache. Typically, you always create Geode cache applications that are 1 or the other... i.e. either a peer (embedded) cache application (i.e. as in an actual peer member in the cluster (distributed system)) or more typically, as a cache client application. However, if you really don't know, then you can inspect your cache instance using logic similar to <https://github.com/spring-projects/spring-data-gemfire/blob/1.9.0.RC1/src/main/java/org/springframework/data/gemfire/util/CacheUtils.java#L54-L62> this [3] (for a client), and <https://github.com/spring-projects/spring-data-gemfire/blob/1.9.0.RC1/src/main/java/org/springframework/data/gemfire/util/CacheUtils.java#L77-L85> this [4] (for a peer), and/or even combine this logic in some way, as needed, since both <http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/Cache.html> Cache [5] (peer) and <http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/client/ClientCache.html> ClientCache [6] (client) extends <http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/GemFireCache.html> GemFireCache [7]. The reason why the logic in [3] & [4] is more elaborate then just the instanceof check is because there is only 1 implementation of all these interfaces, <https://github.com/apache/geode/blob/rel/v1.0.0-incubating/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java#L241> GemFireCacheImpl [8]. In some Geode callback APIs, they give you a reference to the Region. >From that, you can get the cache instance. For example.. <http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/asyncqueue/AsyncEventListener.html> AsyncEventListener [9], processEvents(:List< <http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/asyncqueue/AsyncEvent.html> AsyncEvent>) [10], which extends <http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/wan/GatewayQueueEvent.html> GatewayQueueEvent [11], which as the method <http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/wan/GatewayQueueEvent.html#getRegion--> getRegion():Region<K, V> [12], and the Region interface has the method, <http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/Region.html#getRegionService--> getRegionService() [13], which is exactly what the cache instance is ( <http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/GemFireCache.html> GemFireCache [7] implements the <http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/RegionService.html> RegionService interface [14], and therefore can be cast accordingly. Anyway, there are typically multiple ways to get a reference to the cache instance. In Spring, it is much more elegant since I can inject/auto-wire a reference to the cache instance in my AsyncEventListener implementation (defined as a bean in the Spring context). However, you must be very careful what Geode objects you inject into a Geode callback, like AsyncEventListener, since you could create a circular reference (Region A -> AEQ -> Listener -> Region (?), which is decidedly bad, particularly if ? == A. Anyway, hope this helps. Cheers, John [1] http://data-docs-samples.cfapps.io/docs-gemfire/latest/javadocs/japi/com/gemstone/gemfire/cache/CacheFactory.html#getAnyInstance() [2] http://data-docs-samples.cfapps.io/docs-gemfire/latest/javadocs/japi/com/gemstone/gemfire/cache/client/ClientCacheFactory.html#getAnyInstance() [3] https://github.com/spring-projects/spring-data-gemfire/blob/1.9.0.RC1/src/main/java/org/springframework/data/gemfire/util/CacheUtils.java#L54-L62 [4] https://github.com/spring-projects/spring-data-gemfire/blob/1.9.0.RC1/src/main/java/org/springframework/data/gemfire/util/CacheUtils.java#L77-L85 [5] http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/Cache.html [6] http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/client/ClientCache.html [7] http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/GemFireCache.html [8] https://github.com/apache/geode/blob/rel/v1.0.0-incubating/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java#L241 [9] http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/asyncqueue/AsyncEventListener.html [10] http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/asyncqueue/AsyncEvent.html [11] http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/wan/GatewayQueueEvent.html [12] http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/wan/GatewayQueueEvent.html#getRegion-- [13] http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/Region.html#getRegionService-- [14] http://geode.apache.org/releases/latest/javadoc/org/apache/geode/cache/RegionService.html On Sun, Jan 22, 2017 at 3:45 AM, Paul Perez <[email protected] <mailto:[email protected]> > wrote: Hello All, I hope you have a good weekend. I have some questions regarding the code to write in a Listener such as an AsyncEventListener to get a reference to a cache when the listener is deployed in a server. I tried to deployed a simple AsyncEventlistener on a server. So I Create a event queue from gfsh Create an Asynchronous Event Queue: create async-event-queue --id=myAEQ --listener=pymma.testgeode01.MyFirstAsynchronousEventListener --parallel=true Create a region :create region --name=customerRegion --type=PARTITION --group=groupA --async-event-queue-id=myAEQ In the example given in the Java doc http://geode.apache.org/releases/latest/javadoc/index.html the access to the cache is provided by a CacheHelper: final Region duplicateRegion = CacheHelper.getCache().getRegion(originalRegionName + "_DUP"); Since I did not find any reference to what a Cache Helper is and from where it comes from, at the first glance, in my current POC, I created my own cache helper with the static method getCache. public static Cache getCache () { Properties properties = new Properties(); properties.setProperty("locators","localhost[10334]"); Cache cache = new CacheFactory(properties).create(); return cache; } It could be also a Clientcache. In my example I duplicated the entries from customerRegion to another region and it works well. Nevertheless, since the Listener is deployed in a server itself, I though that a reference to the cache could be given to the event by a more direct way. The interface AsyncEventListener is outside the scope of this topic. I tried to search if there was not a special class CacheHelper and I found one similar named CacheRegionHelper. But without documentation in the Java API I did not want to use it. So if Geode community has few minutes to reply, I would like to ask these questions: In the example provided in the API, what is The CacheHelper? Is it a class provided in Geode Libraries or do we need to develop by ourself. In that case, Do we consider the CacheHelper as a regular client and use the cache factory to create it?. Or does it exist a direct way to access to a cache reference through the Server the listener is deploy in? Or may be there is another solution I completely missed? Thank you for your help. Best regards Paul -- -John john.blum10101 (skype)
