SpringBoot RabbitMQ Retry配置

本文详细介绍了如何在SpringBoot应用中配置RabbitMQ的重试机制,包括数据库连接池、Redis缓存、RabbitMQ消息队列等核心组件的配置参数。通过示例代码展示了如何设置重试策略、回退策略以及任务执行器,实现消息的可靠投递。

SpringBoot RabbitMQ Retry(重发)配置

1.RabbitMQ application.properties

#database config
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000

#redis config
spring.redis.database=2
spring.redis.hostname=192.168.1.197
spring.redis.password=walrus
spring.redis.port=6379

#redis pool config
spring.redis.pool.maxActive=200
spring.redis.pool.maxWait=12000
spring.redis.pool.maxIdle=50
spring.redis.pool.minIdle=10

#rabbit mq config
spring.application.name=springboot-rabbitmq
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=test
spring.rabbitmq.password=test
# open sender confirm
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.virtual-host=/test

2.RabbitMQConfig.java

package org.ssgroup.secondkill.config.mq;


import org.springframework.amqp.core.AcknowledgeMode;
import org.springframework.amqp.rabbit.config.RetryInterceptorBuilder;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.retry.RejectAndDontRequeueRecoverer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.retry.backoff.ExponentialBackOffPolicy;
import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.retry.support.RetryTemplate;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;

import com.rabbitmq.client.ConnectionFactory;

@Component
public class RabbitMQConfig {
	private static int SESSION_CACHE_SIZE = 25;
	private static int CORE_POOL_SIZE = 64;
	private static int MAX_POOL_SIZE = 1024;
	private static int QUEUE_CAPACITY = 256;
	
	@Autowired
	private RabbitMQProperties rabbitMQProperties;
	
	@Bean
	public ConnectionFactory connectionFactory() {
		ConnectionFactory connectionFactory = new ConnectionFactory();
		connectionFactory.setHost(rabbitMQProperties.getHost());
		connectionFactory.setPort(rabbitMQProperties.getPort());
		connectionFactory.setUsername(rabbitMQProperties.getUsername());
		connectionFactory.setPassword(rabbitMQProperties.getPassword());
		connectionFactory.setVirtualHost(rabbitMQProperties.getVirtualHost());
		connectionFactory.setConnectionTimeout(1000);
		return connectionFactory;
	}
	
	@Bean
	public CachingConnectionFactory rabbitConnectionFactory() {
		CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory(connectionFactory());
		cachingConnectionFactory.setChannelCacheSize(SESSION_CACHE_SIZE);
		cachingConnectionFactory.setExecutor(taskExecutor());
		return cachingConnectionFactory;
	}
	
	@Bean
	public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
		SimpleRabbitListenerContainerFactory containerFactory = new SimpleRabbitListenerContainerFactory();
		containerFactory.setConnectionFactory(rabbitConnectionFactory());
		containerFactory.setConcurrentConsumers(1);
		containerFactory.setMaxConcurrentConsumers(20);
		containerFactory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
		//containerFactory.setMessageConverter(new Jackson2JsonMessageConverter());
		containerFactory.setTaskExecutor(taskExecutor());
		containerFactory.setChannelTransacted(true);
		containerFactory.setAdviceChain(
			RetryInterceptorBuilder
				.stateless()
					.recoverer(new RejectAndDontRequeueRecoverer())
					.retryOperations(retryTemplate())
				.build()
		);
		return containerFactory;
	}
	
	@Bean
	public RetryTemplate retryTemplate() {
		RetryTemplate retryTemplate = new RetryTemplate();
		retryTemplate.setBackOffPolicy(backOffPolicy());
		retryTemplate.setRetryPolicy(retryPolicy());
		return retryTemplate;
	}
	
	@Bean
	public ExponentialBackOffPolicy backOffPolicy() {
		ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
		backOffPolicy.setInitialInterval(1000);
		backOffPolicy.setMaxInterval(10000);
		return backOffPolicy;
	}
	
	@Bean
	public SimpleRetryPolicy retryPolicy() {
		SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
		retryPolicy.setMaxAttempts(3);
		return retryPolicy;
	}
	
	@Bean
	public ThreadPoolTaskExecutor taskExecutor() {
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		executor.initialize();
		executor.setCorePoolSize(CORE_POOL_SIZE);
		executor.setMaxPoolSize(MAX_POOL_SIZE);
		executor.setQueueCapacity(QUEUE_CAPACITY);
		return executor;
	}
}

3.OrderReceiver.java

@Component
public class OrderReceiver {
	private static Logger logger = LoggerFactory.getLogger(OrderReceiver.class);
	
	@Autowired
	private OrderMapper orderMapper;
	
	@RabbitListener(queues= {RabbitMQQueueConfig.ORDER_QUEUE_NAME})
	public void orderReceiver(Orders order, Message message, Channel channel) throws Exception {
		logger.info("订单消息入库... | id : {}",order.getId());
		System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
		orderMapper.save(order);
		channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
	}
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值