I have Java code as following to receive messages form a queue, process it and write processed message to another queue.
@RabbitListener(queues = "rawFusion")
@SendTo("Fusion")
public String receiverFusion(Object _message) {
String message = getMessage(_message);
return messageParser.parse(message);
}
Here i always get messages from "rawFusion" queue and write it into "Fusion" queue.
The thing I want to do is, writing messages different queues depending on some conditions. So i would like decide @SendTo
parameter (or maybe without using @SendTo
) after i receive message from the "RawFusion" queue.
Any idea how to do that?
Thanks in advance
If the sender sets the replyTo
message property (either a queue name or exchange/routkingKey
), the container will use that. The @SendTo
is only used if there's not replyTo
in the message.
If you can't change the sender, when using @RabbitListener, the @SendTo
can contain a SpEL expression but it doesn't have any context from the request, which I suspect you would need to intelligently route the reply.
You could store something in a ThreadLocal and use
@SendTo("#{someBean.someMethod()}")
to retrieve it.
I will open a JIRA issue to see if we can come up with a mechanism to provide some context (e.g. input arguments) to the evaluation.
EDIT
Starting with version 1.6, the @SendTo can be a SpEL expression that is evaluated at runtime against the request and reply. @SendTo("!{'some.reply.queue.with.' + result.queueName}")
Unfortunately I cannot make any change on sender's message and it seems SpEL expression does not solve my problem in this case. But I found a workaround. I am not sure if its a good practice but it solves my problem for now.
I used @SendTo("exchange/")
i didnt use any routing key.
In my message i set a header value like "destination=testQueue" and i created an headers exchange which route my message depending on destination value.
Thanks for your answer and i hope we can have a mechanism that we can determine @SendTo
value after we receive the Message.