2015-07-01 2 views
1

Я пишу pdxInstance с GemFire, используя последовательность: rabbitmq => springxd => gemfire.Gemfire pdxInstance datatype

Если я поместил этот 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

Лучше всего позаботиться об этом с помощью настраиваемого модуля или оригинального скрипта. Вы можете либо написать пользовательский модуль в 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 включает JSONFormatter во время операции Region.put (key, value), поскольку он довольно вовлечен и выходит за рамки этой дискуссии.

Однако можно утверждать, что проблема не обязательно связана с классом JSONFormatter, поскольку хранение числового значения в байте более эффективно, чем сохранение значения в целочисленном размере, особенно когда значение действительно вписывается в байт. Следовательно, проблема в том, что Компаратор, используемый в процессоре запросов, должен иметь возможность сравнивать числовые значения в одном семействе типов (байт, короткий, внутренний, длинный), при необходимости повышать уровень.

Если вы так склонны, не стесняйтесь подать билет JIRA в хранилище Apache Geode JIRA на https://issues.apache.org/jira/browse/GEODE-72?jql=project%20%3D%20GEODE

Примечания, Apache Geode является открытым исходным кодом «ядро» Pivotal GemFire ​​в настоящее время. См. Apache Geode website для более подробной информации.

Cheers!

 Смежные вопросы

  • Нет связанных вопросов^_^