spring - Several beans implementating the same interface -


the exact usage this:

    @slf4j public class client<e, key> {     @getter @nonnull private final updatelistener<e, key> updatelistener;     @nonnull private final subscriptionfactory subscriptionfactory;     @nonnull private final map<key, instant> updatedregistry = new concurrenthashmap<>();      public client(updatelistener<e, key> updatelistener,                   subscriptionfactory subscriptionfactory) {         this.updatelistener = updatelistener;         this.subscriptionfactory = subscriptionfactory;         this.subscriptionfactory.registersnapshotclient(updatelistener);         log.info("created new snapshot client entity key [{}], update type [{}] , component qualifier [{}]",             updatelistener.getentitykey(),             updatelistener.getoptionalchangetype(),             updatelistener.getcomponentqualifier());     }      @rabbitlistener(queues = {"#{@queuenamecreator.createupdatequeuename(snapshotclient.getupdatelistener())}",                                 "#{@queuenamecreator.createsnapshotqueuename(snapshotclient.getupdatelistener())}"})     public void handlemessage(message<e> rawupdate, @header("last_updated") instant newupdatedtime) {         ...//more code     } } 

each 'client' instance has own bean id not clash each other.

how can call exact updatelistener of object using spel?

update

after using programattical approach , registering method following exception:

    apr 28, 2015 3:22:47 pm org.springframework.amqp.rabbit.listener.conditionalrejectingerrorhandler handleerror warning: execution of rabbit message listener failed. org.springframework.amqp.rabbit.listener.exception.listenerexecutionfailedexception: listener method 'public void com.everymatrix.om2020.messaging.model.snapshotclient.handlemessage(org.springframework.messaging.message<e>,java.time.instant)' threw exception     @ org.springframework.amqp.rabbit.listener.adapter.messagingmessagelisteneradapter.invokehandler(messagingmessagelisteneradapter.java:126)     @ org.springframework.amqp.rabbit.listener.adapter.messagingmessagelisteneradapter.onmessage(messagingmessagelisteneradapter.java:93)     @ org.springframework.amqp.rabbit.listener.abstractmessagelistenercontainer.doinvokelistener(abstractmessagelistenercontainer.java:756)     @ org.springframework.amqp.rabbit.listener.abstractmessagelistenercontainer.invokelistener(abstractmessagelistenercontainer.java:679)     @ org.springframework.amqp.rabbit.listener.simplemessagelistenercontainer.access$001(simplemessagelistenercontainer.java:82)     @ org.springframework.amqp.rabbit.listener.simplemessagelistenercontainer$1.invokelistener(simplemessagelistenercontainer.java:167)     @ org.springframework.amqp.rabbit.listener.simplemessagelistenercontainer.invokelistener(simplemessagelistenercontainer.java:1241)     @ org.springframework.amqp.rabbit.listener.abstractmessagelistenercontainer.executelistener(abstractmessagelistenercontainer.java:660)     @ org.springframework.amqp.rabbit.listener.simplemessagelistenercontainer.doreceiveandexecute(simplemessagelistenercontainer.java:1005)     @ org.springframework.amqp.rabbit.listener.simplemessagelistenercontainer.receiveandexecute(simplemessagelistenercontainer.java:989)     @ org.springframework.amqp.rabbit.listener.simplemessagelistenercontainer.access$700(simplemessagelistenercontainer.java:82)     @ org.springframework.amqp.rabbit.listener.simplemessagelistenercontainer$asyncmessageprocessingconsumer.run(simplemessagelistenercontainer.java:1103)     @ java.lang.thread.run(thread.java:745) caused by: java.lang.illegalstateexception: no suitable resolver argument [0] [type=org.springframework.messaging.message] 

update

done, need following achieve desired behaviour.

@configuration @enablerabbit public static class omberabbitlistenerconfigurer implements rabbitlistenerconfigurer {     @autowired applicationcontext applicationcontext;     @autowired snapshotclientqueuenamescreator snapshotclientqueuenamescreator;     @autowired rabbitlistenercontainerfactory rabbitlistenercontainerfactory;     @autowired messageconverter messageconverter;      @override     public void configurerabbitlisteners(rabbitlistenerendpointregistrar registrar) {         final collection<snapshotclient> snapshotclients = applicationcontext.getbeansoftype(snapshotclient.class).values();         system.out.println(snapshotclients);          snapshotclients.stream().foreach(bean -> {             final string snapshotqueuename = snapshotclientqueuenamescreator.createsnapshotqueuename(bean.getupdatelistener());             final string updatequeuename = snapshotclientqueuenamescreator.createupdatequeuename(bean.getupdatelistener());              method method = stream.of(bean.getclass().getmethods()).filter(x -> x.getname().equals("handlemessage")).findany().get();              methodrabbitlistenerendpoint endpoint = new methodrabbitlistenerendpoint();              final defaultmessagehandlermethodfactory messagehandlermethodfactory = new defaultmessagehandlermethodfactory();             messagehandlermethodfactory.afterpropertiesset();              endpoint.setmessagehandlermethodfactory(messagehandlermethodfactory);              endpoint.setbean(bean);             endpoint.setmethod(method);              endpoint.setid(snapshotqueuename + ":" + updatequeuename + uuid.randomuuid());             endpoint.setqueuenames(snapshotqueuename, updatequeuename);             endpoint.setexclusive(false);              registrar.registerendpoint(endpoint, rabbitlistenercontainerfactory);         });     } } 

your question not clear - seem mixing runtime , initialization time concepts.

for example, "#{@queuenamecreator.createupdatequeuename(e.c.dosomething())}" evaluated once during initialization - it's not clear expression e is, or comes from.

but, seem passing in e in payload of message: message<e> rawupdate. message came queue , therefore can't influence queue name.

perhaps if can explain trying rather how have attempted it, can update "answer" possible solutions.

edit:

if mean want reference field in current (listener) bean in spel can't done directly.

edit2:

i can't think of way reference current bean in spel expression - has constant; that's way annotations work in java; tied class, not instance.

i think want, need revert using programmatic endpoint registration. however, you'd need wire in methodrabbitlistenerendpoint (rather simplerabbitlistenerendpoint) benefits of annotation looking (@header etc).

we don't cover in documentation; it's little advanced, essentially, need inject bean , method (for listener), , defaultmessagehandlermethodfactory.