Greetings Apache Geode Community- It is my pleasure to announce the availability of *Spring Data* *Kay SR2* (*Service Release* 2) which includes *Spring Data Geode* *2.0.2.RELEASE*. The official release announcement is here...
https://spring.io/blog/2017/11/27/spring-data-ingalls-sr9-an d-kay-sr2-released Unfortunately, we missed the announce for the first service release of *Kay*, which occurred back on October 27th; my apologies. So, in both *Kay SR1 + SR2*, you will find the follow improvements... * Better, more reliable integration between *Spring's Cache Abstraction* [1] and *Spring* container initialization (particularly in the context of proxies) with Geode CQ [2]. I have even have a complete example here [3] (README in-progress). * In both *Entity-defined* as well as *Caching-defined* *Regions*, I have enabled the ability to configure the ClientRegionShortcut for client-side generated Regions and RegionShortcut for server-side generated Regions. You can learn more about *Entity-defined Regions* [4] and *Caching-defined Regions* [5] by following the links. * In addition to *Spring's Caching Annotations* [6] I have also added support for JSR-107 *JCache* API Annotations in SDG's *Caching-defined Regions*. That means, if you used any of the JSR-107 annotations in your application service components and declared the SDG @EnableCachingDefinedRegions annotation on your *Spring Boot* @Configuration class, then you can define cache client Regions from the "caches" identified in your use of JSR-107 annotations. * I added Annotation support for configuring Apache Geode Region Compression [7] using the @EnableCompression annotation; see docs [8] for more details. By default, it just enables the Google Snappy Compressor, provided by Apache Geode OOTB. Several other little enhancements were made and help to improve the overall development experience when using Apache Geode, especially in a *Spring* context. See the *changelog* [9] for a complete list of changes in *Kay SR1 + SR2*. Finally, I leave you with a... *SPRING-GEODE TIP:* Let's say you want to create a simple *Spring Boot*, ClientCache application to store and manage customer data. It is as simple as this... // Define Customer... @Region("Customers") public class Customer { private Long id; @Indexed(from = "/Customers") private String name; ... } // Define a Repository to persist and query Customers public interface CustomerRepository extends CrudRepository<Customer, Long> { ... } // Finally, create your *Spring Boot* application & run everything... @SpringBootApplication @ClientCacheApplication @EnableEntityDefinedRegions(basePackageClasses = Customer.class, clientRegionShortcut = ClientRegionShortcut.LOCAL) @EnableGemfireRepositories(basePackageClasses = CustomerRepository.class) @EnableIndexing @EnablePdx //@EnableClusterConfiguration(useHttp = true) public class SpringBootApacheGeodeClientApplication { public static void main(String[] args) { SpringApplication.run(SpringBootApacheGeodeClientApplication.class, args); } ... } I challenge anyone to find any boilerplate code in this example application (other than the basic, yet essential application/feature bootstrapping). No longer do you need boilerplate code to configure and create a *ClientCache*, *Pool*, *Regions*, *Indexes*, PDX, etc or to perform basic CRUD and simple (OQL) Queries. As am application developer, you can remain completely *focused* and *committed* to your application business requirements and logic, and let *SDG* worry about the plumbing. Because, I am "initially" using a ClientRegionShortcut.LOCAL, this " *ClientCache*" application runs properly, all by itself, without the need to start a server. This is ideal when you are rapidly prototyping your application and want to iterate (DEV-TEST) quickly! However, it is a simple matter to also convert this application to use Apache Geode's client/server topology as well... simply remove the configuration for the clientRegionShortcut attribute in the @EnableEntityDefinedRegions annotation. By default, a client Region is set to PROXY and all Region ops will be sent to a server using the *ClientCache* "DEFAULT" *Pool*, which is configured to connect to a server running on localhost, listening on port 40404, by default. You can start 1 or more server(s) using *Gfsh* and optionally configure them either using *Gfsh* or SDG. You choose! While it is likely that you will use *Gfsh* to script your configuration of the server(s) in the cluster, there is nothing that helps you on the client, other than SDG, of course! Imagine if you have 100s of Regions to configure, and not only Regions, but Indexes, Disk Stores, and other schema objects as well. While it is appropriate (and even "*recommended*") to use *Gfsh* to script your final production configuration deployment, during your "building" and "testing' phases, personally, I prefer to use the new SDG @EnableClusterConfiguration(useHttp = true) annotation. This annotation will push all *Entity-defined Region* configuration up to the server(s) in your cluster, from the client app. Not only will it create corresponding server-side (PARTITION) Regions for all the client (PROXY) Regions, it will also create Indexes from your application domain object @Indexed fields on the server(s) as well. NOTE: You need a full installation of Apache Geode on the servers to use the @EnableClusterConfiguration feature. And, if that were not enough, the @EnableClusterConfiguration annotation performs the cluster server(s) modification in such a way that Apache Geode's Cluster Configuration service [10] will remember these changes. Therefore, if you had new nodes, those nodes will have a consistent configuration. Additionally, if you bounce your entire cluster, or the cluster goes down, it will come back up with the same configuration when restarted. SDG is very careful not to stomp on your existing (sever/cluster) configuration, hopefully for obvious reasons. If the Region already exists, SDG will not attempt to create it. I will be posting more examples like this over time so that everyone here will become familiar with the features and conveniences that SDG is adding. You find details on the complete example ( https://github.com/ jxblum/simple-spring-geode-application) in *GitHub* [11]. Happy coding! -- -John [1] https://docs.spring.io/spring/docs/current/spring-framew ork-reference/integration.html#cache [2] http://geode.apache.org/docs/guide/12/developing/continu ous_querying/chapter_overview.html [3] https://github.com/jxblum/contacts-application/tree/mast er/continuous-query-example [4] https://docs.spring.io/spring-data/geode/docs/current/re ference/html/#bootstrap-annotation-config-regions [5] https://docs.spring.io/spring-data/geode/docs/current/re ference/html/#bootstrap-annotation-config-caching [6] https://docs.spring.io/spring/docs/current/spring-framew ork-reference/integration.html#cache-jsr-107 [7] http://geode.apache.org/docs/guide/12/managing/region_co mpression/region_compression.html [8] https://docs.spring.io/spring-data/geode/docs/current/re ference/html/#bootstrap-annotation-config-region-compression [9] https://docs.spring.io/spring-data/geode/docs/2.0.2.RELE ASE/changelog.txt [10] http://geode.apache.org/docs/guide/12/configuring/clust er_config/gfsh_persist.html [11] https://github.com/jxblum/simple-spring-geode-application