Anomaly interpretation
In a high concurrency scenario, the number of channels reaches the limit, so they cannot continue to be created
Self-built rabbitmq solution
1. Custom configuration
@Configuration
@Slf4j
public class RabbitMQConfig {
@Bean
public RabbitTemplate rabbitTemplate(final ConnectionFactory connectionFactory) {
CachingConnectionFactory cachingConnectionFactory = (CachingConnectionFactory) connectionFactory;
// set ChannelMax as 4095
cachingConnectionFactory.getRabbitConnectionFactory().setRequestedChannelMax(4095);
final RabbitTemplate rabbitTemplate = new RabbitTemplate(cachingConnectionFactory);
rabbitTemplate.setMessageConverter(jackson2MessageConverter());
rabbitTemplate.setMandatory(true);
rabbitTemplate.setConfirmCallback((correlationData, b, s) -> {
if(!b){
log.error("confirmCallBack Sending failed data: {}",correlationData);
log.error("confirmCallBack Confirmation status: {}",b);
log.error("ConfirmCallBack Reason for sending failure: {}",s);
}
});
rabbitTemplate.setReturnCallback((message, i, s, s1, s2) -> {
log.error("returnCallBack message: {}",message);
log.error("returnCallBack response code: {}",i);
log.error("returnCallBack response message: {}",s);
log.error("returnCallBack Switch: {}",s1);
log.error("returnCallBack Routing Key.{}",s2);
});
return rabbitTemplate;
}
@Bean
public Jackson2JsonMessageConverter jackson2MessageConverter() {
return new Jackson2JsonMessageConverter();
}
}
2. Modify the configuration of MQ server synchronously
rabbitmq.conf
## Set the max permissible number of channels per connection.
## 0 means "no limit".
##In the configuration file, just enter the following parameters and the value you want to set, if you don't use 2047, then you don't need to configure
# channel_max = 128
Rabbitmq solution for cloud services
For paid versions of MQ cloud services, you can try the following to configure rabbitMq connection caching
springBoot 2.3+
rabbitmq:
cache:
connection:
size: 1000
channel:
size: 64