Browse Source

增加内置消息总线实现

xiwa 3 years ago
parent
commit
2f4a451a0a
46 changed files with 460 additions and 333 deletions
  1. 1 1
      common/pom.xml
  2. 1 1
      dao/pom.xml
  3. 6 1
      manager/pom.xml
  4. 5 6
      manager/src/main/java/cc/iotkit/manager/controller/UserInfoController.java
  5. 0 2
      manager/src/main/java/cc/iotkit/manager/controller/api/AccountController.java
  6. 1 10
      manager/src/main/java/cc/iotkit/manager/controller/api/DeviceController.java
  7. 3 22
      manager/src/main/java/cc/iotkit/manager/controller/api/HomeController.java
  8. 0 12
      manager/src/main/java/cc/iotkit/manager/controller/api/ProductController.java
  9. 1 20
      manager/src/main/java/cc/iotkit/manager/controller/api/SpaceController.java
  10. 14 24
      manager/src/main/java/cc/iotkit/manager/service/DeferredDataConsumer.java
  11. 0 50
      manager/src/main/java/cc/iotkit/manager/service/PulsarAdminService.java
  12. 37 0
      message-bus/pom.xml
  13. 7 0
      message-bus/src/main/java/cc/iotkit/mq/ConsumerHandler.java
  14. 7 0
      message-bus/src/main/java/cc/iotkit/mq/MqConsumer.java
  15. 7 0
      message-bus/src/main/java/cc/iotkit/mq/MqProducer.java
  16. 45 0
      message-bus/src/main/java/cc/iotkit/mq/vertx/BeanCodec.java
  17. 12 0
      message-bus/src/main/java/cc/iotkit/mq/vertx/VertxManager.java
  18. 56 0
      message-bus/src/main/java/cc/iotkit/mq/vertx/VertxMqConsumer.java
  19. 58 0
      message-bus/src/main/java/cc/iotkit/mq/vertx/VertxMqProducer.java
  20. 75 0
      message-bus/src/test/java/test/MsgPubConsumeTest.java
  21. 2 2
      model/pom.xml
  22. 1 1
      oauth2-server/pom.xml
  23. 7 4
      oauth2-server/src/main/java/cc/iotkit/oauth/controller/AuthClientController.java
  24. 14 19
      pom.xml
  25. 6 11
      protocol-gateway/component-server/pom.xml
  26. 19 0
      protocol-gateway/component-server/src/main/java/cc/iotkit/comps/config/ComponentConfig.java
  27. 0 17
      protocol-gateway/component-server/src/main/java/cc/iotkit/comps/config/ServerConfig.java
  28. 5 40
      protocol-gateway/component-server/src/main/java/cc/iotkit/comps/service/DeviceBehaviourService.java
  29. 20 39
      protocol-gateway/component-server/src/main/java/cc/iotkit/comps/service/DeviceMessageConsumer.java
  30. 1 1
      protocol-gateway/component/pom.xml
  31. 1 1
      protocol-gateway/converter/pom.xml
  32. 2 2
      protocol-gateway/ctwing-component/dependency-reduced-pom.xml
  33. 1 1
      protocol-gateway/ctwing-component/pom.xml
  34. 5 5
      protocol-gateway/emqx-component/dependency-reduced-pom.xml
  35. 1 1
      protocol-gateway/emqx-component/pom.xml
  36. 2 2
      protocol-gateway/http-biz-component/dependency-reduced-pom.xml
  37. 1 1
      protocol-gateway/http-biz-component/pom.xml
  38. 1 1
      protocol-gateway/mqtt-client-simulator/pom.xml
  39. 4 4
      protocol-gateway/mqtt-component/dependency-reduced-pom.xml
  40. 1 1
      protocol-gateway/mqtt-component/pom.xml
  41. 1 1
      protocol-gateway/pom.xml
  42. 6 1
      rule-engine/pom.xml
  43. 13 4
      rule-engine/src/main/java/cc/iotkit/ruleengine/config/RuleConfiguration.java
  44. 8 23
      rule-engine/src/main/java/cc/iotkit/ruleengine/handler/RuleDeviceConsumer.java
  45. 1 1
      standalone-package/pom.xml
  46. 1 1
      virtual-device/pom.xml

+ 1 - 1
common/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>iotkit-parent</artifactId>
         <groupId>cc.iotkit</groupId>
-        <version>0.2.1-SNAPSHOT</version>
+        <version>0.2.2-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
dao/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>iotkit-parent</artifactId>
         <groupId>cc.iotkit</groupId>
-        <version>0.2.1-SNAPSHOT</version>
+        <version>0.2.2-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 6 - 1
manager/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>iotkit-parent</artifactId>
         <groupId>cc.iotkit</groupId>
-        <version>0.2.1-SNAPSHOT</version>
+        <version>0.2.2-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -135,6 +135,11 @@
             <artifactId>virtual-device</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>cc.iotkit</groupId>
+            <artifactId>message-bus</artifactId>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 5 - 6
manager/src/main/java/cc/iotkit/manager/controller/UserInfoController.java

@@ -2,23 +2,24 @@ package cc.iotkit.manager.controller;
 
 import cc.iotkit.common.Constants;
 import cc.iotkit.common.exception.BizException;
-import cc.iotkit.common.utils.CodecUtil;
 import cc.iotkit.common.utils.ReflectUtil;
 import cc.iotkit.dao.AligenieDeviceRepository;
 import cc.iotkit.dao.HomeRepository;
 import cc.iotkit.dao.SpaceRepository;
 import cc.iotkit.dao.UserInfoRepository;
 import cc.iotkit.manager.service.DataOwnerService;
-import cc.iotkit.manager.service.PulsarAdminService;
+import cc.iotkit.model.UserInfo;
 import cc.iotkit.model.space.Home;
 import cc.iotkit.model.space.Space;
 import cc.iotkit.utils.AuthUtil;
-import cc.iotkit.model.UserInfo;
 import cn.dev33.satoken.annotation.SaCheckRole;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.*;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
 
 @RestController
 @RequestMapping("/user")
@@ -27,8 +28,6 @@ public class UserInfoController {
     @Autowired
     private UserInfoRepository userInfoRepository;
     @Autowired
-    private PulsarAdminService pulsarAdminService;
-    @Autowired
     private AligenieDeviceRepository aligenieDeviceRepository;
     @Autowired
     private DataOwnerService ownerService;

+ 0 - 2
manager/src/main/java/cc/iotkit/manager/controller/api/AccountController.java

@@ -7,7 +7,6 @@ import cc.iotkit.utils.AuthUtil;
 import cc.iotkit.model.AppInfo;
 import cc.iotkit.model.space.Home;
 import cc.iotkit.model.UserInfo;
-import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Example;
@@ -27,7 +26,6 @@ public class AccountController {
     @Autowired
     private AppInfoRepository appInfoRepository;
 
-    @ApiOperation("设置当前家庭")
     @PostMapping("/setHomeId")
     public void setHomeId(String homeId) {
         if (StringUtils.isBlank(homeId)) {

+ 1 - 10
manager/src/main/java/cc/iotkit/manager/controller/api/DeviceController.java

@@ -6,12 +6,9 @@ import cc.iotkit.dao.SpaceDeviceRepository;
 import cc.iotkit.manager.model.vo.AppPageNode;
 import cc.iotkit.manager.service.AppDesignService;
 import cc.iotkit.manager.service.DeviceService;
-import cc.iotkit.utils.AuthUtil;
 import cc.iotkit.model.device.DeviceInfo;
 import cc.iotkit.model.space.SpaceDevice;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
+import cc.iotkit.utils.AuthUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -40,16 +37,11 @@ public class DeviceController {
     @Autowired
     private AppDesignService appDesignService;
 
-    @ApiOperation("设备列表")
     @GetMapping("/list")
     public List<DeviceInfo> list() {
         return deviceRepository.findAll();
     }
 
-    @ApiOperation("设备详情")
-    @ApiImplicitParams({
-            @ApiImplicitParam(value = "设备ID", name = "deviceId", required = true, dataType = "String"),
-    })
     @GetMapping("/{deviceId}")
     public DeviceInfo detail(@PathVariable("deviceId") String deviceId) {
         if (StringUtils.isBlank(deviceId)) {
@@ -58,7 +50,6 @@ public class DeviceController {
         return deviceRepository.findById(deviceId).orElseThrow(() -> new RuntimeException("device not found."));
     }
 
-    @ApiOperation("获取用户所有设备ID列表")
     @GetMapping("/getAllDeviceIds")
     public List<String> getAllDeviceIds() {
         List<SpaceDevice> spaceDevices = spaceDeviceRepository.findAll(

+ 3 - 22
manager/src/main/java/cc/iotkit/manager/controller/api/HomeController.java

@@ -4,14 +4,11 @@ import cc.iotkit.dao.HomeRepository;
 import cc.iotkit.dao.SpaceRepository;
 import cc.iotkit.dao.UserActionLogRepository;
 import cc.iotkit.dao.UserInfoRepository;
-import cc.iotkit.utils.AuthUtil;
-import cc.iotkit.model.space.Home;
-import cc.iotkit.model.space.Space;
 import cc.iotkit.model.UserActionLog;
 import cc.iotkit.model.UserInfo;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
+import cc.iotkit.model.space.Home;
+import cc.iotkit.model.space.Space;
+import cc.iotkit.utils.AuthUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Example;
@@ -38,11 +35,6 @@ public class HomeController {
     public HomeController() {
     }
 
-    @ApiOperation("添加家庭")
-    @ApiImplicitParams({
-            @ApiImplicitParam(value = "名称", name = "name", required = true, dataType = "String"),
-            @ApiImplicitParam(value = "地址", name = "address", required = true, dataType = "String"),
-    })
     @PostMapping("/add")
     public void add(String name, String address) {
         if (StringUtils.isBlank(name) || StringUtils.isBlank(address)) {
@@ -57,7 +49,6 @@ public class HomeController {
         userInfoRepository.save(userInfo);
     }
 
-    @ApiOperation("我家庭列表")
     @GetMapping("/list")
     public List<Home> list() {
 //        return homeRepository.findAll();
@@ -65,7 +56,6 @@ public class HomeController {
                 .uid(AuthUtil.getUserId()).build()));
     }
 
-    @ApiOperation("添加空间")
     @PostMapping("/addSpace")
     public void addSpace(String homeId, String name) {
         if (StringUtils.isBlank(homeId) || StringUtils.isBlank(name)) {
@@ -91,11 +81,6 @@ public class HomeController {
 
     }
 
-    @ApiOperation("修改空间")
-    @ApiImplicitParams({
-            @ApiImplicitParam(value = "空间id", name = "spaceId", required = true, dataType = "String"),
-            @ApiImplicitParam(value = "空间名称", name = "name", required = true, dataType = "String"),
-    })
     @PostMapping("/updateSpace")
     public void updateSpace(String spaceId, String name) {
         if (StringUtils.isBlank(name) || StringUtils.isBlank(spaceId)) {
@@ -106,10 +91,6 @@ public class HomeController {
         spaceRepository.save(space);
     }
 
-    @ApiOperation("空间列表")
-    @ApiImplicitParams({
-            @ApiImplicitParam(value = "家庭id", name = "homeId", required = true, dataType = "String"),
-    })
     @PostMapping("/spaces")
     public List<Space> spaces(String homeId) {
         if (StringUtils.isBlank(homeId)) {

+ 0 - 12
manager/src/main/java/cc/iotkit/manager/controller/api/ProductController.java

@@ -4,9 +4,6 @@ import cc.iotkit.dao.ProductRepository;
 import cc.iotkit.dao.ThingModelRepository;
 import cc.iotkit.model.product.Product;
 import cc.iotkit.model.product.ThingModel;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -24,25 +21,16 @@ public class ProductController {
     @Autowired
     private ThingModelRepository thingModelRepository;
 
-    @ApiOperation("产品列表")
     @GetMapping("/list")
     public List<Product> list() {
         return productRepository.findAll();
     }
 
-    @ApiOperation("产品详情")
-    @ApiImplicitParams({
-            @ApiImplicitParam(value = "产品pk", name = "pk", required = true, dataType = "String"),
-    })
     @GetMapping("/{pk}")
     public Product detail(@PathVariable("pk") String pk) {
         return productRepository.findById(pk).orElseThrow(() -> new RuntimeException("product not found."));
     }
 
-    @ApiOperation("产品物模型")
-    @ApiImplicitParams({
-            @ApiImplicitParam(value = "产品pk", name = "pk", required = true, dataType = "String"),
-    })
     @GetMapping("/{pk}/thingModel")
     public ThingModel thingModel(@PathVariable("pk") String pk) {
         return thingModelRepository.findById(pk).orElseThrow(() -> new RuntimeException("thing model not found."));

+ 1 - 20
manager/src/main/java/cc/iotkit/manager/controller/api/SpaceController.java

@@ -3,14 +3,11 @@ package cc.iotkit.manager.controller.api;
 import cc.iotkit.dao.*;
 import cc.iotkit.manager.model.vo.SpaceDeviceVo;
 import cc.iotkit.manager.service.SpaceDeviceService;
-import cc.iotkit.utils.AuthUtil;
 import cc.iotkit.model.device.DeviceInfo;
 import cc.iotkit.model.product.Product;
 import cc.iotkit.model.space.Space;
 import cc.iotkit.model.space.SpaceDevice;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
+import cc.iotkit.utils.AuthUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Example;
@@ -45,12 +42,6 @@ public class SpaceController {
     @Autowired
     private SpaceDeviceService spaceDeviceService;
 
-    @ApiOperation("添加网关")
-    @ApiImplicitParams({
-            @ApiImplicitParam(value = "名称", name = "name", required = true, dataType = "String"),
-            @ApiImplicitParam(value = "产品productKey", name = "pk", required = true, dataType = "String"),
-            @ApiImplicitParam(value = "MAC", name = "mac", required = true, dataType = "String")
-    })
     @PostMapping("/addGateway")
     public void addGateway(String pk, String mac, String name, String spaceId) {
         if (StringUtils.isBlank(name) || StringUtils.isBlank(mac) || StringUtils.isBlank(spaceId)) {
@@ -67,12 +58,6 @@ public class SpaceController {
 //        addDevices.forEach((d -> addSpaceDevice(null, d, space)));
     }
 
-    @ApiOperation("添加设备")
-    @ApiImplicitParams({
-            @ApiImplicitParam(value = "设备ID", name = "deviceId", required = true, dataType = "String"),
-            @ApiImplicitParam(value = "名称", name = "name", required = true, dataType = "String"),
-            @ApiImplicitParam(value = "空间Id", name = "spaceId", required = true, dataType = "String"),
-    })
     @PostMapping("/add")
     public void add(String deviceId, String name, String spaceId) {
         if (StringUtils.isBlank(deviceId) || StringUtils.isBlank(name) || StringUtils.isBlank(spaceId)) {
@@ -85,7 +70,6 @@ public class SpaceController {
         addSpaceDevice(name, device, space);
     }
 
-    @ApiOperation("设备发现")
     @PostMapping("/scan")
     public List<SpaceDeviceVo> scan() {
         //找到网关产品id
@@ -119,7 +103,6 @@ public class SpaceController {
                 .collect(Collectors.toList());
     }
 
-    @ApiOperation("空间设备列表")
     @GetMapping("/devices")
     public List<SpaceDeviceVo> devices(String homeId, String spaceId) {
         SpaceDevice device = new SpaceDevice();
@@ -138,7 +121,6 @@ public class SpaceController {
         return spaceDeviceVos;
     }
 
-    @ApiOperation("获取空间设备信息")
     @GetMapping("/getSpaceDevice")
     public SpaceDeviceVo getSpaceDevice(String id) {
         SpaceDevice device = spaceDeviceRepository.findById(id)
@@ -149,7 +131,6 @@ public class SpaceController {
                "");
     }
 
-    @ApiOperation("使用mac获取设备信息")
     @GetMapping("/getDeviceByMac")
     public SpaceDeviceVo getDeviceByMac(String mac) {
         DeviceInfo device = deviceRepository.findOne(Example.of(DeviceInfo.builder().deviceName(mac).build()))

+ 14 - 24
manager/src/main/java/cc/iotkit/manager/service/DeferredDataConsumer.java

@@ -2,14 +2,14 @@ package cc.iotkit.manager.service;
 
 import cc.iotkit.common.Constants;
 import cc.iotkit.common.utils.JsonUtil;
-import cc.iotkit.comps.config.ServerConfig;
 import cc.iotkit.model.device.DeviceInfo;
 import cc.iotkit.model.device.message.ThingModelMessage;
+import cc.iotkit.mq.ConsumerHandler;
+import cc.iotkit.mq.MqConsumer;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.pulsar.client.api.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.web.context.request.async.DeferredResult;
@@ -18,29 +18,23 @@ import javax.annotation.PostConstruct;
 import java.util.*;
 import java.util.concurrent.*;
 
+/**
+ * 长连接推送消息消费
+ */
 @Slf4j
 @Component
-public class DeferredDataConsumer implements MessageListener<ThingModelMessage>, Runnable {
+public class DeferredDataConsumer implements ConsumerHandler<ThingModelMessage>, Runnable {
 
     private final Map<String, Set<String>> topicConsumers = new ConcurrentHashMap<>();
     private final Map<String, DeferredResultInfo> consumerDeferred = new ConcurrentHashMap<>();
     private final DelayQueue<DelayedPush> delayedPushes = new DelayQueue<>();
 
     @Autowired
-    private ServerConfig serverConfig;
+    private MqConsumer<ThingModelMessage> thingModelMessageConsumer;
 
     @PostConstruct
-    public void init() throws PulsarClientException {
-        PulsarClient client = PulsarClient.builder()
-                .serviceUrl(this.serverConfig.getPulsarBrokerUrl())
-                .build();
-
-        client.newConsumer(Schema.JSON(ThingModelMessage.class))
-                .topic("persistent://iotkit/default/" + Constants.THING_MODEL_MESSAGE_TOPIC)
-                .subscriptionName("device-info-push")
-                .consumerName("device-info-push-consumer")
-                .messageListener(this).subscribe();
-
+    public void init() {
+        thingModelMessageConsumer.consume(Constants.THING_MODEL_MESSAGE_TOPIC,this);
         Executors.newCachedThreadPool().submit(this);
     }
 
@@ -91,21 +85,17 @@ public class DeferredDataConsumer implements MessageListener<ThingModelMessage>,
     }
 
     @Override
-    public void received(Consumer<ThingModelMessage> consumer, Message<ThingModelMessage> msg) {
-        ThingModelMessage thingModelMessage = msg.getValue();
-        String type = thingModelMessage.getType();
-        String identifier = thingModelMessage.getIdentifier();
+    public void handler(ThingModelMessage msg) {
+        String type = msg.getType();
+        String identifier = msg.getIdentifier();
         //属性上报和上下线消息
         if ((ThingModelMessage.TYPE_PROPERTY.equals(type) && "report".equals(identifier)) ||
                 ThingModelMessage.TYPE_STATE.equals(type)) {
-            publish(Constants.HTTP_CONSUMER_DEVICE_INFO_TOPIC + thingModelMessage.getDeviceId(),
-                    thingModelMessage);
+            publish(Constants.HTTP_CONSUMER_DEVICE_INFO_TOPIC + msg.getDeviceId(),
+                    msg);
         }
     }
 
-    @Override
-    public void reachedEndOfTopic(Consumer<ThingModelMessage> consumer) {
-    }
 
     @Override
     public void run() {

+ 0 - 50
manager/src/main/java/cc/iotkit/manager/service/PulsarAdminService.java

@@ -1,50 +0,0 @@
-package cc.iotkit.manager.service;
-
-import com.google.common.collect.Sets;
-import org.apache.pulsar.client.admin.PulsarAdmin;
-import org.apache.pulsar.client.admin.PulsarAdminException;
-import org.apache.pulsar.client.api.PulsarClientException;
-import org.apache.pulsar.common.policies.data.TenantInfo;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-import java.util.HashSet;
-
-@Service
-public class PulsarAdminService {
-
-    @Value("${pulsar.service}")
-    private String pulsarServiceUrl;
-
-    private PulsarAdmin pulsarAdmin;
-
-    private PulsarAdmin getPulsarAdmin() throws PulsarClientException {
-        if (pulsarAdmin == null) {
-            pulsarAdmin = PulsarAdmin.builder()
-                    .serviceHttpUrl(pulsarServiceUrl)
-                    .build();
-        }
-        return pulsarAdmin;
-    }
-
-    public boolean tenantExists(String uid) throws PulsarAdminException, PulsarClientException {
-        PulsarAdmin pulsarAdmin = getPulsarAdmin();
-        return pulsarAdmin.tenants().getTenants().contains(uid);
-    }
-
-    public void createTenant(String uid) throws PulsarClientException, PulsarAdminException {
-        PulsarAdmin pulsarAdmin = getPulsarAdmin();
-        pulsarAdmin.tenants().createTenant(uid, TenantInfo.builder()
-                .adminRoles(new HashSet<>())
-                .allowedClusters(Sets.newHashSet("standalone"))
-                .build());
-
-        pulsarAdmin.namespaces().createNamespace(uid + "/default");
-    }
-
-    public void deleteTenant(String uid) throws PulsarClientException, PulsarAdminException {
-        PulsarAdmin pulsarAdmin = getPulsarAdmin();
-        pulsarAdmin.tenants().deleteTenant(uid);
-    }
-
-}

+ 37 - 0
message-bus/pom.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>iotkit-parent</artifactId>
+        <groupId>cc.iotkit</groupId>
+        <version>0.2.2-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>message-bus</artifactId>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.vertx</groupId>
+            <artifactId>vertx-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cc.iotkit</groupId>
+            <artifactId>common</artifactId>
+        </dependency>
+
+    </dependencies>
+
+</project>

+ 7 - 0
message-bus/src/main/java/cc/iotkit/mq/ConsumerHandler.java

@@ -0,0 +1,7 @@
+package cc.iotkit.mq;
+
+public interface ConsumerHandler<T> {
+
+    void handler(T msg);
+
+}

+ 7 - 0
message-bus/src/main/java/cc/iotkit/mq/MqConsumer.java

@@ -0,0 +1,7 @@
+package cc.iotkit.mq;
+
+public interface MqConsumer<T> {
+
+    void consume(String topic, ConsumerHandler<T> handler);
+
+}

+ 7 - 0
message-bus/src/main/java/cc/iotkit/mq/MqProducer.java

@@ -0,0 +1,7 @@
+package cc.iotkit.mq;
+
+public interface MqProducer<T> {
+
+    void publish(String topic, T msg);
+
+}

+ 45 - 0
message-bus/src/main/java/cc/iotkit/mq/vertx/BeanCodec.java

@@ -0,0 +1,45 @@
+package cc.iotkit.mq.vertx;
+
+import cc.iotkit.common.utils.JsonUtil;
+import io.vertx.core.buffer.Buffer;
+import io.vertx.core.eventbus.MessageCodec;
+import io.vertx.core.json.Json;
+
+public class BeanCodec<T> implements MessageCodec<T, T> {
+
+    private final Class<T> beanType;
+
+    public BeanCodec(Class<T> cls) {
+        beanType = cls;
+    }
+
+    @Override
+    public void encodeToWire(Buffer buffer, T o) {
+        String json = Json.encode(o);
+        Buffer encoded = Buffer.buffer(json);
+        buffer.appendInt(encoded.length());
+        buffer.appendBuffer(encoded);
+    }
+
+    @Override
+    public T decodeFromWire(int pos, Buffer buffer) {
+        int length = buffer.getInt(pos);
+        pos += 4;
+        return Json.decodeValue(buffer.slice(pos, pos + length), beanType);
+    }
+
+    @Override
+    public T transform(T o) {
+        return Json.decodeValue(JsonUtil.toJsonString(o), beanType);
+    }
+
+    @Override
+    public String name() {
+        return "beanCodec";
+    }
+
+    @Override
+    public byte systemCodecID() {
+        return -1;
+    }
+}

+ 12 - 0
message-bus/src/main/java/cc/iotkit/mq/vertx/VertxManager.java

@@ -0,0 +1,12 @@
+package cc.iotkit.mq.vertx;
+
+import io.vertx.core.Vertx;
+
+public class VertxManager {
+
+    private static final Vertx INSTANCE = Vertx.vertx();
+
+    public static Vertx getVertx() {
+        return INSTANCE;
+    }
+}

+ 56 - 0
message-bus/src/main/java/cc/iotkit/mq/vertx/VertxMqConsumer.java

@@ -0,0 +1,56 @@
+package cc.iotkit.mq.vertx;
+
+import cc.iotkit.mq.ConsumerHandler;
+import cc.iotkit.mq.MqConsumer;
+import io.vertx.core.AbstractVerticle;
+import io.vertx.core.Handler;
+import io.vertx.core.eventbus.EventBus;
+import io.vertx.core.eventbus.Message;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.concurrent.CountDownLatch;
+
+@Slf4j
+public class VertxMqConsumer<T> implements MqConsumer<T> {
+
+    private final MqConsumerVerticle<T> consumerVerticle;
+
+    private final CountDownLatch countDownLatch = new CountDownLatch(1);
+
+    @SneakyThrows
+    public VertxMqConsumer(Class<T> cls) {
+        consumerVerticle = new MqConsumerVerticle<>(cls);
+        VertxManager.getVertx().deployVerticle(consumerVerticle, stringAsyncResult -> {
+            countDownLatch.countDown();
+        });
+        //等待初始化穿完成
+        countDownLatch.await();
+    }
+
+    @Override
+    public void consume(String topic, ConsumerHandler<T> handler) {
+        consumerVerticle.consume(topic, handler);
+    }
+
+    public static class MqConsumerVerticle<T> extends AbstractVerticle {
+
+        private final Class<T> cls;
+        private EventBus eventBus;
+
+        public MqConsumerVerticle(Class<T> cls) {
+            this.cls = cls;
+        }
+
+        @Override
+        public void start() {
+            eventBus = vertx.eventBus();
+            eventBus.registerCodec(new BeanCodec<>(cls));
+        }
+
+        public void consume(String topic, ConsumerHandler<T> handler) {
+            eventBus.consumer(topic, (Handler<Message<T>>) msg -> handler.handler(msg.body()));
+        }
+    }
+
+}

+ 58 - 0
message-bus/src/main/java/cc/iotkit/mq/vertx/VertxMqProducer.java

@@ -0,0 +1,58 @@
+package cc.iotkit.mq.vertx;
+
+import cc.iotkit.mq.MqProducer;
+import io.vertx.core.AbstractVerticle;
+import io.vertx.core.AsyncResult;
+import io.vertx.core.Handler;
+import io.vertx.core.eventbus.DeliveryOptions;
+import io.vertx.core.eventbus.EventBus;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.concurrent.CountDownLatch;
+
+@Slf4j
+public class VertxMqProducer<T> implements MqProducer<T> {
+
+    private final MqProducerVerticle<T> producerVerticle;
+
+    private final CountDownLatch countDownLatch = new CountDownLatch(1);
+
+    @SneakyThrows
+    public VertxMqProducer(Class<T> cls) {
+        producerVerticle = new MqProducerVerticle<>(cls);
+        VertxManager.getVertx().deployVerticle(producerVerticle, new Handler<AsyncResult<String>>() {
+            @Override
+            public void handle(AsyncResult<String> stringAsyncResult) {
+                countDownLatch.countDown();
+            }
+        });
+        //等待初始化完成
+        countDownLatch.await();
+    }
+
+    @Override
+    public void publish(String topic, T msg) {
+        producerVerticle.publish(topic, msg);
+    }
+
+    public static class MqProducerVerticle<T> extends AbstractVerticle {
+
+        private final Class<T> cls;
+        private EventBus eventBus;
+
+        public MqProducerVerticle(Class<T> cls) {
+            this.cls = cls;
+        }
+
+        @Override
+        public void start() {
+            eventBus = vertx.eventBus();
+            eventBus.registerCodec(new BeanCodec<>(cls));
+        }
+
+        public void publish(String topic, T msg) {
+            eventBus.publish(topic, msg, new DeliveryOptions().setCodecName("beanCodec"));
+        }
+    }
+}

+ 75 - 0
message-bus/src/test/java/test/MsgPubConsumeTest.java

@@ -0,0 +1,75 @@
+package test;
+
+import cc.iotkit.mq.ConsumerHandler;
+import cc.iotkit.mq.vertx.VertxMqConsumer;
+import cc.iotkit.mq.vertx.VertxMqProducer;
+import io.vertx.core.AsyncResult;
+import io.vertx.core.Handler;
+import io.vertx.core.Vertx;
+
+public class MsgPubConsumeTest {
+
+
+    public static void main(String[] args) {
+
+        Vertx vertx = Vertx.vertx();
+        VertxMqConsumer.MqConsumerVerticle<Bean1> consumerVerticle = new VertxMqConsumer.MqConsumerVerticle<>(Bean1.class);
+        vertx.deployVerticle(consumerVerticle, new Handler<AsyncResult<String>>() {
+            @Override
+            public void handle(AsyncResult<String> stringAsyncResult) {
+                consumerVerticle.consume("aaa", new ConsumerHandler<Bean1>() {
+                    @Override
+                    public void handler(Bean1 msg) {
+                        System.out.println("c1:" + msg.getName());
+                    }
+                });
+                consumerVerticle.consume("aaa", new ConsumerHandler<Bean1>() {
+                    @Override
+                    public void handler(Bean1 msg) {
+                        System.out.println("c2:" + msg.getName());
+                    }
+                });
+            }
+        });
+
+
+        VertxMqProducer.MqProducerVerticle<Bean1> producerVerticle = new VertxMqProducer.MqProducerVerticle<>(Bean1.class);
+        vertx.deployVerticle(producerVerticle, new Handler<AsyncResult<String>>() {
+            @Override
+            public void handle(AsyncResult<String> stringAsyncResult) {
+                producerVerticle.publish("aaa", new Bean1("test", 1));
+                System.out.println("publish");
+            }
+        });
+    }
+
+    public static class Bean1 {
+        private String name;
+        private int age;
+
+        public Bean1() {
+        }
+
+        public Bean1(String name, int age) {
+            this.name = name;
+            this.age = age;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public int getAge() {
+            return age;
+        }
+
+        public void setAge(int age) {
+            this.age = age;
+        }
+    }
+
+}

+ 2 - 2
model/pom.xml

@@ -5,9 +5,9 @@
     <parent>
         <artifactId>iotkit-parent</artifactId>
         <groupId>cc.iotkit</groupId>
-        <version>0.2.1-SNAPSHOT</version>
+        <version>0.2.2-SNAPSHOT</version>
     </parent>
-    <version>0.2.1-SNAPSHOT</version>
+    <version>0.2.2-SNAPSHOT</version>
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>model</artifactId>

+ 1 - 1
oauth2-server/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>iotkit-parent</artifactId>
         <groupId>cc.iotkit</groupId>
-        <version>0.2.1-SNAPSHOT</version>
+        <version>0.2.2-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 7 - 4
oauth2-server/src/main/java/cc/iotkit/oauth/controller/AuthClientController.java

@@ -23,6 +23,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.servlet.view.RedirectView;
 
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -72,9 +74,9 @@ public class AuthClientController {
         String access_token = so.getString("access_token");
         UserInfoVo userVo = getUserInfo(uid);
         BeanMap beanMap = BeanMap.create(userVo);
-        Map<String,Object> data=new HashMap<>();
-        beanMap.forEach((key,value)->{
-            data.put(key.toString(),value);
+        Map<String, Object> data = new HashMap<>();
+        beanMap.forEach((key, value) -> {
+            data.put(key.toString(), value);
         });
         data.put("access_token", access_token);
 
@@ -100,12 +102,13 @@ public class AuthClientController {
      * 登录验证
      */
     @GetMapping("/checkLogin")
-    public SaResult checkLogin() {
+    public SaResult checkLogin(HttpServletResponse response) {
         try {
             String uid = StpUtil.getLoginId().toString();
             UserInfoVo userVo = getUserInfo(uid);
             return SaResult.ok().setData(userVo);
         } catch (Throwable e) {
+            response.addCookie(new Cookie("token", ""));
             return SaResult.error("no login");
         }
     }

+ 14 - 19
pom.xml

@@ -13,6 +13,7 @@
         <module>standalone-package</module>
         <module>oauth2-server</module>
         <module>virtual-device</module>
+        <module>message-bus</module>
     </modules>
     <parent>
         <groupId>org.springframework.boot</groupId>
@@ -23,7 +24,7 @@
 
     <groupId>cc.iotkit</groupId>
     <artifactId>iotkit-parent</artifactId>
-    <version>0.2.1-SNAPSHOT</version>
+    <version>0.2.2-SNAPSHOT</version>
     <name>iotkit-parent</name>
     <description>iotkit parent</description>
     <properties>
@@ -146,27 +147,15 @@
             </dependency>
 
             <dependency>
-                <groupId>joda-time</groupId>
-                <artifactId>joda-time</artifactId>
-                <version>2.10.10</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.pulsar</groupId>
-                <artifactId>pulsar-client</artifactId>
-                <version>2.9.1</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.pulsar</groupId>
-                <artifactId>pulsar-client-api</artifactId>
-                <version>2.9.1</version>
+                <groupId>org.apache.rocketmq</groupId>
+                <artifactId>rocketmq-spring-boot-starter</artifactId>
+                <version>2.0.2</version>
             </dependency>
 
             <dependency>
-                <groupId>org.apache.pulsar</groupId>
-                <artifactId>pulsar-client-original</artifactId>
-                <version>2.9.1</version>
+                <groupId>joda-time</groupId>
+                <artifactId>joda-time</artifactId>
+                <version>2.10.10</version>
             </dependency>
 
             <dependency>
@@ -289,6 +278,12 @@
                 <version>${project.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>cc.iotkit</groupId>
+                <artifactId>message-bus</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 

+ 6 - 11
protocol-gateway/component-server/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>protocol-gateway</artifactId>
         <groupId>cc.iotkit</groupId>
-        <version>0.2.1-SNAPSHOT</version>
+        <version>0.2.2-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -52,16 +52,6 @@
             <artifactId>commons-io</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>org.apache.pulsar</groupId>
-            <artifactId>pulsar-client-api</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.pulsar</groupId>
-            <artifactId>pulsar-client-original</artifactId>
-        </dependency>
-
         <dependency>
             <groupId>org.luaj</groupId>
             <artifactId>luaj-jse</artifactId>
@@ -97,6 +87,11 @@
             <artifactId>component</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>cc.iotkit</groupId>
+            <artifactId>message-bus</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 19 - 0
protocol-gateway/component-server/src/main/java/cc/iotkit/comps/config/ComponentConfig.java

@@ -1,9 +1,15 @@
 package cc.iotkit.comps.config;
 
+import cc.iotkit.model.device.message.ThingModelMessage;
+import cc.iotkit.mq.MqConsumer;
+import cc.iotkit.mq.MqProducer;
+import cc.iotkit.mq.vertx.VertxMqConsumer;
+import cc.iotkit.mq.vertx.VertxMqProducer;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import lombok.Data;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
@@ -34,4 +40,17 @@ public class ComponentConfig {
     public ObjectMapper myMapper() {
         return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
     }
+
+    @ConditionalOnMissingBean
+    @Bean
+    public MqProducer<ThingModelMessage> getThingModelMessageProducer() {
+        return new VertxMqProducer<>(ThingModelMessage.class);
+    }
+
+    @ConditionalOnMissingBean
+    @Bean
+    public MqConsumer<ThingModelMessage> getThingModelMessageConsumer() {
+        return new VertxMqConsumer<>(ThingModelMessage.class);
+    }
+
 }

+ 0 - 17
protocol-gateway/component-server/src/main/java/cc/iotkit/comps/config/ServerConfig.java

@@ -1,17 +0,0 @@
-package cc.iotkit.comps.config;
-
-import lombok.Data;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-@Data
-public class ServerConfig {
-
-    @Value("${pulsar.broker}")
-    private String pulsarBrokerUrl;
-
-    @Value("${pulsar.service}")
-    private String pulsarServiceUrl;
-
-}

+ 5 - 40
protocol-gateway/component-server/src/main/java/cc/iotkit/comps/service/DeviceBehaviourService.java

@@ -7,23 +7,17 @@ import cc.iotkit.common.utils.JsonUtil;
 import cc.iotkit.common.utils.UniqueIdUtil;
 import cc.iotkit.comp.model.DeviceState;
 import cc.iotkit.comp.model.RegisterInfo;
-import cc.iotkit.comps.config.ServerConfig;
 import cc.iotkit.dao.*;
 import cc.iotkit.model.device.DeviceInfo;
 import cc.iotkit.model.device.message.ThingModelMessage;
 import cc.iotkit.model.product.Product;
 import cc.iotkit.model.product.ProductModel;
+import cc.iotkit.mq.MqProducer;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.pulsar.client.api.Producer;
-import org.apache.pulsar.client.api.PulsarClient;
-import org.apache.pulsar.client.api.PulsarClientException;
-import org.apache.pulsar.client.api.TypedMessageBuilder;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import javax.annotation.PostConstruct;
-import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Optional;
@@ -41,31 +35,9 @@ public class DeviceBehaviourService {
     @Autowired
     private DeviceRepository deviceRepository;
     @Autowired
-    private ServerConfig serverConfig;
-    @Autowired
     private DeviceCache deviceCache;
-    //旧实现,ThingModelMessage序列化失败
-    //private Producer<ThingModelMessage> deviceMessageProducer;
-
-    private Producer<byte[]> deviceMessageProducer;
-
-    @PostConstruct
-    public void init() throws PulsarClientException {
-        //初始化pulsar客户端
-        PulsarClient client = PulsarClient.builder()
-                .serviceUrl(serverConfig.getPulsarBrokerUrl())
-                .build();
-        /**
-         旧实现,ThingModelMessage序列化失败
-         deviceMessageProducer = client.newProducer(JSONSchema.of(ThingModelMessage.class))
-         .topic("persistent://iotkit/default/" + Constants.THING_MODEL_MESSAGE_TOPIC)
-         .create();
-         */
-
-        deviceMessageProducer = client.newProducer()
-                .topic("persistent://iotkit/default/" + Constants.THING_MODEL_MESSAGE_TOPIC)
-                .create();
-    }
+    @Autowired
+    private MqProducer<ThingModelMessage> producer;
 
     public void register(RegisterInfo info) {
         try {
@@ -259,16 +231,9 @@ public class DeviceBehaviourService {
             }
             message.setDeviceId(device.getDeviceId());
 
-            // 旧实现,ThingModelMessage序列化失败
-            //deviceMessageProducer.send(message);
-
-            // 新实现,用JsonUtil.toJsonString序列化ThingModelMessage,解决 ThingModelMessage序列化失败的问题
-            TypedMessageBuilder<byte[]> builder = deviceMessageProducer.newMessage();
-            builder.value(JsonUtil.toJsonString(message).getBytes(StandardCharsets.UTF_8));
-            builder.send();
+            producer.publish(Constants.THING_MODEL_MESSAGE_TOPIC, message);
 
-
-        } catch (PulsarClientException e) {
+        } catch (Throwable e) {
             log.error("send thing model message error", e);
         }
     }

+ 20 - 39
protocol-gateway/component-server/src/main/java/cc/iotkit/comps/service/DeviceMessageConsumer.java

@@ -2,15 +2,14 @@ package cc.iotkit.comps.service;
 
 import cc.iotkit.common.Constants;
 import cc.iotkit.common.utils.JsonUtil;
-import cc.iotkit.comps.config.ServerConfig;
 import cc.iotkit.dao.*;
 import cc.iotkit.model.device.DeviceInfo;
 import cc.iotkit.model.device.message.DeviceProperty;
 import cc.iotkit.model.device.message.DeviceReport;
 import cc.iotkit.model.device.message.ThingModelMessage;
-import lombok.SneakyThrows;
+import cc.iotkit.mq.ConsumerHandler;
+import cc.iotkit.mq.MqConsumer;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.pulsar.client.api.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -21,10 +20,7 @@ import java.util.UUID;
 
 @Slf4j
 @Service
-public class DeviceMessageConsumer implements MessageListener<ThingModelMessage> {
-
-    @Autowired
-    private ServerConfig serverConfig;
+public class DeviceMessageConsumer implements ConsumerHandler<ThingModelMessage> {
     @Lazy
     @Autowired
     private ThingModelMessageRepository messageRepository;
@@ -38,37 +34,29 @@ public class DeviceMessageConsumer implements MessageListener<ThingModelMessage>
     private DeviceDao deviceDao;
     @Autowired
     private DeviceCache deviceCache;
+    @Autowired
+    private MqConsumer<ThingModelMessage> thingModelMessageConsumer;
 
     @PostConstruct
-    public void init() throws PulsarClientException {
-        PulsarClient client = PulsarClient.builder()
-                .serviceUrl(this.serverConfig.getPulsarBrokerUrl())
-                .build();
-
-        client.newConsumer(Schema.JSON(ThingModelMessage.class))
-                .topic("persistent://iotkit/default/" + Constants.THING_MODEL_MESSAGE_TOPIC)
-                .subscriptionName("thing-model-message")
-                .consumerName("thing-model-message-consumer")
-                .messageListener(this).subscribe();
+    public void init() {
+        thingModelMessageConsumer.consume(Constants.THING_MODEL_MESSAGE_TOPIC, this);
     }
 
-    @SneakyThrows
     @Override
-    public void received(Consumer<ThingModelMessage> consumer, Message<ThingModelMessage> msg) {
+    public void handler(ThingModelMessage msg) {
         try {
-            ThingModelMessage modelMessage = msg.getValue();
-            String deviceId = modelMessage.getDeviceId();
-            log.info("save message to es:{}", JsonUtil.toJsonString(modelMessage));
+            String deviceId = msg.getDeviceId();
+            log.info("save message to es:{}", JsonUtil.toJsonString(msg));
             //属性入库
-            if (ThingModelMessage.TYPE_PROPERTY.equals(modelMessage.getType())
-                    && "report".equals(modelMessage.getIdentifier())) {
+            if (ThingModelMessage.TYPE_PROPERTY.equals(msg.getType())
+                    && "report".equals(msg.getIdentifier())) {
                 log.info("update device property,deviceId:{},property:{}",
-                        deviceId, JsonUtil.toJsonString(modelMessage.getData()));
-                deviceDao.updateProperties(deviceId, (Map<String, Object>) modelMessage.getData());
+                        deviceId, JsonUtil.toJsonString(msg.getData()));
+                deviceDao.updateProperties(deviceId, (Map<String, Object>) msg.getData());
 
                 //设备属性历史数据存储
-                if (modelMessage.getData() instanceof Map) {
-                    Map map = (Map) modelMessage.getData();
+                if (msg.getData() instanceof Map) {
+                    Map map = (Map) msg.getData();
                     int index = 0;
                     for (Object key : map.keySet()) {
                         index++;
@@ -76,11 +64,11 @@ public class DeviceMessageConsumer implements MessageListener<ThingModelMessage>
                             propertyRepository.save(
                                     new DeviceProperty(
                                             //防止重复id被覆盖
-                                            modelMessage.getMid() + "_" + index,
+                                            msg.getMid() + "_" + index,
                                             deviceId,
                                             key.toString(),
                                             map.get(key),
-                                            modelMessage.getOccurred()
+                                            msg.getOccurred()
                                     )
                             );
                         } catch (Throwable e) {
@@ -93,9 +81,9 @@ public class DeviceMessageConsumer implements MessageListener<ThingModelMessage>
             try {
                 //todo 存在性能问题,量大可再拆分处理
                 //设备消息日志入库
-                messageRepository.save(modelMessage);
+                messageRepository.save(msg);
                 //设备上报日志入库
-                deviceReportRepository.save(getDeviceReport(modelMessage));
+                deviceReportRepository.save(getDeviceReport(msg));
             } catch (Throwable e) {
                 log.warn("save device message to es error", e);
             }
@@ -103,7 +91,6 @@ public class DeviceMessageConsumer implements MessageListener<ThingModelMessage>
             //不能重复消费
             log.error("device message consumer error", e);
         }
-        consumer.acknowledge(msg);
     }
 
     private DeviceReport getDeviceReport(ThingModelMessage message) {
@@ -120,10 +107,4 @@ public class DeviceMessageConsumer implements MessageListener<ThingModelMessage>
                 .time(message.getTime())
                 .build();
     }
-
-    @Override
-    public void reachedEndOfTopic(Consumer<ThingModelMessage> consumer) {
-
-    }
-
 }

+ 1 - 1
protocol-gateway/component/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>protocol-gateway</artifactId>
         <groupId>cc.iotkit</groupId>
-        <version>0.2.1-SNAPSHOT</version>
+        <version>0.2.2-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
protocol-gateway/converter/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>protocol-gateway</artifactId>
         <groupId>cc.iotkit</groupId>
-        <version>0.2.1-SNAPSHOT</version>
+        <version>0.2.2-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 2 - 2
protocol-gateway/ctwing-component/dependency-reduced-pom.xml

@@ -3,7 +3,7 @@
   <parent>
     <artifactId>protocol-gateway</artifactId>
     <groupId>cc.iotkit</groupId>
-    <version>0.2.1-SNAPSHOT</version>
+    <version>0.2.2-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>ctwing-component</artifactId>
@@ -61,7 +61,7 @@
     <dependency>
       <groupId>cc.iotkit</groupId>
       <artifactId>component</artifactId>
-      <version>0.2.1-SNAPSHOT</version>
+      <version>0.2.2-SNAPSHOT</version>
       <scope>compile</scope>
     </dependency>
     <dependency>

+ 1 - 1
protocol-gateway/ctwing-component/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>protocol-gateway</artifactId>
         <groupId>cc.iotkit</groupId>
-        <version>0.2.1-SNAPSHOT</version>
+        <version>0.2.2-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 5 - 5
protocol-gateway/emqx-component/dependency-reduced-pom.xml

@@ -3,7 +3,7 @@
   <parent>
     <artifactId>protocol-gateway</artifactId>
     <groupId>cc.iotkit</groupId>
-    <version>0.2.1-SNAPSHOT</version>
+    <version>0.2.2-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>emqx-component</artifactId>
@@ -76,19 +76,19 @@
     <dependency>
       <groupId>cc.iotkit</groupId>
       <artifactId>model</artifactId>
-      <version>0.2.1-SNAPSHOT</version>
+      <version>0.2.2-SNAPSHOT</version>
       <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>cc.iotkit</groupId>
       <artifactId>common</artifactId>
-      <version>0.2.1-SNAPSHOT</version>
+      <version>0.2.2-SNAPSHOT</version>
       <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>cc.iotkit</groupId>
       <artifactId>component</artifactId>
-      <version>0.2.1-SNAPSHOT</version>
+      <version>0.2.2-SNAPSHOT</version>
       <scope>compile</scope>
     </dependency>
     <dependency>
@@ -100,7 +100,7 @@
     <dependency>
       <groupId>cc.iotkit</groupId>
       <artifactId>dao</artifactId>
-      <version>0.2.1-SNAPSHOT</version>
+      <version>0.2.2-SNAPSHOT</version>
       <scope>compile</scope>
     </dependency>
   </dependencies>

+ 1 - 1
protocol-gateway/emqx-component/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>protocol-gateway</artifactId>
         <groupId>cc.iotkit</groupId>
-        <version>0.2.1-SNAPSHOT</version>
+        <version>0.2.2-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 2 - 2
protocol-gateway/http-biz-component/dependency-reduced-pom.xml

@@ -3,7 +3,7 @@
   <parent>
     <artifactId>protocol-gateway</artifactId>
     <groupId>cc.iotkit</groupId>
-    <version>0.2.1-SNAPSHOT</version>
+    <version>0.2.2-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>http-biz-component</artifactId>
@@ -58,7 +58,7 @@
     <dependency>
       <groupId>cc.iotkit</groupId>
       <artifactId>component</artifactId>
-      <version>0.2.1-SNAPSHOT</version>
+      <version>0.2.2-SNAPSHOT</version>
       <scope>compile</scope>
     </dependency>
   </dependencies>

+ 1 - 1
protocol-gateway/http-biz-component/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>protocol-gateway</artifactId>
         <groupId>cc.iotkit</groupId>
-        <version>0.2.1-SNAPSHOT</version>
+        <version>0.2.2-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
protocol-gateway/mqtt-client-simulator/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>protocol-gateway</artifactId>
         <groupId>cc.iotkit</groupId>
-        <version>0.2.1-SNAPSHOT</version>
+        <version>0.2.2-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <description>mqtt客户端模拟器</description>

+ 4 - 4
protocol-gateway/mqtt-component/dependency-reduced-pom.xml

@@ -3,7 +3,7 @@
   <parent>
     <artifactId>protocol-gateway</artifactId>
     <groupId>cc.iotkit</groupId>
-    <version>0.2.1-SNAPSHOT</version>
+    <version>0.2.2-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>mqtt-component</artifactId>
@@ -80,19 +80,19 @@
     <dependency>
       <groupId>cc.iotkit</groupId>
       <artifactId>common</artifactId>
-      <version>0.2.1-SNAPSHOT</version>
+      <version>0.2.2-SNAPSHOT</version>
       <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>cc.iotkit</groupId>
       <artifactId>component</artifactId>
-      <version>0.2.1-SNAPSHOT</version>
+      <version>0.2.2-SNAPSHOT</version>
       <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>cc.iotkit</groupId>
       <artifactId>dao</artifactId>
-      <version>0.2.1-SNAPSHOT</version>
+      <version>0.2.2-SNAPSHOT</version>
       <scope>compile</scope>
     </dependency>
   </dependencies>

+ 1 - 1
protocol-gateway/mqtt-component/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>protocol-gateway</artifactId>
         <groupId>cc.iotkit</groupId>
-        <version>0.2.1-SNAPSHOT</version>
+        <version>0.2.2-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
protocol-gateway/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>iotkit-parent</artifactId>
         <groupId>cc.iotkit</groupId>
-        <version>0.2.1-SNAPSHOT</version>
+        <version>0.2.2-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 6 - 1
rule-engine/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>iotkit-parent</artifactId>
         <groupId>cc.iotkit</groupId>
-        <version>0.2.1-SNAPSHOT</version>
+        <version>0.2.2-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -71,6 +71,11 @@
             <artifactId>component-server</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>cc.iotkit</groupId>
+            <artifactId>message-bus</artifactId>
+        </dependency>
+
     </dependencies>
 
     <properties>

+ 13 - 4
rule-engine/src/main/java/cc/iotkit/ruleengine/config/RuleConfiguration.java

@@ -1,9 +1,15 @@
 package cc.iotkit.ruleengine.config;
 
+import cc.iotkit.model.device.message.ThingModelMessage;
+import cc.iotkit.mq.MqConsumer;
+import cc.iotkit.mq.MqProducer;
+import cc.iotkit.mq.vertx.VertxMqConsumer;
+import cc.iotkit.mq.vertx.VertxMqProducer;
 import cc.iotkit.ruleengine.handler.RuleDeviceConsumer;
 import cc.iotkit.ruleengine.rule.RuleMessageHandler;
 import cc.iotkit.ruleengine.task.TaskManager;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
@@ -12,12 +18,15 @@ import java.util.Collections;
 @Configuration
 public class RuleConfiguration {
 
-    @Value("${pulsar.broker}")
-    public String pulsarBroker;
+    @Bean
+    public RuleDeviceConsumer getConsumer(MqConsumer<ThingModelMessage> consumer, RuleMessageHandler ruleMessageHandler) {
+        return new RuleDeviceConsumer(consumer, Collections.singletonList(ruleMessageHandler));
+    }
 
+    @ConditionalOnMissingBean
     @Bean
-    public RuleDeviceConsumer getConsumer(RuleMessageHandler ruleMessageHandler) {
-        return new RuleDeviceConsumer(pulsarBroker, Collections.singletonList(ruleMessageHandler));
+    public MqConsumer<ThingModelMessage> getThingModelMessageConsumer() {
+        return new VertxMqConsumer<>(ThingModelMessage.class);
     }
 
     @Bean

+ 8 - 23
rule-engine/src/main/java/cc/iotkit/ruleengine/handler/RuleDeviceConsumer.java

@@ -3,51 +3,36 @@ package cc.iotkit.ruleengine.handler;
 import cc.iotkit.common.Constants;
 import cc.iotkit.common.utils.JsonUtil;
 import cc.iotkit.model.device.message.ThingModelMessage;
+import cc.iotkit.mq.ConsumerHandler;
+import cc.iotkit.mq.MqConsumer;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.pulsar.client.api.*;
 
 import java.util.ArrayList;
 import java.util.List;
 
 @Slf4j
-public class RuleDeviceConsumer implements MessageListener<ThingModelMessage> {
+public class RuleDeviceConsumer implements ConsumerHandler<ThingModelMessage> {
 
     private final List<DeviceMessageHandler> handlers = new ArrayList<>();
 
     @SneakyThrows
-    public RuleDeviceConsumer(String broker, List<DeviceMessageHandler> handlers) {
+    public RuleDeviceConsumer(MqConsumer<ThingModelMessage> consumer, List<DeviceMessageHandler> handlers) {
         this.handlers.addAll(handlers);
-
-        PulsarClient client = PulsarClient.builder()
-                .serviceUrl(broker)
-                .build();
-
-        client.newConsumer(Schema.JSON(ThingModelMessage.class))
-                .topic("persistent://iotkit/default/" + Constants.THING_MODEL_MESSAGE_TOPIC)
-                .subscriptionName("rule-engine-device")
-                .consumerName("rule-engine-device-consumer")
-                .messageListener(this).subscribe();
+        consumer.consume(Constants.THING_MODEL_MESSAGE_TOPIC, this);
     }
 
     @SneakyThrows
     @Override
-    public void received(Consumer<ThingModelMessage> consumer, Message<ThingModelMessage> msg) {
-        log.info("received thing model message:{}", JsonUtil.toJsonString(msg.getValue()));
+    public void handler(ThingModelMessage msg) {
+        log.info("received thing model message:{}", JsonUtil.toJsonString(msg));
         try {
-            ThingModelMessage modelMessage = msg.getValue();
             for (DeviceMessageHandler handler : this.handlers) {
-                handler.handle(modelMessage);
+                handler.handle(msg);
             }
         } catch (Throwable e) {
             log.error("rule device message process error", e);
         }
-        consumer.acknowledge(msg);
-    }
-
-    @Override
-    public void reachedEndOfTopic(Consumer<ThingModelMessage> consumer) {
-
     }
 
 }

+ 1 - 1
standalone-package/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>iotkit-parent</artifactId>
         <groupId>cc.iotkit</groupId>
-        <version>0.2.1-SNAPSHOT</version>
+        <version>0.2.2-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
virtual-device/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>iotkit-parent</artifactId>
         <groupId>cc.iotkit</groupId>
-        <version>0.2.1-SNAPSHOT</version>
+        <version>0.2.2-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>