在一個實際的項目中(非實驗室),數據是至關重要的。本篇講下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手冊。