Need to pass the queue name dynamically in RabbitMQListner

23 Views Asked by At

I have to pass the queuename dynamically from the extended method dynamically. I am getting below exception

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'rabbitmqQueue' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext' - maybe not public or not valid?
at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:217) ~[spring-expression-5.3.22.jar:5.3.22]
at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:104) ~[spring-expression-5.3.22.jar:5.3.22]
at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:91) ~[spring-expression-5.3.22.jar:5.3.22]
at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:112) ~[spring-expression-5.3.22.jar:5.3.22]
at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:273) ~[spring-expression-5.3.22.jar:5.3.22]
at org.springframework.context.expression.StandardBeanExpressionResolver.evaluate(StandardBeanExpressionResolver.java:167) ~[spring-context-5.3.22.jar:5.3.22]
... 29 common frames omitted

Code:

public abstract class RabbitmqConsumerService {

String rabbitmqQueue;
protected RabbitmqConsumerService(String rabbitmqQueue) {
    this.rabbitmqQueue =rabbitmqQueue;
}


/**
 * This message is used to consume the message from common interface.
 *
 * @param message
 */
@RabbitListener(queues = "#{rabbitmqQueue}")
public void consume(String message) {
    LoggingUtils.debug(log, "Received Message: {}", message);
}   

}

public class NodeHierarchyMessageReceiver<V> extends RabbitmqConsumerService {

@Autowired
NodeHierarchyService nodeHierarchyService;

public NodeHierarchyMessageReceiver(@Value("${mt.message.queue}") String queueName2) {
    super(queueName2);
}

@Override
public void consume(String message) {
    LoggingUtils.debug(log, "Message got received:{}", message);

} }

1

There are 1 best solutions below

0
Artem Bilan On

That SpEL expression deals with beans in its context. So, your rabbitmqQueue must be a bean name, not a property in your class. Well, it still can be, but as a getter on some bean.

That queues attribute can accept a property placeholder: queues = "${my.rabbitmqQueue}"