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
.