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手冊。

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