├── .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 |
--------------------------------------------------------------------------------