1

我正在pdxInstance使用序列向 GemFire 写 s: rabbitmq => springxd => gemfire

如果我将此 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 中声明数据类型?或者任何其他方法来摆脱这个问题?

4

2 回答 2

3

为了对这个问题添加一些见解......在查看 GemFire/Geode 源代码时,似乎无法配置所需的值类型并覆盖 GemFire/Geode 的默认行为,这可以在JSONFormatter.setNumberField( ..) .

我不会解释 GemFire/Geode 如何在 Region.put(key, value) 操作期间涉及 JSONFormatter,因为它相当复杂,超出了本讨论的范围。

但是,有人可能会争辩说问题不一定出在 JSONFormatter 类上,因为将数值存储在字节中比将值存储在整数中更有效,尤其是当值确实适合字节时。因此,问题实际上是查询处理器中使用的比较器应该能够比较同一类型族(字节、短、整数、长)中的数值,并在适当的地方向上转换。

如果您愿意,请随时在 Apache Geode JIRA 存储库中提交 JIRA 票证,网址为https://issues.apache.org/jira/browse/GEODE-72?jql=project%20%3D%20GEODE

请注意,Apache Geode 现在是 Pivotal GemFire 的开源“核心”。有关详细信息,请参阅Apache Geode 网站

干杯!

于 2015-07-01T16:44:16.277 回答
0

您最好的选择是使用自定义模块或 groovy 脚本来处理这个问题。您可以使用 Java 编写自定义模块进行转换,然后将自定义模块上传到 SpringXD,然后您可以像任何其他处理器一样引用您的自定义模块。或者,您可以在 Groovy 中编写一个脚本,并通过转换处理器传递传入的数据。

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

实际的转换可能不会太棘手,但会因您使用的方法而异。完成后,流创建看起来像这样。

  1. 流创建 --name myRabbitStream --definition "rabbit | my-custom-module | gemfire-json-server etc....."

  2. 流创建 --name myRabbitStream --definition "rabbit | transform --script=file:/transform.groovy | gemfire-json-server etc...."

看起来你的源和接收器模块设置得很好,所以你需要做的就是设置你的处理器模块来进行转换,你应该已经准备好了。

于 2015-07-01T14:57:45.023 回答