Spring amqp 在Spring Boot RabbitMQ中处理连接

Spring amqp 在Spring Boot RabbitMQ中处理连接,spring-amqp,spring-rabbit,Spring Amqp,Spring Rabbit,您好,我正在开发Spring boot RabbitMQ 1.6版。在开发应用程序时,我很少有疑问。阅读文档并浏览其他堆栈溢出问题,但我无法弄清楚一些事情(可能是因为我的内存不好)。 如果有人能回答我的问题那就太好了 1) 目前我有4个生产者和4个消费者。生产者可能会产生数百万条消息或事件,因此生产者和消费者使用单一连接将阻止消费者消费这些消息。因此,我认为是为生产者和消费者创建单独的连接,以便两者都不会阻止并提供一些信息性能改进。我的方法正确吗 2) 我正在使用CachingConnectio

您好,我正在开发Spring boot RabbitMQ 1.6版。在开发应用程序时,我很少有疑问。阅读文档并浏览其他堆栈溢出问题,但我无法弄清楚一些事情(可能是因为我的内存不好)。 如果有人能回答我的问题那就太好了

1) 目前我有4个生产者和4个消费者。生产者可能会产生数百万条消息或事件,因此生产者和消费者使用单一连接将阻止消费者消费这些消息。因此,我认为是为生产者和消费者创建单独的连接,以便两者都不会阻止并提供一些信息性能改进。我的方法正确吗

2) 我正在使用CachingConnectionFactory创建连接,以便使用SimpleRableBitListenerContainerFactory创建连接。同时打电话给该工厂它是否会为我们返回新连接?因此,如果我们使用CachingConnectionFactory我们真的需要为工厂编写单独的连接吗生产者和消费者。请在下面找到我的

1) 配置类

@Configuration
@EnableRabbit
public class RabbitMqConfiguration{

@Autowired
private CachingConnectionFactory cachingConnectionFactory;

@Value("${concurrent.consumers}")
public int concurrent_consumers;

@Value("${max.concurrent.consumers}")
public int max_concurrent_consumers;

 @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(cachingConnectionFactory);
        factory.setConcurrentConsumers(concurrent_consumers);
        factory.setMaxConcurrentConsumers(max_concurrent_consumers);
        factory.setMessageConverter(jsonMessageConverter());
        return factory;
    }

@Bean
public MessageConverter jsonMessageConverter()
{
    final Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
    return converter;
}

}
@Configuration
public class TaskProducerConfiguration extends RabbitMqConfiguration {

@Value("${queue1}")
public String queue1;

@Value("${queue2}")
public String queue2;

@Value("${queue3}")
public String queue1;

@Value("${queue4}")
public String queue2;

@Value("${spring.rabbit.exchange}")
public String exchange;

@Autowired
private CachingConnectionFactory cachingConnectionFactory;

@Primary
@Bean
public RabbitTemplate getQueue1Template()
{
    RabbitTemplate template = new RabbitTemplate(cachingConnectionFactory);
    template.setRoutingKey(this.queue1);
    template.setMessageConverter(jsonMessageConverter());
    return template;
}

@Bean
public RabbitTemplate getQueue2Template()
{
    RabbitTemplate template = new RabbitTemplate(cachingConnectionFactory);
    template.setRoutingKey(this.queue2);
    template.setMessageConverter(jsonMessageConverter());
    return template;
}

@Bean
public RabbitTemplate getQueue3Template()
{
    RabbitTemplate template = new RabbitTemplate(cachingConnectionFactory);
    template.setRoutingKey(this.queue3);
    template.setMessageConverter(jsonMessageConverter());
    return template;
}

@Bean
public RabbitTemplate getQueue4Template()
{
    RabbitTemplate template = new RabbitTemplate(cachingConnectionFactory);
    template.setRoutingKey(this.queue4);
    template.setMessageConverter(jsonMessageConverter());
    return template;
}
@Bean(name="queue1Bean")
public Queue queue1()
{
    return new Queue(this.queue1);
}

@Bean(name="queue2Bean")
public Queue queue2()
{
    return new Queue(this.queue2);
}

@Bean(name="queue3Bean")
public Queue queue3()
{
    return new Queue(this.queue3);
}

@Bean(name="queue4Bean")
public Queue queue4()
{
    return new Queue(this.queue4);
}

@Bean
TopicExchange exchange() {
    return new TopicExchange(exchange);
}

@Bean
List<Binding> bindings(Queue queue1Bean,Queue queue2Bean,Queue queue3Bean,Queue queue4Bean, TopicExchange exchange) {
    List<Binding> bindingList = new ArrayList<Binding>();
    bindingList.add(BindingBuilder.bind(queue1Bean).to(exchange).with(this.queue1));
    bindingList.add(BindingBuilder.bind(queue2Bean).to(exchange).with(this.queue2));
    bindingList.add(BindingBuilder.bind(queue3Bean).to(exchange).with(this.queue3));
    bindingList.add(BindingBuilder.bind(queue4Bean).to(exchange).with(this.queue4));
    return bindingList;
}

}
2) 制作人阶层

@Configuration
@EnableRabbit
public class RabbitMqConfiguration{

@Autowired
private CachingConnectionFactory cachingConnectionFactory;

@Value("${concurrent.consumers}")
public int concurrent_consumers;

@Value("${max.concurrent.consumers}")
public int max_concurrent_consumers;

 @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(cachingConnectionFactory);
        factory.setConcurrentConsumers(concurrent_consumers);
        factory.setMaxConcurrentConsumers(max_concurrent_consumers);
        factory.setMessageConverter(jsonMessageConverter());
        return factory;
    }

@Bean
public MessageConverter jsonMessageConverter()
{
    final Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
    return converter;
}

}
@Configuration
public class TaskProducerConfiguration extends RabbitMqConfiguration {

@Value("${queue1}")
public String queue1;

@Value("${queue2}")
public String queue2;

@Value("${queue3}")
public String queue1;

@Value("${queue4}")
public String queue2;

@Value("${spring.rabbit.exchange}")
public String exchange;

@Autowired
private CachingConnectionFactory cachingConnectionFactory;

@Primary
@Bean
public RabbitTemplate getQueue1Template()
{
    RabbitTemplate template = new RabbitTemplate(cachingConnectionFactory);
    template.setRoutingKey(this.queue1);
    template.setMessageConverter(jsonMessageConverter());
    return template;
}

@Bean
public RabbitTemplate getQueue2Template()
{
    RabbitTemplate template = new RabbitTemplate(cachingConnectionFactory);
    template.setRoutingKey(this.queue2);
    template.setMessageConverter(jsonMessageConverter());
    return template;
}

@Bean
public RabbitTemplate getQueue3Template()
{
    RabbitTemplate template = new RabbitTemplate(cachingConnectionFactory);
    template.setRoutingKey(this.queue3);
    template.setMessageConverter(jsonMessageConverter());
    return template;
}

@Bean
public RabbitTemplate getQueue4Template()
{
    RabbitTemplate template = new RabbitTemplate(cachingConnectionFactory);
    template.setRoutingKey(this.queue4);
    template.setMessageConverter(jsonMessageConverter());
    return template;
}
@Bean(name="queue1Bean")
public Queue queue1()
{
    return new Queue(this.queue1);
}

@Bean(name="queue2Bean")
public Queue queue2()
{
    return new Queue(this.queue2);
}

@Bean(name="queue3Bean")
public Queue queue3()
{
    return new Queue(this.queue3);
}

@Bean(name="queue4Bean")
public Queue queue4()
{
    return new Queue(this.queue4);
}

@Bean
TopicExchange exchange() {
    return new TopicExchange(exchange);
}

@Bean
List<Binding> bindings(Queue queue1Bean,Queue queue2Bean,Queue queue3Bean,Queue queue4Bean, TopicExchange exchange) {
    List<Binding> bindingList = new ArrayList<Binding>();
    bindingList.add(BindingBuilder.bind(queue1Bean).to(exchange).with(this.queue1));
    bindingList.add(BindingBuilder.bind(queue2Bean).to(exchange).with(this.queue2));
    bindingList.add(BindingBuilder.bind(queue3Bean).to(exchange).with(this.queue3));
    bindingList.add(BindingBuilder.bind(queue4Bean).to(exchange).with(this.queue4));
    return bindingList;
}

}
你的帮助应该是值得感激的

注:否决投票人请在否决投票前登记您的意见,以便将来我可以避免错误

根据Gary Russell的评论编辑: 1) RabbitMqConfiguration

@Configuration
@EnableRabbit
public class RabbitMqConfiguration{

@Value("${concurrent.consumers}")
public int concurrent_consumers;

@Value("${max.concurrent.consumers}")
public int max_concurrent_consumers;

 @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory());
        factory.setConcurrentConsumers(concurrent_consumers);
        factory.setMaxConcurrentConsumers(max_concurrent_consumers);
        factory.setMessageConverter(jsonMessageConverter());
        return factory;
    }

@Bean
public CachingConnectionFactory connectionFactory()
{
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost");
    connectionFactory.setUsername("guest");
    connectionFactory.setPassword("guest");
    connectionFactory.setCacheMode(CacheMode.CONNECTION);
    return connectionFactory;
}


@Bean
public MessageConverter jsonMessageConverter()
{
    final Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
    return converter;
}


}
对生产者和消费者使用单一连接将阻止消费者使用消息`


是什么让你相信的?一个单一的连接通常是好的。如果你真的想要分开的连接,将连接工厂
cacheMode
更改为
connection

您可以在相同的情况下使用连接池,保持池大小适当可能会解决问题。正如上面回答中所建议的,生产者和消费者都使用相同的连接,因此池可能会帮助您解决问题。

@Gray Russell谢谢请回答。事实上,制作人一次可能会产生超过一百万条消息,所以在这种情况下,单次连接就足够了。另外,在阅读一些他们指定为制作人和消费者处理单独连接的博客时,我在这里发布了一个问题。cacheMode=connection实际上可以做什么?现在我修改了代码,现在可以了吗@Bean public CachingConnectionFactory consumerConnectionFactory(){CachingConnectionFactory connectionFactory=new CachingConnectionFactory(“localhost”);connectionFactory.setUsername(“guest”);connectionFactory.setPassword(“guest”);connectionFactory.setCacheMode(CacheMode.CONNECTION);返回连接工厂;}在Spring boot Application.properties中,配置了以下属性Spring.rabbitmq.cache.connection.mode=CHANNEL Spring.rabbitmq.cache.CHANNEL.size=50 Spring.rabbitmq.cache.CHANNEL.checkout timeout=1000 concurrent.consumers=3 max.concurrent.consumers=10它看起来好吗?一个连接通常就足够了。不要试图在注释中添加代码/配置-这是不可读的-最好是编辑您的问题
CacheMode.CONNECTION
表示每个用户将使用不同的连接。我根据您的评论修改了RabbitMQConfiguration文件。请在问题中找到您名下编辑的部分。连接何时关闭?它由@RabitTemplate自动处理,还是我们需要处理?