Spring Cloud Сервисный соединитель Spring с RabbitMQ

Я использую Spring Cloud Spring Service Connector для подключения сервиса Rabbitmq на CloudFoundry.

public class CloudConfig extends AbstractCloudConfig {

    @Bean
    public ConnectionFactory rabbitFactory()
    {
         return connectionFactory().rabbitConnectionFactory();
    }
}

Но мне нужно объявить CachingConnectionFactory и установить его PublisherConfirms в значение true. Потому что нам нужно использовать publisherConfirm для проверки подтверждения при отправке сообщения в очередь. Я понятия не имею о том, как внедрить фабрику соединений, полученную из сервисного коннектора cloud spring. Или как мы могли бы справиться с этой ситуацией.

3 ответа

Документация включает в себя примеры настройки деталей соединения, предоставляемых Соединителями.

В вашем случае вы должны быть в состоянии сделать что-то вроде этого:

@Bean
public RabbitConnectionFactory rabbitFactory() {
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put("publisherConfirms", true);

    RabbitConnectionFactoryConfig rabbitConfig = new RabbitConnectionFactoryConfig(properties);
    return connectionFactory().rabbitConnectionFactory(rabbitConfig);
}

Вы можете перенастроить CCF, созданный соединителем, следующим образом:

@Bean
public SmartInitializingSingleton factoryConfigurer() {
    return new SmartInitializingSingleton() {

        @Autowired
        private CachingConnectionFactory connectionFactory;

        @Override
        public void afterSingletonsInstantiated() {
            this.connectionFactory.setPublisherConfirms(true);
        }
    };
}

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

Это RabbitTemplate

@Bean
public RabbitTemplate rabbitTemplate() {
    RabbitTemplate template = new RabbitTemplate(connectionFactory);
    template.setMandatory(true);
    template.setMessageConverter(new Jackson2JsonMessageConverter());
    template.setConfirmCallback((correlationData, ack, cause) -> {
        if (!ack) {
            System.out.println("send message failed: " + cause + correlationData.toString());
        } else {
            System.out.println("Publisher Confirm" + correlationData.toString());
        }
    });
    return template;
}

Это весенне-облачный конфиг:

@Bean
public ConnectionFactory rabbitConnectionFactory() {
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put("publisherConfirms", true);
    RabbitConnectionFactoryConfig rabbitConfig = new RabbitConnectionFactoryConfig(properties);
    return connectionFactory().rabbitConnectionFactory(rabbitConfig);
}

Когда я использую этого отправителя для отправки сообщения. Результат не ожидается.

@Component
public class TestSender {

@Autowired
private RabbitTemplate rabbitTemplate;

@Scheduled(cron = "0/5 * *  * * ? ")
public void send() {
System.out.println("===============================================================");
    this.rabbitTemplate.convertAndSend(EXCHANGE, "routingkey", "hello world",
            (Message m) -> {
                m.getMessageProperties().setHeader("tenant", "aaaaa");
                return m;
            }, new CorrelationData(UUID.randomUUID().toString()));
    Date date = new Date();
    System.out.println("Sender Msg Successfully - " + date);
}

}

Другие вопросы по тегам