
前情回顾
前文介绍了 Niagara 开发者课程中开始阶段的部分内容,包括:Niagara 总体介绍,软件架构介绍,定位符和开发环境搭建等内容,总体来说前面的课程还是比较轻松的,练习和作业都比较少,从第一天下午开始强度就慢慢上来了。
关于课堂练习的总体建议
真正的 coding 开始了,此后的所有练习都会涉及到代码的编写。下面我针对这些课堂练习做一些说明。Niagara 所有课程中的练习都是非常经典,非常有代表性的,对于初学者来说,不仅仅是作为课堂练习,它们是值得在课后反复揣摩和复习的。课堂上拿到每个练习,不要着急按照操作指导去一步步操作,如果仅仅是这样的话,那与一个5岁儿童照着说明书组装乐高玩具无异。每个人按照步骤操作都可以完成,这也是我在课堂上反复强调的。学员们总是担心赶不上进度,无法继续后面的课程和练习,这个心情能够理解,但是,开始每个练习之前还有更重要的事情要做,那就是:
明确这个练习的目的是什么
练习中涉及到的关键知识点有哪些
完成后的效果是什么
尤其是那些对 Java 不是太熟悉的朋友:千万不要纠结于某几行代码的细节,只要知道某段代码实现了什么功能即可。
这样的方式不但有利于很好地理解课堂讲解的内容和练习,更有利于通过考试。考试过程中,你需要根据考题中描述的功能要求,能否快速找到练习中相应部分的代码做参考,决定了你答题的快慢。题量挺大的,时间很重要。
那么我们以一个练习为例,来说说开发者课程中,开始练习之前要做的这些事情。它明确地写在了每个练习前面,可能是英文的缘故,也可能是时间紧的缘故,课堂上很少有学员仔细阅读这些内容。
以5.2练习的内容为例说明上述方法:
首先,练习的目的是希望将(二次)开发的异步 action,放在主线程之外去执行,以防止这个 action 耗费过多时间,影响主线程做重要的事情。实现方法是定义一个 worker 线程,然后通过 post 方法将 action 发到 worker 线程执行。
其次,关键知识点包括:主线程 Control Engine;异步 action;worker 线程,post 方法。
最后,练习的效果是:通过两种方式的对比,发现独立的 worker 线程确实有助于解放主线程。具体来说就是定义一个很耗时的 action (sleep),如果把它放到主线程,就会导致 Niagara 操作卡死。如果将其放到 worker 线程,所有的用户交互都仍然流畅,不受影响。
回到课程
4. 模块开发
Module Development
这一节主要包括:
搭建开发环境,如何导入并引用 Niagara 的 jar 包,如何导入外部 jar 包等
如何将 module 中的组件呈现在 palette 上
基于 java annotation 的代码自动生成,slot-o-matic
hello world 程序的创建和编译
常用的 Niagara 数据类型,比如,用来显示带有状态数值的 BStatusValue;绝对时间(BAbsTime),如年月日时分秒;相对时间(BRelTime),如半小时,15分钟; 类似于JSON 的键值对 BFacet 等等。
学习建议
这部分内容其实非常简单,但也是最重要的。如果课上卡在了环境搭建的地方,我建议你直接让老师帮你解决,没必要自己花过多时间。开发环境是每个程序员在开始编程前都必须要做的事情,hello world 无法运行,其他的都免谈。这一节中关于 palette 编辑其实是挺麻烦,很容易出错的,但还好有些小技巧,在课上重点听这部分内容,最好记下来,时间长了容易忘。
5. 多线程
Niagara Runtime
|
1 |
远程数据同步 (Remote Programming) 本节介绍数据在station 与 workbench 之间的同步机制。Niagara 内部的数据同步采用订阅的方式,包括长订阅和短订阅以及封装成事务的批量订阅。这样的机制保证了通讯带宽占用和数据实时性的平衡。这在 workbench 访问 station 时体现的尤为明显,workbench 只会用短订阅同步当前页面需要显示的数据,以节省带宽和处理数据的工作负荷。 |
|
2 |
公共服务(Service) 它在 Niagara Station 中是一种重要的存在,它用来为站点中组件提供某些公共服务。像其他所有组件一样,Service 也是可以灵活部署的。Niagara 新建站点中默认添加了很多服务,如下图所示。
从代码的角度看,Service 其实就是 BComponent 的子类,它会在站点启动后自动加载,Service 的加载早于普通的 component。 |
|
3 |
任务,并发,异步和多线程(Job,Concurrency,Async,Multi-thread) Control Engine 作为 Niagara 的主线程,负责处理定时,基础框架的一些异步action等关键任务,比如我之前详细介绍过的,Point 上的 set() 操作,就会在主线程中处理。 参考: Niagara中的数据同步——你无意中点了set操作,接下来命运的齿轮开始转动…… Niagara中的数据同步—— set命运齿轮转动之开发者篇 因此,作为二次开发者,如果自定义了一些异步 action,尤其是耗时比较长的,就应该独立创建辅助线程来执行,而不要放在主线程中,避免影响主线程对核心任务的执行。 学习建议 本节的重点在于:一定要深刻理解并掌握辅助线程的使用。对于 component 开发来说,异步操作用辅助线程是至关重要的,否则很可能会把 Niagara 搞崩。因为主线程受到看门狗的监视,主线程的阻塞会导致 Niagara 重启。 |

