OpenTCS打造移动机器人交通管制系统(七)

在一个实际的项目中(非实验室),数据是至关重要的。本篇讲下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手册。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章