java - 如何在Spring Boot中创建RestTemplate的多个实例?

标签 java spring-boot spring-rabbit

我有一个系统当前正在使用 SimpleMessageConverter 向多个系统发送消息。

现在我想开始在其中一个系统中使用 Jackson2JsonMessageConverter

这是为了解释为什么我想创建多个 RabbitTemplate 实例。

我还希望能够继续使用 RabbitAutoConfiguration 提供的所有配置选项,例如,如果我指定一个属性 spring.rabbitmq.connectionTimeout 我想要它影响将创建的 RabbitTemplate 的所有实例。

是否可以扩展 RabbitAutoConfiguration 来执行此操作?

最佳答案

我发现的选项是创建一个配置类并从 RabbitAutoConfiguration 复制部分代码:

@Configuration
public class RabbitTemplateConfiguration {

    @Bean
    public RabbitTemplate jsonRabbitTemplate(ConnectionFactory connectionFactory, RabbitProperties properties) {
        RabbitTemplate rabbitTemplate = createRabbitTemplate(connectionFactory, properties);
        rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
        return rabbitTemplate;
    }

    @Bean
    @Primary
    public RabbitTemplate simpleRabbitTemplate(ConnectionFactory connectionFactory, RabbitProperties properties) {
        RabbitTemplate rabbitTemplate = createRabbitTemplate(connectionFactory, properties);
        rabbitTemplate.setMessageConverter(new SimpleMessageConverter());
        return rabbitTemplate;
    }

    private RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory, RabbitProperties properties) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);

        rabbitTemplate.setMandatory(determineMandatoryFlag(properties));
        RabbitProperties.Template templateProperties = properties.getTemplate();
        RabbitProperties.Retry retryProperties = templateProperties.getRetry();
        if (retryProperties.isEnabled()) {
            rabbitTemplate.setRetryTemplate(createRetryTemplate(retryProperties));
        }
        if (templateProperties.getReceiveTimeout() != null) {
            rabbitTemplate.setReceiveTimeout(templateProperties.getReceiveTimeout());
        }
        if (templateProperties.getReplyTimeout() != null) {
            rabbitTemplate.setReplyTimeout(templateProperties.getReplyTimeout());
        }
        return rabbitTemplate;
    }

    private boolean determineMandatoryFlag(RabbitProperties properties) {
        Boolean mandatory = properties.getTemplate().getMandatory();
        return (mandatory != null ? mandatory : properties.isPublisherReturns());
    }

    private RetryTemplate createRetryTemplate(RabbitProperties.Retry properties) {
        RetryTemplate template = new RetryTemplate();
        SimpleRetryPolicy policy = new SimpleRetryPolicy();
        policy.setMaxAttempts(properties.getMaxAttempts());
        template.setRetryPolicy(policy);
        ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
        backOffPolicy.setInitialInterval(properties.getInitialInterval());
        backOffPolicy.setMultiplier(properties.getMultiplier());
        backOffPolicy.setMaxInterval(properties.getMaxInterval());
        template.setBackOffPolicy(backOffPolicy);
        return template;
    }
}

关于java - 如何在Spring Boot中创建RestTemplate的多个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50807949/

相关文章:

java - Android Studio - 如何检查 fragment 是否膨胀

java - 如何在Java中删除.dat文件?

java - Spring boot和Bean验证在不同的方法和同一个类中

rabbitmq - 覆盖 SimpleMessageListenerContainer.setDefaultRequeueRejected(false) 行为

java - Spring RabbitMQ PooledChannelConnectionFactory,事务性与非事务性池设置

java - 如何将 log4j2 与不同的日志文件一起使用?

java - 我的代码说小程序未初始化

java - 为什么使用 webflux 的 spring boot 测试会忽略自定义 jackson 模块

java - JsonPathResultMatchers 不能应用于 ResultMatcher

java - Spring注解@Retryable——如何设置一个拦截器