Как вернуть данные RabbitMQ клиенту (пользователю сайта) - PullRequest
0 голосов
/ 07 мая 2019

Я изучаю RabbitMQ и мне было интересно, как вернуть данные, которые он обрабатывает, клиенту (пользователю сайта).

Процесс, о котором я думаю, состоит из конечной точки REST, где пользователь запрашивает что-то для обработки, для завершения которого требуется около 5 секунд. Таким образом, пользователь запрашивает его, веб-служба пересылает запрос в очередь RabbitMQ, которая будет иметь до 10 потребителей в докер-контейнерах, слушающих его и готовых обработать запрос. Пока все хорошо, я могу это сделать. Дело в том, как я могу вернуть данные пользователю после того, как потребитель завершил их обработку? Имея в виду дизайн ниже, есть изображение для лучшего понимания:

Другими словами, это будет что-то вроде:

1 - Производитель (остальные) получает запрос и отправляет сообщение в RabbitMQ.

2 - RabbitMQ пересылает сообщение любому прослушивающему потребителю.

3 - потребитель обрабатывает данные.

4 - Вот где я потерялся. Как я могу вернуть сгенерированные данные клиенту (пользователю сайта)? Еще одна вещь, пользователь будет ждать окончания запроса, не нужно отправлять его позже.

Для большей детализации я использую java, а остальная часть - это весенняя загрузка.

Изображение: enter image description here

1 Ответ

1 голос
/ 07 мая 2019

См. Запрос ответа на сообщения .

Используйте один из RabbitTemplate sendAndReceive() методов.

На стороне потребителя просто верните результат из вашего@RabbitListener method.

@RabbitListener(queues = "foo")
public String process(String in) {
    return in.toUpperCase();
}

EDIT

@SpringBootApplication
public class So56025184Application {

    public static void main(String[] args) {
        SpringApplication.run(So56025184Application.class, args);
    }

    @Bean
    public ApplicationRunner runner(RabbitTemplate template) {
        return args -> {
            Scanner scanner = new Scanner(System.in);
            String toSend = scanner.nextLine();
            while (!"quit".equals(toSend)) {
                System.out.println(template.convertSendAndReceive("q1", toSend));
                toSend = scanner.nextLine();
            }
            scanner.close();
        };
    }

    @RabbitListener(queues = "q1")
    public String listen(String in) {
        return in.toUpperCase();
    }

    @Bean
    public Queue queue() { // RabbitAdmin will add this to the broker
        return new Queue("q1");
    }

}

Вы можете отправлять / получать расширенные объекты (а не простые строки), используя сериализацию Java (ипо умолчанию SimpleMessageConverter или преобразование в JSON с использованием Jackson2JsonMessageConverter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...