AsyncRabbitTemplate с разными очередями - PullRequest
0 голосов
/ 29 апреля 2020

Я изучаю использование AsyncRabbitTemplate для межсервисной связи.

Пример рабочего кода:

@Bean
public AsyncRabbitTemplate template() {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
    container.setMessageConverter(jsonMessageConverter());
    container.setQueueNames(deviceReplyQueue);

    AsyncRabbitTemplate asyncRabbitTemplate = new AsyncRabbitTemplate(rabbitTemplate, container);
    asyncRabbitTemplate.setReceiveTimeout(5000);
    return asyncRabbitTemplate;
}

public List<Device> getDevices(List<UUID> deviceIds, User user)  {
    DeviceRequest deviceRequest = new DeviceRequest();
    deviceRequest.setUser(user);
    deviceRequest.setIds(deviceIds);

    AsyncRabbitTemplate.RabbitConverterFuture<List<Device>> future;
    try {
        future = asyncRabbitTemplate.convertSendAndReceive(deviceDirectExchange, requestRoutingKey, deviceRequest);
        future.addCallback(responseMessage -> {}, failure -> LOG.error("Failed to fetch devices. {}", failure.getMessage()));
        return future.get();
    } catch (ExecutionException | InterruptedException e) {
        return new ArrayList<>();
    }
}

Это прекрасно работает. Но теперь мне нужны разные очереди ответов, так как будут обмениваться разные объекты. В настоящее время

container.setQueueNames(deviceReplyQueue);

привязан к определенной c очереди. Нужно ли создавать несколько компонентов AsyncRabbitTemplate, каждый для определенной c очереди ответов? Или возможно поместить очередь приема в вызов convertSendAndReceive?

Или будет ли correlationId гарантировать, что ответное сообщение будет получено только отправителем, а все остальные потребители не будут его трогать?

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