diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index ff1189f..243a6ae 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -2,17 +2,29 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
@@ -33,126 +45,151 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -217,11 +262,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -253,6 +298,8 @@
+
+
@@ -295,16 +342,6 @@
-
-
-
-
-
-
-
-
-
-
@@ -321,77 +358,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
+
-
+
@@ -399,45 +383,20 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
-
-
-
-
-
+
-
-
@@ -464,16 +423,22 @@
-
+
+
+
+
+
+
+
@@ -502,7 +467,7 @@
-
+
@@ -530,7 +495,7 @@
-
+
@@ -540,7 +505,7 @@
-
+
@@ -609,15 +574,16 @@
-
+
+
-
+
-
+
@@ -633,17 +599,16 @@
-
-
+
-
+
-
+
@@ -652,9 +617,10 @@
+
-
+
@@ -664,45 +630,12 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -711,9 +644,6 @@
-
-
-
@@ -730,8 +660,6 @@
-
-
@@ -777,13 +705,6 @@
-
-
-
-
-
-
-
@@ -798,16 +719,6 @@
-
-
-
-
-
-
-
-
-
-
@@ -817,165 +728,166 @@
-
+
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
+
+
+
+
-
-
-
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
+
+
+
+
+
-
+
-
-
+
+
-
-
-
+
-
-
+
+
+
+
+
-
+
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
-
-
-
-
-
+
+
-
+
-
-
-
-
-
-
-
+
+
diff --git a/data-consumer/pom.xml b/data-consumer/pom.xml
index f186442..15002e8 100644
--- a/data-consumer/pom.xml
+++ b/data-consumer/pom.xml
@@ -20,5 +20,9 @@
org.springframework.amqp
spring-rabbit
+
+ org.springframework.boot
+ spring-boot-starter-data-mongodb
+
\ No newline at end of file
diff --git a/data-consumer/src/main/java/com/artgeektech/iotmicroservices/Constants.java b/data-consumer/src/main/java/com/artgeektech/iotmicroservices/Constants.java
new file mode 100644
index 0000000..891aa70
--- /dev/null
+++ b/data-consumer/src/main/java/com/artgeektech/iotmicroservices/Constants.java
@@ -0,0 +1,13 @@
+package com.artgeektech.iotmicroservices;
+
+/**
+ * Created by guang on 5:49 AM 8/19/18.
+ */
+public class Constants {
+
+ public static final String EXCHANGE_NAME = "AirDataExchange";
+
+ public static final String QUEUE_NAME = "AirDataQueue";
+
+ public static final String ROUTING_KEY = "airdata.ingested";
+}
diff --git a/data-consumer/src/main/java/com/artgeektech/iotmicroservices/DataConsumerApplication.java b/data-consumer/src/main/java/com/artgeektech/iotmicroservices/DataConsumerApplication.java
index 49e2289..c34af5f 100644
--- a/data-consumer/src/main/java/com/artgeektech/iotmicroservices/DataConsumerApplication.java
+++ b/data-consumer/src/main/java/com/artgeektech/iotmicroservices/DataConsumerApplication.java
@@ -1,9 +1,16 @@
package com.artgeektech.iotmicroservices;
+import com.artgeektech.iotmicroservices.model.AirData;
+import com.artgeektech.iotmicroservices.repository.AirDataRepository;
+import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.annotation.Bean;
+
+import java.sql.Timestamp;
/**
* Created by guang on 11:42 AM 8/18/18.
@@ -12,7 +19,52 @@
@EnableDiscoveryClient
@EnableRabbit
public class DataConsumerApplication {
+
+ @Autowired
+ private static AirDataRepository airDataRepository;
+
+
+ @Bean
+ public Exchange airDataExchange() {
+ return new TopicExchange(Constants.EXCHANGE_NAME);
+ }
+
+ @Bean
+ public Queue queue() {
+ return new Queue(Constants.QUEUE_NAME);
+ }
+
+ @Bean
+ public Binding binding(Queue queue, Exchange dataExchange) {
+ return BindingBuilder
+ .bind(queue)
+ .to(dataExchange)
+ .with(Constants.ROUTING_KEY).noargs();
+ }
+
public static void main(String[] args) {
SpringApplication.run(DataConsumerApplication.class, args);
+ System.out.println("Main in Mongo");
+
+ // save to DB
+ AirData data1 = new AirData(
+ 1d, 1d, 1d, 1d,
+ new Timestamp(System.currentTimeMillis()));
+ AirData data2 = new AirData(
+ 1d, 1d, 1d, 1d,
+ new Timestamp(System.currentTimeMillis()));
+ AirData data3 = new AirData(
+ 2d, 1d, 1d, 1d,
+ new Timestamp(System.currentTimeMillis()));
+ airDataRepository.save(data1);
+ airDataRepository.save(data2);
+ airDataRepository.save(data3);
+ airDataRepository.save(data3);
+
+ for (AirData data: airDataRepository.findAll()) {
+ System.out.println("printing Mongo DB");
+ System.out.println(data);
+ System.out.println(data.toString());
+ }
}
}
diff --git a/data-consumer/src/main/java/com/artgeektech/iotmicroservices/configuration/DataConsumerConfiguration.java b/data-consumer/src/main/java/com/artgeektech/iotmicroservices/configuration/DataConsumerConfiguration.java
deleted file mode 100644
index c275a54..0000000
--- a/data-consumer/src/main/java/com/artgeektech/iotmicroservices/configuration/DataConsumerConfiguration.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.artgeektech.iotmicroservices.configuration;
-
-import org.springframework.amqp.core.*;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * Created by guang on 12:00 PM 8/18/18.
- */
-@Configuration
-public class DataConsumerConfiguration {
- @Bean
- public Exchange dataExchange() {
- return new TopicExchange("DataExchange");
- }
-
- @Bean
- public Queue queue() {
- return new Queue("DataQueue");
- }
-
- @Bean
- public Binding binding(Queue queue, Exchange dataExchange) {
- return BindingBuilder
- .bind(queue)
- .to(dataExchange)
- .with("airdata.ingested").noargs();
- }
-
-}
diff --git a/data-consumer/src/main/java/com/artgeektech/iotmicroservices/controller/DataConsumerController.java b/data-consumer/src/main/java/com/artgeektech/iotmicroservices/controller/DataConsumerController.java
index db3d553..0646e31 100644
--- a/data-consumer/src/main/java/com/artgeektech/iotmicroservices/controller/DataConsumerController.java
+++ b/data-consumer/src/main/java/com/artgeektech/iotmicroservices/controller/DataConsumerController.java
@@ -1,10 +1,11 @@
package com.artgeektech.iotmicroservices.controller;
+import com.artgeektech.iotmicroservices.Constants;
+import com.artgeektech.iotmicroservices.model.AirData;
+import com.artgeektech.iotmicroservices.repository.AirDataRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
-import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -14,21 +15,37 @@
@Component
public class DataConsumerController {
private static final Logger logger = LoggerFactory.getLogger(DataConsumerController.class);
- private static final String routingKey = "airdata.ingested";
@Autowired
- private RabbitTemplate rabbitTemplate;
+ private AirDataRepository airDataRepository;
- @Autowired
- private Exchange exchange;
+ @RabbitListener(queues = Constants.QUEUE_NAME)
+ public void process(AirData airData) {
+
+ logger.info("Received message from MQ '{}'", airData);
- @RabbitListener(queues="DataQueue")
- public void receive1(String message) {
- logger.info("Received message '{}'", message);
+ // simple rule engine handling
+ if (airData.getTemperature() > 50) {
+ triggerActionAlert("Temperature too high!!");
+ }
+ if (airData.getCo2() > 50) {
+ triggerActionAlert("CO2 too high!!!");
+ }
+ if (airData.getPm2p5() > 50) {
+ triggerActionAlert("Too much Dust!!!");
+ }
+
+ // save to DB
+ airDataRepository.save(airData);
+ logger.info("Saved message to Mongo DB '{}'", airData);
+ for (AirData data: airDataRepository.findAll()) {
+ System.out.println("printing Mongo DB");
+ System.out.println(data);
+ System.out.println(data.toString());
+ }
}
-// @RabbitListener(queues="DataQueue")
-// public void receive2(AirData message) {
-// logger.info("Received message '{}'", message.toString());
-// }
+ private void triggerActionAlert(String msg) {
+ System.out.println("Sending the Email Alert: " + msg);
+ }
}
diff --git a/data-consumer/src/main/java/com/artgeektech/iotmicroservices/AirData.java b/data-consumer/src/main/java/com/artgeektech/iotmicroservices/model/AirData.java
similarity index 53%
rename from data-consumer/src/main/java/com/artgeektech/iotmicroservices/AirData.java
rename to data-consumer/src/main/java/com/artgeektech/iotmicroservices/model/AirData.java
index 43e31e5..c3c5f3c 100644
--- a/data-consumer/src/main/java/com/artgeektech/iotmicroservices/AirData.java
+++ b/data-consumer/src/main/java/com/artgeektech/iotmicroservices/model/AirData.java
@@ -1,12 +1,9 @@
-package com.artgeektech.iotmicroservices;
+package com.artgeektech.iotmicroservices.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.sql.Timestamp;
@@ -15,25 +12,9 @@
@NoArgsConstructor
public class AirData implements Serializable {
- @NotNull
- @Min(1)
- @Max(100)
private Double temperature;
-
- @NotNull
- @Min(1)
- @Max(100)
private Double humidity;
-
- @NotNull
- @Min(1)
- @Max(100)
private Double pm2p5;
-
- @NotNull
- @Min(1)
- @Max(100)
private Double co2;
-
private Timestamp timestamp;
}
diff --git a/data-consumer/src/main/java/com/artgeektech/iotmicroservices/repository/AirDataRepository.java b/data-consumer/src/main/java/com/artgeektech/iotmicroservices/repository/AirDataRepository.java
new file mode 100644
index 0000000..b70f99a
--- /dev/null
+++ b/data-consumer/src/main/java/com/artgeektech/iotmicroservices/repository/AirDataRepository.java
@@ -0,0 +1,10 @@
+package com.artgeektech.iotmicroservices.repository;
+
+import com.artgeektech.iotmicroservices.model.AirData;
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+/**
+ * Created by guang on 7:04 AM 8/19/18.
+ */
+public interface AirDataRepository extends MongoRepository {
+}
diff --git a/data-consumer/src/main/resources/application.yml b/data-consumer/src/main/resources/application.yml
index 9b2887d..04dac75 100644
--- a/data-consumer/src/main/resources/application.yml
+++ b/data-consumer/src/main/resources/application.yml
@@ -6,6 +6,13 @@ spring:
port: 5672
username: guest
password: guest
+ data:
+ mongodb:
+ host: localhost
+ port: 27072
+ database: airdata-db
+ username: root
+ password: password
server:
port: 9002 # 指定该Eureka实例的端口
@@ -16,12 +23,3 @@ eureka:
client:
serviceUrl:
defaultZone: http://service-registry:8761/eureka/
-
-app:
- exchange:
- name: DataExchange
- queue:
- name: DataQueue
- routing:
- key: airdata.ingested
-
diff --git a/data-consumer/target/classes/application.yml b/data-consumer/target/classes/application.yml
index 9b2887d..04dac75 100644
--- a/data-consumer/target/classes/application.yml
+++ b/data-consumer/target/classes/application.yml
@@ -6,6 +6,13 @@ spring:
port: 5672
username: guest
password: guest
+ data:
+ mongodb:
+ host: localhost
+ port: 27072
+ database: airdata-db
+ username: root
+ password: password
server:
port: 9002 # 指定该Eureka实例的端口
@@ -16,12 +23,3 @@ eureka:
client:
serviceUrl:
defaultZone: http://service-registry:8761/eureka/
-
-app:
- exchange:
- name: DataExchange
- queue:
- name: DataQueue
- routing:
- key: airdata.ingested
-
diff --git a/data-ingest/src/main/java/com/artgeektech/iotmicroservices/Constants.java b/data-ingest/src/main/java/com/artgeektech/iotmicroservices/Constants.java
new file mode 100644
index 0000000..891aa70
--- /dev/null
+++ b/data-ingest/src/main/java/com/artgeektech/iotmicroservices/Constants.java
@@ -0,0 +1,13 @@
+package com.artgeektech.iotmicroservices;
+
+/**
+ * Created by guang on 5:49 AM 8/19/18.
+ */
+public class Constants {
+
+ public static final String EXCHANGE_NAME = "AirDataExchange";
+
+ public static final String QUEUE_NAME = "AirDataQueue";
+
+ public static final String ROUTING_KEY = "airdata.ingested";
+}
diff --git a/data-ingest/src/main/java/com/artgeektech/iotmicroservices/DataIngestApplication.java b/data-ingest/src/main/java/com/artgeektech/iotmicroservices/DataIngestApplication.java
index cffa4c1..2185ca9 100644
--- a/data-ingest/src/main/java/com/artgeektech/iotmicroservices/DataIngestApplication.java
+++ b/data-ingest/src/main/java/com/artgeektech/iotmicroservices/DataIngestApplication.java
@@ -1,14 +1,23 @@
package com.artgeektech.iotmicroservices;
+import org.springframework.amqp.core.Exchange;
+import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.annotation.Bean;
@SpringBootApplication
@EnableDiscoveryClient
@EnableRabbit
public class DataIngestApplication {
+
+ @Bean
+ public Exchange airDataExchange() {
+ return new TopicExchange(Constants.EXCHANGE_NAME);
+ }
+
public static void main(String[] args) {
SpringApplication.run(DataIngestApplication.class, args);
}
diff --git a/data-ingest/src/main/java/com/artgeektech/iotmicroservices/configuration/DataIngestConfiguration.java b/data-ingest/src/main/java/com/artgeektech/iotmicroservices/configuration/DataIngestConfiguration.java
deleted file mode 100644
index 046c75a..0000000
--- a/data-ingest/src/main/java/com/artgeektech/iotmicroservices/configuration/DataIngestConfiguration.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.artgeektech.iotmicroservices.configuration;
-
-import org.springframework.amqp.core.Exchange;
-import org.springframework.amqp.core.TopicExchange;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * Created by guang on 3:43 AM 8/18/18.
- */
-
-@Configuration
-public class DataIngestConfiguration {
- @Bean
- public Exchange dataExchange() {
- return new TopicExchange("DataExchange");
- }
-}
diff --git a/data-ingest/src/main/java/com/artgeektech/iotmicroservices/controller/DataIngestController.java b/data-ingest/src/main/java/com/artgeektech/iotmicroservices/controller/DataIngestController.java
index fa24fd2..6f17632 100644
--- a/data-ingest/src/main/java/com/artgeektech/iotmicroservices/controller/DataIngestController.java
+++ b/data-ingest/src/main/java/com/artgeektech/iotmicroservices/controller/DataIngestController.java
@@ -1,5 +1,6 @@
package com.artgeektech.iotmicroservices.controller;
+import com.artgeektech.iotmicroservices.Constants;
import com.artgeektech.iotmicroservices.model.AirData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -20,7 +21,6 @@
public class DataIngestController {
private static final Logger logger = LoggerFactory.getLogger(DataIngestController.class);
- private static final String routingKey = "airdata.ingested";
@Autowired
private RabbitTemplate rabbitTemplate;
@@ -31,8 +31,8 @@ public class DataIngestController {
@PostMapping("/ingest")
public AirData ingest(@Valid @RequestBody AirData airData) {
preprocess(airData);
- rabbitTemplate.convertAndSend(exchange.getName(), routingKey, airData.toString());
- logger.info(airData.toString());
+ rabbitTemplate.convertAndSend(exchange.getName(), Constants.ROUTING_KEY, airData);
+ logger.info("ingested data: " + airData.toString());
return airData;
}
diff --git a/data-ingest/src/main/resources/application.yml b/data-ingest/src/main/resources/application.yml
index b3c2707..a3cd410 100644
--- a/data-ingest/src/main/resources/application.yml
+++ b/data-ingest/src/main/resources/application.yml
@@ -16,4 +16,3 @@ eureka:
client:
serviceUrl:
defaultZone: http://service-registry:8761/eureka/
-
diff --git a/data-ingest/target/classes/application.yml b/data-ingest/target/classes/application.yml
index b3c2707..a3cd410 100644
--- a/data-ingest/target/classes/application.yml
+++ b/data-ingest/target/classes/application.yml
@@ -16,4 +16,3 @@ eureka:
client:
serviceUrl:
defaultZone: http://service-registry:8761/eureka/
-
diff --git a/data-simulator/src/main/java/com/artgeektech/iotmicroservices/DataSimulatorApplication.java b/data-simulator/src/main/java/com/artgeektech/iotmicroservices/DataSimulatorApplication.java
index e0e8b46..eca825e 100644
--- a/data-simulator/src/main/java/com/artgeektech/iotmicroservices/DataSimulatorApplication.java
+++ b/data-simulator/src/main/java/com/artgeektech/iotmicroservices/DataSimulatorApplication.java
@@ -1,5 +1,6 @@
package com.artgeektech.iotmicroservices;
+import com.artgeektech.iotmicroservices.model.AirRawData;
import org.springframework.http.HttpEntity;
import org.springframework.web.client.RestTemplate;
@@ -11,8 +12,9 @@ public class DataSimulatorApplication {
private static final String resourceUrl = "http://data-ingest:9001/iot/airdata/ingest";
private static final RestTemplate restTemplate = new RestTemplate();
+ private static final Random random = new Random();
private static double minVal = 10;
- private static double maxVal = 25;
+ private static double maxVal = 30;
private static Timer timer = new Timer();
private static int interval = 1000;
@@ -20,14 +22,19 @@ public static void main(String[] args) {
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
- AirData payload = new AirData(genRandomDouble(), genRandomDouble(), genRandomDouble(), genRandomDouble());
- HttpEntity request = new HttpEntity<>(payload);
- restTemplate.postForObject(resourceUrl, request, AirData.class);
+ AirRawData payload = new AirRawData(genRandom(), genRandom(), genRandom(), genRandom());
+ HttpEntity request = new HttpEntity<>(payload);
+ restTemplate.postForObject(resourceUrl, request, AirRawData.class);
}
}, 0, interval);
}
- private static double genRandomDouble() {
- return minVal + new Random().nextDouble() * (maxVal - minVal);
+ private static double genRandom() {
+ int randInt = random.nextInt(5);
+ if (randInt == 0) {
+ return 100;
+ } else {
+ return minVal + random.nextDouble() * (maxVal - minVal);
+ }
}
}
diff --git a/data-simulator/src/main/java/com/artgeektech/iotmicroservices/AirData.java b/data-simulator/src/main/java/com/artgeektech/iotmicroservices/model/AirRawData.java
similarity index 65%
rename from data-simulator/src/main/java/com/artgeektech/iotmicroservices/AirData.java
rename to data-simulator/src/main/java/com/artgeektech/iotmicroservices/model/AirRawData.java
index 053f28d..71f36f3 100644
--- a/data-simulator/src/main/java/com/artgeektech/iotmicroservices/AirData.java
+++ b/data-simulator/src/main/java/com/artgeektech/iotmicroservices/model/AirRawData.java
@@ -1,13 +1,15 @@
-package com.artgeektech.iotmicroservices;
+package com.artgeektech.iotmicroservices.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
+import java.io.Serializable;
+
@Data
@AllArgsConstructor
@NoArgsConstructor
-public class AirData {
+public class AirRawData implements Serializable {
private double temperature;
private double humidity;
private double pm2p5;
diff --git a/docker-compose.yml b/docker-compose.yml
deleted file mode 100644
index 9dbda24..0000000
--- a/docker-compose.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-rabbitmq:
- image: rabbitmq:management
- ports:
- - "5672:5672"
- - "15672:15672"
\ No newline at end of file
diff --git a/docker-mongodb/data/db/WiredTiger b/docker-mongodb/data/db/WiredTiger
new file mode 100644
index 0000000..d59e090
--- /dev/null
+++ b/docker-mongodb/data/db/WiredTiger
@@ -0,0 +1,2 @@
+WiredTiger
+WiredTiger 3.1.0: (April 23, 2018)
diff --git a/docker-mongodb/data/db/WiredTiger.lock b/docker-mongodb/data/db/WiredTiger.lock
new file mode 100644
index 0000000..3d84206
--- /dev/null
+++ b/docker-mongodb/data/db/WiredTiger.lock
@@ -0,0 +1 @@
+WiredTiger lock file
diff --git a/docker-mongodb/data/db/WiredTiger.turtle b/docker-mongodb/data/db/WiredTiger.turtle
new file mode 100644
index 0000000..2f21de6
--- /dev/null
+++ b/docker-mongodb/data/db/WiredTiger.turtle
@@ -0,0 +1,6 @@
+WiredTiger version string
+WiredTiger 3.1.0: (April 23, 2018)
+WiredTiger version
+major=3,minor=1,patch=0
+file:WiredTiger.wt
+access_pattern_hint=none,allocation_size=4KB,app_metadata=,assert=(commit_timestamp=none,read_timestamp=none),block_allocation=best,block_compressor=,cache_resident=false,checkpoint=(WiredTigerCheckpoint.26=(addr="018981e404155bf88a81e44460bf888b81e489110c40808080e3010fc0e23fc0",order=26,time=1534787834,size=28672,write_gen=46)),checkpoint_lsn=(4,66816),checksum=uncompressed,collator=,columns=,dictionary=0,encryption=(keyid=,name=),format=btree,huffman_key=,huffman_value=,id=0,ignore_in_memory_cache_size=false,internal_item_max=0,internal_key_max=0,internal_key_truncate=true,internal_page_max=4KB,key_format=S,key_gap=10,leaf_item_max=0,leaf_key_max=0,leaf_page_max=32KB,leaf_value_max=0,log=(enabled=true),memory_page_max=5MB,os_cache_dirty_max=0,os_cache_max=0,prefix_compression=false,prefix_compression_min=4,split_deepen_min_child=0,split_deepen_per_child=0,split_pct=90,value_format=S,version=(major=1,minor=1)
diff --git a/docker-mongodb/data/db/WiredTiger.wt b/docker-mongodb/data/db/WiredTiger.wt
new file mode 100644
index 0000000..9e02179
Binary files /dev/null and b/docker-mongodb/data/db/WiredTiger.wt differ
diff --git a/docker-mongodb/data/db/WiredTigerLAS.wt b/docker-mongodb/data/db/WiredTigerLAS.wt
new file mode 100644
index 0000000..3f019cb
Binary files /dev/null and b/docker-mongodb/data/db/WiredTigerLAS.wt differ
diff --git a/docker-mongodb/data/db/_mdb_catalog.wt b/docker-mongodb/data/db/_mdb_catalog.wt
new file mode 100644
index 0000000..b2600c4
Binary files /dev/null and b/docker-mongodb/data/db/_mdb_catalog.wt differ
diff --git a/docker-mongodb/data/db/collection-0--8088163348535167796.wt b/docker-mongodb/data/db/collection-0--8088163348535167796.wt
new file mode 100644
index 0000000..3f019cb
Binary files /dev/null and b/docker-mongodb/data/db/collection-0--8088163348535167796.wt differ
diff --git a/docker-mongodb/data/db/collection-0--984580125546635896.wt b/docker-mongodb/data/db/collection-0--984580125546635896.wt
new file mode 100644
index 0000000..c6a36fe
Binary files /dev/null and b/docker-mongodb/data/db/collection-0--984580125546635896.wt differ
diff --git a/docker-mongodb/data/db/collection-2--8088163348535167796.wt b/docker-mongodb/data/db/collection-2--8088163348535167796.wt
new file mode 100644
index 0000000..3f019cb
Binary files /dev/null and b/docker-mongodb/data/db/collection-2--8088163348535167796.wt differ
diff --git a/docker-mongodb/data/db/collection-2--984580125546635896.wt b/docker-mongodb/data/db/collection-2--984580125546635896.wt
new file mode 100644
index 0000000..2c68426
Binary files /dev/null and b/docker-mongodb/data/db/collection-2--984580125546635896.wt differ
diff --git a/docker-mongodb/data/db/collection-4--8088163348535167796.wt b/docker-mongodb/data/db/collection-4--8088163348535167796.wt
new file mode 100644
index 0000000..9385079
Binary files /dev/null and b/docker-mongodb/data/db/collection-4--8088163348535167796.wt differ
diff --git a/docker-mongodb/data/db/collection-4--984580125546635896.wt b/docker-mongodb/data/db/collection-4--984580125546635896.wt
new file mode 100644
index 0000000..222a261
Binary files /dev/null and b/docker-mongodb/data/db/collection-4--984580125546635896.wt differ
diff --git a/docker-mongodb/data/db/diagnostic.data/metrics.2018-08-19T13-33-01Z-00000 b/docker-mongodb/data/db/diagnostic.data/metrics.2018-08-19T13-33-01Z-00000
new file mode 100644
index 0000000..b5f9232
Binary files /dev/null and b/docker-mongodb/data/db/diagnostic.data/metrics.2018-08-19T13-33-01Z-00000 differ
diff --git a/docker-mongodb/data/db/diagnostic.data/metrics.2018-08-19T14-25-15Z-00000 b/docker-mongodb/data/db/diagnostic.data/metrics.2018-08-19T14-25-15Z-00000
new file mode 100644
index 0000000..98db482
Binary files /dev/null and b/docker-mongodb/data/db/diagnostic.data/metrics.2018-08-19T14-25-15Z-00000 differ
diff --git a/docker-mongodb/data/db/diagnostic.data/metrics.2018-08-19T14-25-42Z-00000 b/docker-mongodb/data/db/diagnostic.data/metrics.2018-08-19T14-25-42Z-00000
new file mode 100644
index 0000000..019baf8
Binary files /dev/null and b/docker-mongodb/data/db/diagnostic.data/metrics.2018-08-19T14-25-42Z-00000 differ
diff --git a/docker-mongodb/data/db/diagnostic.data/metrics.2018-08-19T17-41-08Z-00000 b/docker-mongodb/data/db/diagnostic.data/metrics.2018-08-19T17-41-08Z-00000
new file mode 100644
index 0000000..4d66516
Binary files /dev/null and b/docker-mongodb/data/db/diagnostic.data/metrics.2018-08-19T17-41-08Z-00000 differ
diff --git a/docker-mongodb/data/db/diagnostic.data/metrics.interim b/docker-mongodb/data/db/diagnostic.data/metrics.interim
new file mode 100644
index 0000000..4b2b09b
Binary files /dev/null and b/docker-mongodb/data/db/diagnostic.data/metrics.interim differ
diff --git a/docker-mongodb/data/db/index-1--8088163348535167796.wt b/docker-mongodb/data/db/index-1--8088163348535167796.wt
new file mode 100644
index 0000000..3f019cb
Binary files /dev/null and b/docker-mongodb/data/db/index-1--8088163348535167796.wt differ
diff --git a/docker-mongodb/data/db/index-1--984580125546635896.wt b/docker-mongodb/data/db/index-1--984580125546635896.wt
new file mode 100644
index 0000000..e5f2abf
Binary files /dev/null and b/docker-mongodb/data/db/index-1--984580125546635896.wt differ
diff --git a/docker-mongodb/data/db/index-3--8088163348535167796.wt b/docker-mongodb/data/db/index-3--8088163348535167796.wt
new file mode 100644
index 0000000..3f019cb
Binary files /dev/null and b/docker-mongodb/data/db/index-3--8088163348535167796.wt differ
diff --git a/docker-mongodb/data/db/index-3--984580125546635896.wt b/docker-mongodb/data/db/index-3--984580125546635896.wt
new file mode 100644
index 0000000..83552a4
Binary files /dev/null and b/docker-mongodb/data/db/index-3--984580125546635896.wt differ
diff --git a/docker-mongodb/data/db/index-5--8088163348535167796.wt b/docker-mongodb/data/db/index-5--8088163348535167796.wt
new file mode 100644
index 0000000..6acb4a7
Binary files /dev/null and b/docker-mongodb/data/db/index-5--8088163348535167796.wt differ
diff --git a/docker-mongodb/data/db/index-5--984580125546635896.wt b/docker-mongodb/data/db/index-5--984580125546635896.wt
new file mode 100644
index 0000000..f87aeb7
Binary files /dev/null and b/docker-mongodb/data/db/index-5--984580125546635896.wt differ
diff --git a/docker-mongodb/data/db/index-6--8088163348535167796.wt b/docker-mongodb/data/db/index-6--8088163348535167796.wt
new file mode 100644
index 0000000..d4bf0db
Binary files /dev/null and b/docker-mongodb/data/db/index-6--8088163348535167796.wt differ
diff --git a/docker-mongodb/data/db/index-6--984580125546635896.wt b/docker-mongodb/data/db/index-6--984580125546635896.wt
new file mode 100644
index 0000000..3530689
Binary files /dev/null and b/docker-mongodb/data/db/index-6--984580125546635896.wt differ
diff --git a/docker-mongodb/data/db/journal/WiredTigerLog.0000000004 b/docker-mongodb/data/db/journal/WiredTigerLog.0000000004
new file mode 100644
index 0000000..4614b2e
Binary files /dev/null and b/docker-mongodb/data/db/journal/WiredTigerLog.0000000004 differ
diff --git a/docker-mongodb/data/db/journal/WiredTigerPreplog.0000000001 b/docker-mongodb/data/db/journal/WiredTigerPreplog.0000000001
new file mode 100644
index 0000000..af27d83
Binary files /dev/null and b/docker-mongodb/data/db/journal/WiredTigerPreplog.0000000001 differ
diff --git a/docker-mongodb/data/db/journal/WiredTigerPreplog.0000000002 b/docker-mongodb/data/db/journal/WiredTigerPreplog.0000000002
new file mode 100644
index 0000000..af27d83
Binary files /dev/null and b/docker-mongodb/data/db/journal/WiredTigerPreplog.0000000002 differ
diff --git a/docker-mongodb/data/db/mongod.lock b/docker-mongodb/data/db/mongod.lock
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/docker-mongodb/data/db/mongod.lock
@@ -0,0 +1 @@
+1
diff --git a/docker-mongodb/data/db/sizeStorer.wt b/docker-mongodb/data/db/sizeStorer.wt
new file mode 100644
index 0000000..5e8b70c
Binary files /dev/null and b/docker-mongodb/data/db/sizeStorer.wt differ
diff --git a/docker-mongodb/data/db/storage.bson b/docker-mongodb/data/db/storage.bson
new file mode 100644
index 0000000..276b694
Binary files /dev/null and b/docker-mongodb/data/db/storage.bson differ
diff --git a/docker-mongodb/docker-compose.yml b/docker-mongodb/docker-compose.yml
new file mode 100644
index 0000000..c2aa936
--- /dev/null
+++ b/docker-mongodb/docker-compose.yml
@@ -0,0 +1,15 @@
+mongodb:
+ image: mongo:latest
+ container_name: "mongodb"
+ environment:
+ - MONGO_DATA_DIR=/data/db
+ - MONGO_LOG_DIR=/dev/null
+ - AUTH=yes
+ - MONGODB_ADMIN_USER=root
+ - MONGODB_ADMIN_PASS=password
+ - MONGODB_APPLICATION_DATABASE=airdata-db
+ volumes:
+ - ./data/db:/data/db
+ ports:
+ - 27018:27017
+ command: mongod --smallfiles --logpath=/dev/null # --quiet
\ No newline at end of file
diff --git a/docker-rabbitmq/docker-compose.yml b/docker-rabbitmq/docker-compose.yml
new file mode 100644
index 0000000..7db4553
--- /dev/null
+++ b/docker-rabbitmq/docker-compose.yml
@@ -0,0 +1,6 @@
+rabbitmq:
+ image: rabbitmq:management
+ container_name: "rabbitmq"
+ ports:
+ - 5672:5672
+ - 15672:15672
\ No newline at end of file
diff --git a/etc-hosts-need-modify.txt b/etc-hosts-need-modify.txt
deleted file mode 100644
index 1a13293..0000000
--- a/etc-hosts-need-modify.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-# IoT Microservices Local Hosts
-127.0.0.1 serviceregistry1 serviceregistry2 serviceregistry3 serviceregistry service-registry
\ No newline at end of file
diff --git a/cloudsetup.txt b/setup.txt
similarity index 82%
rename from cloudsetup.txt
rename to setup.txt
index 06e24fc..1d077ce 100644
--- a/cloudsetup.txt
+++ b/setup.txt
@@ -32,4 +32,8 @@ eureka:
hostname: serviceregistry3
client:
serviceUrl:
- defaultZone: http://serviceregistry1:8761/eureka/,http://serviceregistry2:8762/eureka/
\ No newline at end of file
+ defaultZone: http://serviceregistry1:8761/eureka/,http://serviceregistry2:8762/eureka/
+
+
+# IoT Microservices Local Hosts
+127.0.0.1 serviceregistry1 serviceregistry2 serviceregistry3 serviceregistry service-registry
\ No newline at end of file
diff --git a/src/main/java/com/artgeektech/iotmicroservices/Common.java b/src/main/java/com/artgeektech/iotmicroservices/Common.java
deleted file mode 100644
index 9d3525c..0000000
--- a/src/main/java/com/artgeektech/iotmicroservices/Common.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.artgeektech.iotmicroservices;
-
-/**
- * Created by guang on 2:52 AM 8/18/18.
- */
-public class Common {
-}