├── .gitignore ├── README.adoc ├── pom.xml ├── temperature-service-core ├── pom.xml └── src │ └── main │ └── java │ └── example │ └── app │ └── temp │ └── model │ ├── Temperature.java │ └── Temperatures.java ├── temperature-service-monitor └── pom.xml ├── temperature-service-sensor └── pom.xml ├── temperature-service-server └── pom.xml └── temperature-service-tests └── pom.xml /.gitignore: -------------------------------------------------------------------------------- 1 | *.classpath 2 | *.DS_Store 3 | *.iml 4 | *.ipr 5 | *.iws 6 | *.log 7 | *.settings 8 | *locator 9 | .idea/ 10 | build/ 11 | target/ 12 | -------------------------------------------------------------------------------- /README.adoc: -------------------------------------------------------------------------------- 1 | [[about]] 2 | = Temperature Monitoring and Sensing Application Service 3 | 4 | The Temperature Service application is a temperature sensing and monitoring service composed of 3 Spring Boot 5 | applications managing the backend, temperature sensors and temperature monitors, respectively. 6 | 7 | This example simulates a real world, Internet of Things (IoT) Use Case (UC). 1 application of this service might 8 | include monitoring the world's oceans for sudden/dramatic temperature changes that could be detrimental to 9 | the environment. Another application might be to monitor (commercial) jet engine temperatures while in operation, 10 | and so on. 11 | 12 | 13 | [[modules]] 14 | == Modules 15 | 16 | This Repository consists of 3 Spring Boot applications. 17 | 18 | 1. The `temperature-service-server` is a Spring Boot application used to configure and bootstrap Apache Geode 19 | servers managing the temperature service backend and data store. 20 | 21 | 2. The `temperature-service-sensor` is a Spring Boot application that records temperatures from sensors, 22 | like thermometers and other instruments. Currently, the example generates temperatures readings using 23 | an endless, random stream of ints. 24 | 25 | 3. The `temperature-service-monitor` is a Spring Boot application used to monitor (and optionally act on) 26 | temperature readings originating from temperature sensors. Actions can be performed based on certain temperature 27 | changes, events or thresholds. Currently, the temperature monitors only log the temperature readings/events. 28 | 29 | 30 | [[organization]] 31 | == Organization 32 | 33 | The Repository is organized into 3 main branches: 34 | 35 | 1. `master` - starting point allowing users to build this example from scratch; only includes the 36 | `example.app.temp.model.Temperature` application domain model class. 37 | 38 | 2. `using-spring-data` - complete, runnable example using _Spring Data for Apache Geode_ to configure and run the 39 | Temperature Service application. While _Spring Boot_ is present, the example is not using the convenience and power of 40 | https://github.com/spring-projects/spring-boot-data-geode[_Spring Boot for Apache Geode_]. (See `using-spring-boot`) 41 | 42 | 3. `using-spring-boot` - same, complete, runnable example using https://github.com/spring-projects/spring-boot-data-geode[_Spring Boot for Apache Geode_] 43 | instead of https://github.com/spring-projects/spring-data-geode[_Spring Data for Apache Geode_]. 44 | _Spring Boot for Apache Geode_ provides additional power and convenience (e.g. _convention over configuration_ with 45 | `auto-configuration`) above and beyond simply _Spring Data for Apache Geode_ that makes building Spring 46 | applications powered by Apache Geode even *easier* and *quicker*. This branch showcases these key differences 47 | as well as the convenience/power provided by _Spring Boot for Apache Geode_ vs _Spring Data for Apache Geode_, OOTB. 48 | 49 | 50 | [[features]] 51 | == Features 52 | 53 | Perhaps, the most important goal of the Temperature Service application is to provide some guidance around how to enable 54 | a legacy, enterprise Java application as a *Cloud-Native* application in a cloud environment (e.g. GCP, Azure, AWS), and 55 | what does this specifically mean for *data*? How must my data architecture evolve to operate reliably in cloud context? 56 | 57 | Until now, much of the focus has been on applications, with https://12factor.net/[The 12-Factor Apps]. But, this says 58 | very little about our data (there is a small blurb in https://12factor.net/backing-services[IV. Backing services]). 59 | 60 | Additionally, by adopting a Microservices architecture, applications should own their data source, that each 61 | Microservice should have an individual, properly encapsulated data source. 62 | 63 | Great! But, how do you refactor an existing, proven enterprise application architecture without a complete re-write? 64 | How do you protect your existing investment and migrate to the cloud in a controlled way? 65 | 66 | It is not as simple as just dropping your enterprise application into the cloud and expecting that everything 67 | is just suddenly going to be better. Nor is it as simple as just chopping the monolith up into smaller Microservices. 68 | 69 | Therefore, as you journey towards the cloud, the questions concerning data become what data access patterns emerge 70 | and how do I effectively leverage them in my existing application architecture inside a cloud context and achieve 71 | a much improved user experience and add value (collectively, the bar on Quality of Service (QoS) & our ROI). 72 | 73 | You must carefully understand what are the correct technologies and patterns that need to be applied in a cloud context, 74 | and how. 75 | 76 | The features presented here show how you might go about integrating some of the cloud-native, data access patterns 77 | implemented by Apache Geode, like *caching*, *distributed compute* (Functions) and *event streaming* (CQ) 78 | into your existing applications. We will leverage _Spring_ as our technology of choice to enable these patterns 79 | using Apache Geode. 80 | 81 | By leveraging these features and patterns, you can slowly shift the responsibilities from your existing data 82 | architecture/solutions (e.g. perhaps implemented with an RDBMS) without completely throwing your existing investment 83 | away and starting over, a very costly endeavor to be sure. 84 | 85 | Our feature set for this example will include: 86 | 87 | 1. _Spring Data Repositories_ and _Spring Data for Apache Geode's_ implementation showing how Apache Geode can 88 | be used in _System of Record_ (SoR) _Use Cases_ (UC). 89 | 90 | 2. A far simpler UC for Apache Geode in a Spring context is how to leverage Apache Geode as a "_caching provider_" 91 | in https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#cache[Spring's Cache Abstraction]. 92 | Caching can be used in cases where your application services make potentially expensive calls to a backend data store (e.g. RDBMS) 93 | or perhaps even a remote Microservice (e.g. Google Maps API for geocoding), which incurs latency or resource costs. 94 | Implementing the https://content.pivotal.io/blog/an-introduction-to-look-aside-vs-inline-caching-patterns[**Look-Aside Caching**] 95 | pattern by wrapping your application services with caching logic is an effective way to integrate Apache Geode 96 | in a very non-invasive manner, simply by leveraging _Spring's Cache Abstraction_. 97 | 98 | 3. In the Temperature Service application's case, it uses an Apache Geode Function execution to compute the average 99 | temperature on a periodic basis, which we might expect to be a (more) "complex" and "expensive" operation, since it 100 | goes out over the network across the cluster. However, perhaps our frequency to know the average temperature does not 101 | need to be the most up-to-date and accurate value, so we can wrap the average temperature calculation (a Function 102 | execution) with _Spring's_ caching interceptor described in #2 above. Still, this Function execution (computing 103 | the average temperature) serves another purpose, to demonstrate the power of Apache Geode's distributed compute 104 | functionality using its Map-Reduce-style, aggregation capabilities. That is, rather then bring the data to the logic, 105 | let's send the logic to where the data lives, which can by highly optimized especially when the data is partitioned 106 | (or sharded) across the cluster thereby distributing that load. 107 | 108 | 4. Finally, we leverage another really power feature of Apache Geode in this UC, event streaming. Often times, 109 | we will see polling as means to find out whether something has changed in the state of our application. 110 | With Apache Geode, you can register Continuous Queries (CQ) to express interests in certain events. That interests 111 | are expressed as a predicate in an OQL query. OQL stands for Object Query Language and is not unlike SQL. There 112 | are many similarities but also some verfy fundamental and important differences. The key part to know in this case 113 | (for now) is that you can easily express interests in data based on a query predicate, which is extremely powerful. 114 | Apache Geode takes care of notifying interested clients when the data changes and it matches the CQ OQL query predicate. 115 | Spring makes configuring, registering and handling CQ events very simple. In our Temperature Service application, 116 | we register 2 CQs, 1 to receive events when the temperatures readings are too hot (boiling) and another when 117 | the temperature readings are too cold (freezing). 118 | 119 | More details will be described in each of the individual modules of this application. 120 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 4.0.0 7 | 8 | 9 | org.springframework.boot 10 | spring-boot-starter-parent 11 | 2.0.8.RELEASE 12 | 13 | 14 | io.pivotal.apps 15 | temperature-service-parent 16 | 1.0.0.RELEASE 17 | pom 18 | 19 | 20 | temperature-service-core 21 | temperature-service-monitor 22 | temperature-service-sensor 23 | temperature-service-server 24 | temperature-service-tests 25 | 26 | 27 | Temperature Monitoring and Sensing Service 28 | 29 | Simple example Spring Boot application to manage temperature sensors and monitor temperature readings. 30 | 31 | https://github.com/jxblum/temperature-service 32 | 33 | 34 | 35 | Apache License, Version 2.0 36 | http://www.apache.org/licenses/LICENSE-2.0 37 | 38 | Copyright 2018 the original author or authors. 39 | 40 | Licensed under the Apache License, Version 2.0 (the "License"); 41 | you may not use this file except in compliance with the License. 42 | You may obtain a copy of the License at 43 | 44 | http://www.apache.org/licenses/LICENSE-2.0 45 | 46 | Unless required by applicable law or agreed to in writing, software 47 | distributed under the License is distributed on an "AS IS" BASIS, 48 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 49 | implied. See the License for the specific language governing 50 | permissions and limitations under the License. 51 | 52 | 53 | 54 | 55 | 56 | Pivotal Software, Inc. 57 | http://www.pivotal.io 58 | 59 | 60 | 61 | 62 | jblum 63 | John Blum 64 | jblum at pivotal dot io 65 | Pivotal Software, Inc. 66 | http://www.spring.io 67 | 68 | Spring Data Team 69 | Spring Boot Data GemFire Project Lead (Committer) 70 | Spring Boot Data Geode Project Lead (Committer) 71 | Spring Data Cassandra Project Lead (Committer) 72 | Spring Data GemFire Project Lead (Committer) 73 | Spring Data Geode Project Lead (Committer) 74 | Spring Session Data GemFire Project Lead (Committer) 75 | Spring Session Data Geode Project Lead (Committer) 76 | Apache Geode Committer 77 | 78 | 79 | 80 | 81 | 82 | 1.8 83 | 3.3 84 | 2.19.1 85 | UTF-8 86 | 3.11.1 87 | 1.0.0.M5 88 | 1.01 89 | 1.0.0.M3 90 | 1.0.0.M3 91 | Lovelace-SR5 92 | 2.1.5.RELEASE 93 | 2.1.5.RELEASE 94 | 0.0.1.RC1 95 | 0.0.1.RC1 96 | 1.2.0.RELEASE 97 | 98 | 99 | 100 | 101 | spring-libs-release 102 | Spring Release Maven Repository 103 | https://repo.spring.io/libs-release 104 | 105 | 106 | spring-libs-milestone 107 | Spring Milestone Maven Repository 108 | https://repo.spring.io/libs-milestone 109 | 110 | 111 | spring-libs-snapshot 112 | Spring Snapshot Maven Repository 113 | https://repo.spring.io/libs-snapshot 114 | 115 | 116 | 117 | 118 | 119 | spring-plugins-release 120 | http://repo.spring.io/plugins-release 121 | 122 | 123 | 124 | 125 | 126 | 127 | org.codeprimate 128 | cp-elements 129 | ${cp-elements.version} 130 | 131 | 132 | org.springframework.data 133 | spring-data-gemfire 134 | ${spring-data-gemfire.version} 135 | 136 | 137 | org.springframework.data 138 | spring-data-gemfire-test 139 | ${spring-data-gemfire-test.version} 140 | 141 | 142 | org.springframework.data 143 | spring-data-geode 144 | ${spring-data-geode.version} 145 | 146 | 147 | org.springframework.data 148 | spring-data-geode-test 149 | ${spring-data-geode-test.version} 150 | 151 | 152 | org.springframework.geode 153 | spring-gemfire-starter 154 | ${spring-boot-data-gemfire.version} 155 | 156 | 157 | org.springframework.geode 158 | spring-geode-starter 159 | ${spring-boot-data-geode.version} 160 | 161 | 162 | org.springframework.shell 163 | spring-shell 164 | ${spring-shell.version} 165 | runtime 166 | 167 | 168 | edu.umd.cs.mtc 169 | multithreadedtc 170 | ${multithreadedtc.version} 171 | test 172 | 173 | 174 | 175 | 176 | 177 | 178 | org.assertj 179 | assertj-core 180 | 181 | 182 | org.codeprimate 183 | cp-elements 184 | 185 | 186 | org.projectlombok 187 | lombok 188 | 189 | 190 | org.slf4j 191 | slf4j-api 192 | 193 | 194 | org.slf4j 195 | jcl-over-slf4j 196 | runtime 197 | 198 | 199 | org.slf4j 200 | jul-to-slf4j 201 | runtime 202 | 203 | 204 | org.slf4j 205 | log4j-over-slf4j 206 | runtime 207 | 208 | 209 | ch.qos.logback 210 | logback-classic 211 | 212 | 213 | org.springframework.boot 214 | spring-boot-starter-test 215 | test 216 | 217 | 218 | edu.umd.cs.mtc 219 | multithreadedtc 220 | test 221 | 222 | 223 | 224 | 225 | 226 | 227 | org.apache.maven.plugins 228 | maven-compiler-plugin 229 | ${maven-compiler-plugin.version} 230 | 231 | 232 | -Xlint:unchecked 233 | 234 | 235 | ${java.version} 236 | ${java.version} 237 | 238 | 239 | 240 | org.apache.maven.plugins 241 | maven-surefire-plugin 242 | ${maven-surefire-plugin.version} 243 | 244 | 245 | -Dgemfire.log-level=warning 246 | 247 | 248 | **/*Test.java 249 | **/*Tests.java 250 | 251 | false 252 | 253 | 254 | 255 | 256 | 257 | 258 | -------------------------------------------------------------------------------- /temperature-service-core/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 4.0.0 7 | 8 | 9 | temperature-service-parent 10 | io.pivotal.apps 11 | 1.0.0.RELEASE 12 | 13 | 14 | temperature-service-core 15 | jar 16 | 17 | 18 | 1.17.1 19 | 20 | 21 | 22 | 23 | 24 | org.springframework.data 25 | spring-data-geode 26 | 27 | 28 | 29 | org.fusesource.jansi 30 | jansi 31 | ${jansi.version} 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /temperature-service-core/src/main/java/example/app/temp/model/Temperature.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 13 | * or implied. See the License for the specific language governing 14 | * permissions and limitations under the License. 15 | */ 16 | package example.app.temp.model; 17 | 18 | import java.util.Locale; 19 | import java.util.Optional; 20 | 21 | import lombok.EqualsAndHashCode; 22 | import lombok.Getter; 23 | import lombok.RequiredArgsConstructor; 24 | 25 | import org.apache.commons.lang.StringUtils; 26 | import org.springframework.data.annotation.Transient; 27 | import org.springframework.util.Assert; 28 | 29 | /** 30 | * The {@link Temperature} class is an Abstract Data Type (ADT) modeling a physical temperature containing 31 | * a {@link Double measurement} in a given {@link Scale}. 32 | * 33 | * @author John Blum 34 | * @since 1.0.0 35 | */ 36 | @EqualsAndHashCode 37 | @RequiredArgsConstructor(staticName = "of") 38 | @SuppressWarnings("unused") 39 | public class Temperature { 40 | 41 | @Getter 42 | private final double measurement; 43 | 44 | @Getter 45 | private Scale scale = Scale.getDefault(); 46 | 47 | @Transient 48 | public boolean isBoiling() { 49 | return getScale().isBoiling(getMeasurement()); 50 | } 51 | 52 | @Transient 53 | public boolean isFreezing() { 54 | return getScale().isFreezing(getMeasurement()); 55 | } 56 | 57 | @Transient 58 | public boolean isNormal() { 59 | return getScale().isNormal(getMeasurement()); 60 | } 61 | 62 | public Temperature celsius() { 63 | return in(Scale.CELSIUS); 64 | } 65 | 66 | public Temperature fahrenheit() { 67 | return in(Scale.FAHRENHEIT); 68 | } 69 | 70 | public Temperature kelvin() { 71 | return in(Scale.KELVIN); 72 | } 73 | 74 | public Temperature in(Scale scale) { 75 | this.scale = Scale.nullSafeScale(scale).assertValid(getMeasurement()); 76 | return this; 77 | } 78 | 79 | @Override 80 | public String toString() { 81 | return String.format("%1$s %2$s", StringUtils.leftPad(String.valueOf(getMeasurement()), 6), getScale()); 82 | } 83 | 84 | public enum Scale { 85 | 86 | CELSIUS(0.0d, 100.d, "°C"), 87 | FAHRENHEIT(32.0d, 212.0d, "°F"), 88 | KELVIN(273.15d, 373.15d, "K"); 89 | 90 | private final double boilingTemperature; 91 | private final double freezingTemperature; 92 | 93 | private final String symbol; 94 | 95 | Scale(double freezingTemperature, double boilingTemperature, String symbol) { 96 | this.boilingTemperature = boilingTemperature; 97 | this.freezingTemperature = freezingTemperature; 98 | this.symbol = symbol; 99 | } 100 | 101 | public static Scale getDefault() { 102 | 103 | return Optional.of(Locale.getDefault()) 104 | .filter(Locale.US::equals) 105 | .map(it -> Scale.FAHRENHEIT) 106 | .orElse(Scale.CELSIUS); 107 | } 108 | 109 | public static Scale nullSafeScale(Scale scale) { 110 | return scale != null ? scale : getDefault(); 111 | } 112 | 113 | public Scale assertValid(double temperature) { 114 | 115 | Assert.isTrue(!KELVIN.equals(this) || temperature >= 0.0d, 116 | String.format("Temperature [%s] must be greater than equal to absolute 0 on the Kelvin Scale", 117 | temperature)); 118 | 119 | return this; 120 | } 121 | 122 | public boolean isBoiling(double temperature) { 123 | return temperature >= this.boilingTemperature; 124 | } 125 | 126 | public boolean isFreezing(double temperature) { 127 | return temperature <= this.freezingTemperature; 128 | } 129 | 130 | public boolean isNormal(double temperature) { 131 | return !(isBoiling(temperature) || isFreezing(temperature)); 132 | } 133 | 134 | public double getBoilingTemperature() { 135 | return this.boilingTemperature; 136 | } 137 | 138 | public double getFreezingTemperature() { 139 | return this.freezingTemperature; 140 | } 141 | 142 | public String getSymbol() { 143 | return this.symbol; 144 | } 145 | 146 | @Override 147 | public String toString() { 148 | return getSymbol(); 149 | } 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /temperature-service-core/src/main/java/example/app/temp/model/Temperatures.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 13 | * or implied. See the License for the specific language governing 14 | * permissions and limitations under the License. 15 | */ 16 | package example.app.temp.model; 17 | 18 | import java.util.Arrays; 19 | import java.util.Optional; 20 | 21 | /** 22 | * An enumeration of named {@link Temperature} objects. 23 | * 24 | * @author John Blum 25 | * @see example.app.temp.model.Temperature 26 | * @since 1.0.0 27 | */ 28 | @SuppressWarnings("unused") 29 | public enum Temperatures { 30 | 31 | BOILING_POINT_CELSIUS(Temperature.of(Temperature.Scale.CELSIUS.getBoilingTemperature()).celsius()), 32 | BOILING_POINT_FAHRENHEIT(Temperature.of(Temperature.Scale.FAHRENHEIT.getBoilingTemperature()).fahrenheit()), 33 | BOILING_POINT_KELVIN(Temperature.of(Temperature.Scale.KELVIN.getBoilingTemperature()).fahrenheit()), 34 | 35 | FREEZING_POINT_CELSIUS(Temperature.of(Temperature.Scale.CELSIUS.getFreezingTemperature()).fahrenheit()), 36 | FREEZING_POINT_FAHRENHEIT(Temperature.of(Temperature.Scale.FAHRENHEIT.getFreezingTemperature()).fahrenheit()), 37 | FREEZING_POINT_KELVIN(Temperature.of(Temperature.Scale.KELVIN.getFreezingTemperature()).fahrenheit()), 38 | 39 | ROOM_TEMPERATURE_FAHRENHEIT(Temperature.of(72).fahrenheit()); 40 | 41 | public static Optional valueOf(Temperature temperature) { 42 | 43 | return Arrays.stream(values()) 44 | .filter(temp -> temp.getTemperature().equals(temperature)) 45 | .findFirst(); 46 | } 47 | 48 | private final Temperature temperature; 49 | 50 | Temperatures(Temperature temperature) { 51 | this.temperature = temperature; 52 | } 53 | 54 | public Temperature getTemperature() { 55 | return this.temperature; 56 | } 57 | 58 | @Override 59 | public String toString() { 60 | return getTemperature().toString(); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /temperature-service-monitor/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 4.0.0 7 | 8 | 9 | io.pivotal.apps 10 | temperature-service-parent 11 | 1.0.0.RELEASE 12 | 13 | 14 | temperature-service-monitor 15 | jar 16 | 17 | 18 | 1.0.0 19 | 1.17.1 20 | 21 | 22 | 23 | 24 | 25 | io.pivotal.apps 26 | temperature-service-core 27 | ${project.version} 28 | 29 | 30 | 31 | javax.cache 32 | cache-api 33 | ${cache-api.version} 34 | 35 | 36 | 37 | org.springframework.boot 38 | spring-boot-starter 39 | 40 | 41 | org.springframework.boot 42 | spring-boot-starter-logging 43 | 44 | 45 | 46 | 47 | 48 | org.springframework.data 49 | spring-data-geode 50 | 51 | 52 | 58 | 59 | 60 | org.fusesource.jansi 61 | jansi 62 | ${jansi.version} 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /temperature-service-sensor/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 4.0.0 7 | 8 | 9 | temperature-service-parent 10 | io.pivotal.apps 11 | 1.0.0.RELEASE 12 | 13 | 14 | temperature-service-sensor 15 | jar 16 | 17 | 18 | 1.0.0 19 | 1.17.1 20 | 21 | 22 | 23 | 24 | 25 | io.pivotal.apps 26 | temperature-service-core 27 | ${project.version} 28 | 29 | 30 | 31 | javax.cache 32 | cache-api 33 | ${cache-api.version} 34 | 35 | 36 | 37 | org.springframework.boot 38 | spring-boot-starter 39 | 40 | 41 | org.springframework.boot 42 | spring-boot-starter-logging 43 | 44 | 45 | 46 | 47 | 48 | org.springframework.data 49 | spring-data-geode 50 | 51 | 52 | 58 | 59 | 60 | org.fusesource.jansi 61 | jansi 62 | ${jansi.version} 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /temperature-service-server/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 4.0.0 7 | 8 | 9 | temperature-service-parent 10 | io.pivotal.apps 11 | 1.0.0.RELEASE 12 | 13 | 14 | temperature-service-server 15 | jar 16 | 17 | 18 | 19 | 20 | io.pivotal.apps 21 | temperature-service-core 22 | ${project.version} 23 | 24 | 25 | 26 | org.springframework.boot 27 | spring-boot-starter 28 | 29 | 30 | org.springframework.boot 31 | spring-boot-starter-logging 32 | 33 | 34 | 35 | 36 | 37 | org.springframework.boot 38 | spring-boot-starter-jetty 39 | 40 | 41 | org.springframework.boot 42 | spring-boot-starter-logging 43 | 44 | 45 | runtime 46 | 47 | 48 | 49 | org.springframework.data 50 | spring-data-geode 51 | 52 | 53 | 59 | 60 | 61 | org.springframework.shell 62 | spring-shell 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /temperature-service-tests/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 4.0.0 7 | 8 | 9 | temperature-service-parent 10 | io.pivotal.apps 11 | 1.0.0.RELEASE 12 | 13 | 14 | temperature-service-tests 15 | jar 16 | 17 | 18 | 19 | 20 | io.pivotal.apps 21 | temperature-service-core 22 | ${project.version} 23 | 24 | 25 | 26 | org.springframework.data 27 | spring-data-geode-test 28 | 29 | 30 | 31 | 32 | 33 | --------------------------------------------------------------------------------