我有一个系统当前正在使用 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/