rabbitMq 针对于当前监听的队列,来控制消费者并发数量,不影响其他队列,代码示例

@Configuration
@ConditionalOnClass(SimpleRabbitListenerContainerFactory.class)
public class ConsumerConfig {

	@Value("${rabbit.batch.num:100}")
	private int batchNum;

	@Bean("batchQueueRabbitListenerContainerFactory")
	public SimpleRabbitListenerContainerFactory batchQueueRabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
		SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
		factory.setConnectionFactory(connectionFactory);
		factory.setBatchListener(true);
		factory.setConsumerBatchEnabled(true);
		factory.setBatchSize(batchNum);
		factory.setConcurrentConsumers(5); // 设置并发消费者数量为 5
		factory.setMaxConcurrentConsumers(10); // 设置最大并发消费者数量为 10
		return factory;
	}
}

concurrentConsumers 和 maxConcurrentConsumers 属性的具体含义如下:
concurrentConsumers:指定同时运行的消费者数量,默认为1。
maxConcurrentConsumers:指定允许的最大并发消费者数量,默认为1。
因此,在上述示例中,设置了 concurrentConsumers 为 5,maxConcurrentConsumers 为 10,意味着 RabbitMQ 容器将维持一个初始的消费者池大小为 5,并在需要时最多扩展到 10 个并发消费者。

通过以上修改,你就可以在 batchQueueRabbitListenerContainerFactory 中控制消费者的并发数量了。根据你的实际需求,可以调整并发消费者的数量以满足系统性能和资源的要求。
需要注意的是,这种设置会影响到特定队列的消费者并发数量,而不会影响其他队列的消费者。因为你是针对特定的batchQueueRabbitListenerContainerFactory进行配置,所以只会影响使用该工厂的队列。
如果你想配置多个工厂,可以继续添加其他的@Bean方法。

例如,你可以添加另一个SimpleRabbitListenerContainerFactory bean,命名为anotherQueueRabbitListenerContainerFactory,并配置相应的属性:

@Bean("anotherQueueRabbitListenerContainerFactory")
public SimpleRabbitListenerContainerFactory anotherQueueRabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    // 配置其他属性
    return factory;
}

通过这种方式,你可以定义多个SimpleRabbitListenerContainerFactory bean,并分别配置每个工厂需要的属性。然后在需要使用特定工厂的@RabbitListener注解中,通过containerFactory属性指定使用哪个工厂。

举个例子,如果你希望某个队列使用anotherQueueRabbitListenerContainerFactory工厂进行监听,可以这样设置:

@RabbitListener(queues = "another.queue", containerFactory = "anotherQueueRabbitListenerContainerFactory")
public void onAnotherMessage(Message message) {
    // 处理消息
}

通过这种方式,你可以根据需要定义多个工厂,并将它们分配给不同的队列进行监听。
以下是rabbitMq监听消息代码:

@RabbitListener(queues = "test.queue", containerFactory = "batchQueueRabbitListenerContainerFactory")
@RabbitHandler
public void onReportMessage(List<Message> messages) {
	List<Map<String, Object>> list = messages.stream().map(message -> (Map<String, Object>) message.getPayload()).collect(Collectors.toList());
	log.info("report收到数据:{}", JSON.toJSONString(list));
	service.handler(list);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
RabbitMQ本身并没有直接支持延迟消息队列的功能,但可以通过一些技巧来实现延迟消息的效果。下面是一种常见的实现方式: 1. 创建一个普通的队列,用于存储需要延迟发送的消息。 2. 创建一个消费者监听队列,并设置消费者的最大并发数为1。 3. 发布消息时,将消息设置一个延迟时间,并发送到上述队列中。 4. 消费者收到消息后,暂停一段时间,然后再将消息发送到目标队列中。 这种方式的原理是,通过一个消费者监听队列,实现了消息的延迟发送。具体实现时,可以使用RabbitMQ的TTL(Time to Live)和DLX(Dead Letter Exchange)特性来辅助实现。 具体步骤如下: 1. 创建一个普通的队列,设置其消息的过期时间(TTL)为需要延迟的时间。 2. 为队列设置一个死信交换机(DLX),并指定该交换机的死信路由键(DLK)。 3. 将队列绑定到DLX上,并指定DLK为目标队列。 4. 发布消息时,将消息发送到上述队列中。 5. 监听DLX上的目标队列,当消息被路由到该队列时,即表示延迟时间已过,可进行后续处理。 需要注意的是,这种方式实现的延迟消息并不是实时的,而是通过一个消费者的处理来达到延迟的效果。因此,在实际使用中需要根据需求和系统的负载情况来调整消费者并发数和处理时间,以保证延迟消息的可靠性和实时性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值