Динамическая аннотация SendTo

У меня есть код Java, как показано ниже, чтобы получать сообщения из очереди, обрабатывать ее и записывать обработанное сообщение в другую очередь.

    @RabbitListener(queues = "rawFusion")
    @SendTo("Fusion")
    public String receiverFusion(Object _message) {
        String message = getMessage(_message);
        return messageParser.parse(message);
    }

Здесь я всегда получаю сообщения из очереди «rawFusion» и записываю их в очередь «Fusion».

То, что я хочу сделать, это писать сообщения в разные очереди в зависимости от некоторых условий. Поэтому я хотел бы выбрать параметр @SendTo (или, возможно, без использования @SendTo) после того, как получу сообщение из очереди «RawFusion».

Любая идея, как это сделать?

заранее спасибо


person Altan Gokcek    schedule 23.02.2016    source источник


Ответы (2)


Если отправитель устанавливает свойство сообщения replyTo (либо имя очереди, либо exchange/routkingKey), контейнер будет использовать его. @SendTo используется только в том случае, если в сообщении нет replyTo.

Если вы не можете изменить отправителя, при использовании @RabbitListener @SendTo может содержать выражение SpEL, но у него нет никакого контекста из запроса, который, как я подозреваю, вам понадобится для разумной маршрутизации ответа.

Вы можете сохранить что-то в ThreadLocal и использовать

@SendTo("#{someBean.someMethod()}")

чтобы получить его.

Я открою вопрос JIRA, чтобы посмотреть, сможем ли мы придумать механизм для предоставления некоторого контекста (например, входных аргументов) для оценки.

ИЗМЕНИТЬ

Начиная с версии 1.6 @SendTo может быть выражением SpEL, которое оценивается во время выполнения по запросу и ответу. @SendTo("!{'some.reply.queue.with.' + result.queueName}")

person Gary Russell    schedule 23.02.2016

К сожалению, я не могу внести какие-либо изменения в сообщение отправителя, и кажется, что выражение SpEL не решает мою проблему в этом случае. Но я нашел обходной путь. Я не уверен, что это хорошая практика, но пока она решает мою проблему.

Я использовал @SendTo("exchange/") я не использовал ключ маршрутизации. В своем сообщении я установил значение заголовка, например «destination = testQueue», и создал обмен заголовками, который направляет мое сообщение в зависимости от значения назначения.

Спасибо за ваш ответ, и я надеюсь, что у нас будет механизм, с помощью которого мы сможем определить значение @SendTo после получения сообщения.

person Altan Gokcek    schedule 23.02.2016