Я изучаю использование 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 гарантировать, что ответное сообщение будет получено только отправителем, а все остальные потребители не будут его трогать?