关于RabbitMQ的Channel默认线程

 更新时间:2023年09月01日 10:33:17   作者:m0_46522672  
这篇文章主要介绍了关于RabbitMQ的Channel默认线程,通过jvm工具观察rabbitmq的线程使用情况,发现生产者每发一条消息,消费者这边就会创建一条线程,言下之意,一个channel当消息来到时就会异步处理这些消息,需要的朋友可以参考下

前言

最近做了一个小功能,是通过一个客户端消费者监听队列消息, 代码如下:

Connection conn = getConnection();
Channel channel = conn.createChannel();
MessageConsumer consumer = ...
channel.basicConsume(realQueue, true, consumer);

通过jvm工具观察rabbitmq的线程使用情况,发现生产者每发一条消息,消费者这边就会创建一条线程, 言下之意,一个channel当消息来到时就会异步处理这些消息.

定位

通过断点查找发现原来是 ConsumerWorkService这个类控制的。

这个类顾名思义,就是消费者工作 ExecutorService, 这里的Service表示的是ExecutorService

这个类构造函数里有一个executor参数,当这个参数为空时,就会创建一个Executors.newFixedThreadPool,代码如下:

final public class ConsumerWorkService {
    private static final int MAX_RUNNABLE_BLOCK_SIZE = 16;
    private static final int DEFAULT_NUM_THREADS = Runtime.getRuntime().availableProcessors() * 2;
    private final ExecutorService executor;
    private final boolean privateExecutor;
    private final WorkPool<Channel, Runnable> workPool;
    private final int shutdownTimeout;
    public ConsumerWorkService(ExecutorService executor, ThreadFactory threadFactory, int queueingTimeout, int shutdownTimeout) {
        this.privateExecutor = (executor == null);
        this.executor = (executor == null) ? Executors.newFixedThreadPool(DEFAULT_NUM_THREADS, threadFactory)
                                           : executor;
        this.workPool = new WorkPool<>(queueingTimeout);
        this.shutdownTimeout = shutdownTimeout;
    }
  ...

默认的executor 会使用 CPU核数的2倍 作为线程池里线程的数量。

所以到底是要用多个channel,还是单个channel,这个就是其中一个参考依据。

executor是怎么传进来的

答案:

ConnectionFactory -> AMQConnection -> ChannelManager -> ConsumerWorkService

ConnectionFactory有一个属性是 shareExecutorService ,这个属性表示内部使用共享的唯一一个ExecutorService 设置这个属性就可以一直传到ConsumerWorkService中。

除了ConnectionFactory.setShareExecutorService方法以外, 还可以在Connection被创建时,设置executorService ConnectionFactory的newConnection方法:

public Connection newConnection(ExecutorService executor) throws IOException, TimeoutException;

总结

通过设置shareExecutorService,无论多少个channel,都可以统一控制线程数量、队列数量, 根据实际情况进行配置。

public class RabbitMqUtil {
    public static Channel getChannel() throws Exception{
        //创建一个连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //连接服务器
        factory.setHost("114.***.***.***");
        //用户名
        factory.setUsername("admin");
        //密码
        factory.setPassword("123");
        //创建连接
//        ExecutorService executor = Executors.newFixedThreadPool(1);  设置线程池中的个数,把executor传给newConnection()
        Connection connection = factory.newConnection();
        //获取信道
        Channel channel = connection.createChannel();
        return channel;
    }
}

到此这篇关于关于RabbitMQ的Channel默认线程的文章就介绍到这了,更多相关RabbitMQ的Channel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java处理多API请求的方法详解

    Java处理多API请求的方法详解

    Java 中的并发是指语言并行运行多个线程的能力,允许同时执行多个任务,
    2023-10-10
  • 非常全面的Java异常处理(全文干货,值得收藏)

    非常全面的Java异常处理(全文干货,值得收藏)

    这篇文章主要给大家介绍了非常全面的Java异常处理的相关资料,全文干货,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

    最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

    本章节介绍了如何通过Spring Security实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟了前后分离的适配方案,本章节我们将Spring Security 默认表单进行登录定制到处理逻辑的深度改造,感兴趣的朋友一起看看吧
    2025-03-03
  • java实现选课系统

    java实现选课系统

    这篇文章主要为大家详细介绍了java实现选课系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • java实现时间控制的几种方案

    java实现时间控制的几种方案

    这篇文章主要介绍了java实现时间控制的几种方案,本文从多个方面给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • java使用静态关键字实现单例模式

    java使用静态关键字实现单例模式

    这篇文章主要为大家详细介绍了java使用静态关键字实现单例模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Java中使用Preconditions来检查传入参数介绍

    Java中使用Preconditions来检查传入参数介绍

    这篇文章主要介绍了Java中使用Preconditions来检查传入参数介绍,本文只是作为一个简单的用法介绍,需要的朋友可以参考下
    2015-06-06
  • Java设计模式之备忘录模式(Memento模式)介绍

    Java设计模式之备忘录模式(Memento模式)介绍

    这篇文章主要介绍了Java设计模式之备忘录模式(Memento模式)介绍,memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态,需要的朋友可以参考下
    2015-03-03
  • Java 数据结构与算法系列精讲之数组

    Java 数据结构与算法系列精讲之数组

    数组是有序的元素序列,若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式
    2022-02-02
  • Java更新调度器(update scheduler)的使用详解

    Java更新调度器(update scheduler)的使用详解

    Java更新调度器是Java中的一个特性,可以自动化Java应用程序的更新过程,它提供了一种方便的方式来安排Java应用程序的更新,确保其与最新的功能、错误修复和安全补丁保持同步,本文将深入介绍如何使用Java更新调度器,并解释它对Java开发人员和用户的好处
    2023-11-11

最新评论