Как добавить условие даты в @StreamListener

Предполагая, что я могу отправлять сообщения через Kafka или RabbitMQ и использовать их с помощью @StreamListener.

Биндеры настроены на тип содержимого = 'application/json', поэтому я думаю, что можно было бы добавить условия для полезной нагрузки.

Мое требование состоит в том, чтобы получать элементы только тогда, когда дата поля предшествует текущему моменту(). Все остальные элементы будут потребляться, когда это условие будет истинным.

Например, я ожидаю что-то вроде:

@StreamListener(value = INPUT, condition = "data.startDate > now()")
public void onMessage(@Payload Data data) { 
    // ...
}

Первая проблема заключается в том, что я получаю сообщение об ошибке: EL1008E: свойство или поле «startDate» не может быть найдено в объекте типа «байт []» — возможно, оно не общедоступно или недействительно?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
2
0
2 873
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это правильно, так как полезная нагрузка не преобразуется в какой-либо тип и существует в необработанном виде, то есть byte[]. См. подраздел эта секция, в частности «Согласование типа контента в контексте условия».

Однако в вашем случае вы можете просто изменить свое выражение, чтобы оно было чем-то вроде new String(payload)...., зная, что это всегда byte[], прежде чем оно будет преобразовано.

Спасибо Олег. Раздел не содержит подробностей о том, как пишется условие из полезной нагрузки. Почему я должен анализировать byte[] mysefl? Я могу выполнить синтаксический анализ в String, а затем в Object с помощью JSOn, но это кажется немного громоздким! Более того, простой пример даже со строковым условием не работает из-за упомянутой мной ошибки. Я добавил примеры для пояснения.

OlivierTerrien 01.02.2019 17:41

ну, это потому, что мы не предполагаем автоматически, что пользователь всегда хочет String, поэтому, пока мы не узнаем тип, он является необработанным, следовательно, byte[]. Кроме того, ваш пример фактически объяснен в документе, который я разместил. Мы НЕ можем преобразовать в объект Data, пока не узнаем, что будем вызывать этот обработчик. Тем не менее, я чувствую, что, возможно, будут нужны дополнительные разъяснения, поэтому постараюсь обновить документ.

Oleg Zhurakousky 01.02.2019 17:51

Действительно, вы правы. Это то, что я только что прочитал в доке. Еще раз спасибо.

OlivierTerrien 01.02.2019 17:52

Я думаю, что ответ есть в документации и соответствует ответу Олега

That is because you are testing something that does not yet exist in a state you expect. That is because the payload of the message is not yet converted from the wire format (byte[]) to the desired type. In other words, it has not yet gone through the type conversion process described in the Chapter 10, Content Type Negotiation.

So, unless you use a SPeL expression that evaluates raw data (for example, the value of the first byte in the byte array), use message header-based expressions (such as condition = "headers['type']=='dog'").

Другие вопросы по теме