#spring-boot #java-8 #spring-kafka #spring-el
#spring-boot #java-8 #spring-кафка #spring-el
Вопрос:
Я использую одну существующую аннотацию spring boot и хочу динамически устанавливать значение атрибута с помощью spring expression и хочу иметь одно постоянное значение в качестве префикса,
пример фрагмента кода
@KafkaListener(topics="${topic.name}", groupId="#{'consumergroup' (int)(java.lang.Math).random() }")
public void consumerMethod(){
}
Я хочу создать новую группу потребителей для каждого нового контейнера, используя вышеуказанную реализацию.
Но я сталкиваюсь с приведенным ниже исключением.
Сбой синтаксического анализа выражения; вложенным исключением является исключение org.springframework.expression.spel.SpelParseException: EL1041E: после синтаксического анализа допустимого выражения в выражении остается еще больше данных: ‘lparen(()
пожалуйста, помогите мне использовать шаблон spring EL или любой другой способ, который я могу использовать для установки идентификатора динамической группы потребителей с постоянным префиксом.
Комментарии:
1. Вам не хватает закрытия
}
.2. @M.Deinum Я добавил в свой фрагмент кода, но пропустил добавление здесь, о котором идет речь, не могли бы вы проверить сейчас.
3. Если кто-либо хочет поставить отрицательные оценки только потому, что они не понимают, пожалуйста, дайте мне знать, я исправлю их.
4. AFAIK, вам также нужно префикс статического вызова с
T
чем-то вроде(int) T(java.lang.Math).random()
. Я не думаю, что это сработало бы иначе.5. Смотрите Также мой ответ.
Ответ №1:
groupId="#{'consumergroup' (100 * T(Math).random()).intValue() }"
- В SpEL нет
cast
оператора. Просто потому, что он использует aConversionService
внутренне для преобразования из одного типа в другой. Я используюintValue()
любой способ, потому что результатrandom()
isDouble
(notdouble
) — SpEL выполняет принудительное преобразование в оболочки типов для удобства API. java.lang
Автоматически импортируется в контекст SpEL. Нет необходимости добавлять его дляMath
типа.100 *
. СмотритеMath.random()
JavaDocs: он возвращает значение между0.0
и1.0
. Таким образом, приведение кint
всегда будет приносить вам только0
. Приведение не выполняет округления.
Также см. Раздел Свойства конфигурации Spring Boot, где вы можете использовать случайное значение для groupId
:
spring.kafka.consumer.group-id=consumergroup${random.int}