在一个实际的项目中(非实验室),数据是至关重要的。本篇讲下OpenTCS的数据存储问题,
OpenTCS的关键数据主要是Vehicle数据和TransportOrder的数据。
然而这些数据OpenTCS没有做专门的持久化处理,也就是说只要Kernel一重启,之前发生的事就一无所知了。
为了将数据持久化,本文提出一种基于redis数据库的存储方案来存储Transportorder数据(如果要存储Vehicle数据同理)
关于Redis:
Redis是一种非关系型数据库,代码开源,并且是使用ANSI C 编写的、支持网络的内存数据库。本人非常喜欢。
OpenTCS中使用Redis:
通过拓展Kernel,接入OpenTCS的事件,实时保存订单(为了提高效率,只保存状态已经为Finished的订单),拓展流程为:
此拓展依赖Redis,gradle项目中使用Redis可在项目中追加如下依赖脚本:
dependencies {
compile group: 'redis.clients', name: 'jedis', version: '2.9.0'
}
导入Redis包
import redis.clients.jedis.Jedis;
import redis.clients.jedis.exceptions.JedisConnectionException; //redis异常定义
连接Redis(笔者Redis安装在本机)
jedis = new Jedis();
LOG.debug("can not connect redis");
try {
jedis.connect();
}
catch (JedisConnectionException e) {
LOG.error("redis connection exception:{}", e.getMessage());
}
//check
if (!jedis.isConnected()) {
LOG.error("can not connect to redis:{}", configuration.host());
}
抓取TransportOrder数据,并保存在数据库中:
//从OpenTCS的事件系统中抓取对象
TCSObjectEvent objEvent = (TCSObjectEvent) event;
if (!(objEvent.getCurrentOrPreviousObjectState() instanceof TransportOrder)) {
return;
}
TransportOrder t = (TransportOrder) objEvent.getCurrentOrPreviousObjectState();
//此处只记录状态标记为FINISHED的订单
//你也可以根据需要记录所有订单
if ((objEvent.getType() == TCSObjectEvent.Type.OBJECT_MODIFIED)
&& (t.getState() == TransportOrder.State.FINISHED)) {
//此处为了简便,直接将订单的内容打包成JSON存储到数据库中
jedis.set("order:" + t.getName(), toJson(TransportOrderState.fromTransportOrder(t)));
}
最终的存储的数据效果如下:
这样就优雅的解决了OpenTCS的数据存储问题.....然后就可以在Web或者其他客户端中随意查询了。
使用Redis还有个好处就是可以进行订阅操作......具体可以查看Redis手册。