ThingsBoard 二次开发之源码分析 1- 基础知识
ThingsKit物联网平台
ThingsKit物联网平台可提供跨不同设备和数据源的通用PaaS服务,在整个物联网架构中起到承上启下的中介作用,联动感知层及应用层之间的所有交互——向下连接、管理物联网设备端并完成感知数据的归集与存储,向上为应用开发商与系统集成商提供应用开发的统一数据接口及共性模块工具。在实现“物联”的基础之上,感知层与应用层频繁交互过程中,产生的数据具有体量大、种类多、动态滚动的特征,物联网平台作为产业链中的核心枢纽,更是应用融合以及数据价值孵化的土壤,除提供基础设施服务支撑设备间的数据交换外,通过对平台数据的处理、分析和可视化,将数据赋能过程大幅前置,充分发挥规模效应,实现数据即生产即处理,便于数据快速应用落地,简化物联网解决方案的复杂度并降低方案成本,充当“加速层”,推进各层在应用场景的落地速度与进程。
ThingsKit物联网平台:基于ThingsBoard开发,面向中小型企业开箱即用的低代码物联网平台 :ThingsKit物联网平台
ThingsKit物联网平台演示环境 :https://docs.thingskit.com/thingskit-link/getting-started





欢迎加入ThingsBoard技术交流群

这里可复制Q群号:69998183
关注“云腾五洲”:获取二开ThingsBoard物联网平台演示

TK物联网平台:ThingsKit物联网平台
# ThingsBoard源码分析1-基础知识
## 预备知识
- JDK1.8
- 注解
- Protobuf
- Guava
### JDK1.8
- Lambda表达式
- 方法引用
方法引用的唯一用途是支持Lambda表达式的简写,调用方法的时候使用`::`, 对于一些单个参数,可以自动推断;
- Consumer
`Consumer`的作用是给定义一个参数,对其进行(消费)处理,处理的方式可以是任意操作,无返回值;
- Predicate
断言接口,根据传入的Lambda表达式返回boolean;
- Supplier
根据提供的Lambda表达式返回需要的对象;
- Function
函数式编程接口,根据提供的Lambda表达式进行相应的操作并返回结果;
### 注解
- @PostConstruct
`@postConstruct` 注解并非为spring提供, 该注解用来修饰非静态`void()`方法,该注解的执行时机为在对象加载完依赖注入后执行,即`Constructor` > `@Autowired` > `@postConstruct`;
- @EventListener
由spring提供,spring为我们提供了事件的监听与实现,内部的实现原理是**观察者设计模式**,实现了系统解耦,时间发布者不需要考虑谁在监听,发布者只关心自己消息的发布;
- ApplicationReadyEvent
应用已经就绪处理请求,将会发布该事件;([An `ApplicationReadyEvent` is sent after any application and command-line runners have been called. It indicates that the application is ready to service requests](https://docs.spring.io/spring-boot/docs/2.1.10.RELEASE/reference/html/boot-features-spring-application.html).)
-
- @Conditional及包括其子注解
spring提供,对满足条件进行注入;
- @Builder
lombok插件提供,目的是简化构造者模式的代码。Builder Pattern可轻松创建复杂对象;
###Protobuf
> [protocol buffers](https://developers.google.com/protocol-buffers) 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。相比JSON,XML占用内存小,解析速度更快。在使用过程中,首先创建xx.proto文件,通过protobuf-maven-plugin创建相应的类。
### Guava
> [Guava](https://github.com/google/guava) 是一组来自谷歌的核心Java库,其中包括新的集合类型、不可变集合、一个图库,以及用于并发、I/O、散列、缓存、原语、字符串等的实用工具。
- ListenalbeFuture
ListenalbeFuture是对JDK的future进行增强,可以监听任务的执行状况:
1. 使用MoreExecutors创建线程池
```java
ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());
```
2. 提交任务
```java
final ListenableFuture<Integer> listenableFuture = executorService.submit(new Callable<Integer>() {
public Integer call() throws Exception {
System.out.println("call execute..");
TimeUnit.SECONDS.sleep(3);
return 7;
}
});
```
3. 添加监听任务执行状态①
```java
listenableFuture.addListener(()->{
try {
System.out.println(listenableFuture.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
},executorService);
```
4. 添加监听任务执行状态②
```java
Futures.addCallback(listenableFuture, new FutureCallback<Integer>() {
@Override
public void onSuccess(@Nullable Integer integer) {
//返回future的执行结果
}
@Override
public void onFailure(Throwable throwable) {
}
}, executorService);
```
- Futures.transform
如果需要对返回值做处理,可以使用Futures.transform方法,它是同步方法,另外还有一个异步方法Futures.transformAsync:
```java
ListenableFuture<String> future = executorService.submit(() -> "hello, future");
ListenableFuture<Integer> future2 = Futures.transform(future2, String::length, executorService);
//future2返回的是’hello, future‘的长度
-
SettableFuture
SettableFuture可以认为是一种异步转同步工具,可以它在指定时间内获取ListenableFuture的计算结果:SettableFuture<Integer> settableFuture = SettableFuture.create(); ListenableFuture<Integer> future11 = executorService.submit(() -> { int sum = 5 + 6; settableFuture.set(sum); return sum; }); // get设置超时时间 System.out.println(settableFuture.get(2, TimeUnit.SECONDS));

浙公网安备 33010602011771号