SpringBoot RabbitMQ Retry配置

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);
	}
}

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用Spring Boot和RabbitMQRabbitAdmin客户端配置策略的示例: 首先,确保已经安装了RabbitMQ并启动了服务。 在Spring Boot项目中,首先需要添加RabbitMQ的依赖。在pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 然后,在application.properties文件中配置RabbitMQ的连接信息: ```properties spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest ``` 接下来,创建一个配置类来配置RabbitAdmin客户端: ```java import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.Queue; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitMQConfig { @Bean public AmqpAdmin amqpAdmin(ConnectionFactory connectionFactory) { return new RabbitAdmin(connectionFactory); } @Bean public Queue myQueue() { return new Queue("myQueue"); } } ``` 在上面的配置类中,我们创建了一个名为"myQueue"的队列,并将其注册到RabbitAdmin客户端中。 现在,您可以在您的应用程序中使用RabbitAdmin来管理RabbitMQ的队列、交换机等资源。例如,您可以使用RabbitAdmin来声明队列、绑定交换机等操作。 请注意,上述示例假设您已经正确配置RabbitMQ的连接信息,并且您的应用程序已经正确引入了Spring Boot和RabbitMQ的依赖项。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值