Любая концепция глобальной переменной в потоках весной xd?

Сценарий: определение потока в spring xd имеет следующую структуру:

джмс | фильтр | трансформировать | hdfs

В модуле фильтра я запускаю запрос к базе данных, чтобы проверить, применимо ли текущее сообщение для дальнейшей обработки.

Когда условие выполнено, сообщение передается модулю преобразования.

В модуле преобразования я хотел бы иметь доступ к результатам запроса из модуля фильтра.

В настоящее время мне приходится еще раз запускать запрос внутри преобразования, чтобы получить доступ к тому же набору результатов.

Существует ли какая-либо форма глобальной переменной, которая может применяться в течение всего времени существования сообщения, проходящего от источника к приемнику в разных модулях? Это может помочь уменьшить задержку чтения из базы данных.

Если это невозможно, что было бы рекомендуемой альтернативой?


person Arun Jose    schedule 25.07.2014    source источник
comment
Каково определение вашего фильтра?   -  person Andrei Stefan    schedule 25.07.2014
comment
В этом сценарии мой фильтр должен разрешать только сообщения, которые были добавлены для процесса в приложении. Приложение будет хранить список аутентифицированных идентификаторов в mysql, и каждый раз, когда приходит новое сообщение, я извлекаю его идентификатор и сравниваю его с авторизованным списком.   -  person Arun Jose    schedule 25.07.2014
comment
Я имел в виду, как вы эффективно определили свой фильтр?   -  person Andrei Stefan    schedule 25.07.2014
comment
В этом случае я использую заводной скрипт. Soemthign в духе JMS | filter --script=custom-filter.groovy | transform --script=custom-transform.groovy | hdfs   -  person Arun Jose    schedule 25.07.2014
comment
Не уверен, что такая функция существует (не думаю) в настоящее время в Spring XD. Но мне было интересно, можете ли вы добиться того, что вам нужно, добавив необходимую (дополнительную информацию) к сообщению, которое передается от фильтра к преобразованию. Это сообщение содержит полезную нагрузку и заголовки. Что, если бы вы могли добавить эти детали в заголовки? Никогда не пробовал это раньше, и я не уверен, что это сработает, но если бы я попробовал что-то, это было бы первое, что я бы попробовал.   -  person Andrei Stefan    schedule 25.07.2014
comment
У меня сложилось впечатление, что в модуле фильтра я не могу вносить какие-либо изменения в полезную нагрузку. Если это возможно, я мог бы сделать именно это.   -  person Arun Jose    schedule 25.07.2014
comment
Основываясь на идее, что сообщения передаются между модулями (будь то источник, фильтр, преобразование, приемник), я склонен сказать, что это возможно, если только в Spring XD нет ограничений. Вы можете попробовать это и посмотреть, работает ли это.   -  person Andrei Stefan    schedule 25.07.2014


Ответы (1)


Обычно для этого используется преобразователь или средство обогащения заголовков, чтобы установить заголовок сообщения с результатом запроса; используйте этот заголовок в фильтре, и заголовок будет доступен для последующих модулей, включая ваш преобразователь.

<int:chain input-channel="input" output-channel="output">
    <int:header-enricher..../>
    <int:filter ... />
</int:chain>

Это (передача произвольных заголовков) в настоящее время работает (из коробки) только с кроличьим (и локальным) транспортом или если включена прямая привязка.

При использовании транспорта Redis вы должны настроить шину, чтобы добавить свой заголовок к тем, которые она передает.

person Gary Russell    schedule 25.07.2014