2015-07-01 49 views
1

我正在使用以下順序將pdxInstance寫入GemFire:rabbitmq => springxd => gemfireGemfire pdxInstance數據類型

如果我將此JSON放入rabbitmq {'ID':11,'value':5},value在GemFire中顯示爲字節值。如果我把{'ID':11,'value':500}value作爲一個詞出現,如果我把{'ID':11,'value':50000}它看起來是一個整數。

從GemFire查詢數據並對它們進行排序時會出現問題。例如,如果我使用諸如select * from /my_region order by value之類的查詢,它會失敗,表示它無法將字節與字(或帶整數的字節)進行比較。

有什麼辦法可以在JSON中聲明數據類型嗎?或者任何其他方法來擺脫這個問題?

回答

0

最好的辦法就是用自定義模塊或groovy腳本處理此問題。您可以使用Java編寫自定義模塊進行轉換,然後將自定義模塊上載到SpringXD,然後您可以像引用其他任何處理器一樣引用自定義模塊。或者您可以在Groovy中編寫腳本,並通過轉換處理器傳遞傳入的數據。

http://docs.spring.io/spring-xd/docs/current/reference/html/#processors

實際轉換可能不會太棘手,但會根據您使用哪種方法會有所不同。完成後,流創建將看起來像這樣。

  1. 流創建--name myRabbitStream --definition 「兔|我的定製模塊|的GemFire JSON的服務器等.....」

  2. 流創建--name myRabbitStream - 定義「兔子|變換--script =文件:/transform.groovy |的GemFire JSON的服務器等...」

好像你有你的源和接收器模塊設置就好了,所以所有你需要做的就是讓你的處理器模塊設置完成轉換,你應該全部設置好。

3

要在這個問題上增加一點洞察力...在回顧GemFire/Geode源代碼時,似乎無法配置所需的值類型並覆蓋GemFire/Geode的默認行爲,這可以在JSONFormatter.setNumberField(..)

我不會解釋GemFire/Geode在Region.put(key,value)操作過程中如何涉及JSONFormatter,因爲它涉及的內容超出了本討論的範圍。

但是,有人可能會說這個問題不一定與JSONFormatter類有關,因爲在一個字節中存儲一個數值比在一個整數中存儲該值更爲有效,特別是當該值確實適合一個字節時。因此,問題在於查詢處理器中使用的比較器應該能夠比較相同類型系列(字節,短,整型,長)中的數值,並在適當情況下向上轉換。

如果你覺得這樣的傾向,隨時https://issues.apache.org/jira/browse/GEODE-72?jql=project%20%3D%20GEODE

注到文件在Apache的Geode JIRA庫中的JIRA票,阿帕奇的Geode是舉足輕重的GemFire開源「芯」了。有關更多詳細信息,請參閱Apache Geode website

乾杯!