java rabbitmq库中的多线程

java rabbitmq库中的多线程,java,multithreading,rabbitmq,Java,Multithreading,Rabbitmq,当我运行此代码时: public static void main(String[] args) throws IOException, TimeoutException { MainRabbit main = new MainRabbit(); for (int i = 0; i < 5; i++) { Connection connection = main.createConnection(); Cha

当我运行此代码时:

public static void main(String[] args) throws IOException, TimeoutException {
        MainRabbit main = new MainRabbit();

        for (int i = 0; i < 5; i++) {
            Connection connection = main.createConnection();
            Channel channel = connection.createChannel();
            channel.basicConsume("queueName", new CustomConsumer());
        }

    }


    private ExecutorService es = Executors.newFixedThreadPool(2);

    private ConnectionFactory connectionFactory = createConnectionFactory();

    private ConnectionFactory createConnectionFactory() {
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("localhost");
        return connectionFactory;
    }

    private Connection createConnection() throws IOException, TimeoutException {
        return connectionFactory.newConnection(es);
    }
publicstaticvoidmain(字符串[]args)抛出IOException、TimeoutException{
MainRabbit main=新的MainRabbit();
对于(int i=0;i<5;i++){
连接=main.createConnection();
Channel=connection.createChannel();
channel.basicConsume(“queueName”,new CustomConsumer());
}
}
私有ExecutorService es=Executors.newFixedThreadPool(2);
私有ConnectionFactory ConnectionFactory=createConnectionFactory();
私有连接工厂createConnectionFactory(){
ConnectionFactory ConnectionFactory=新的ConnectionFactory();
setHost(“localhost”);
返回连接工厂;
}
私有连接createConnection()引发IOException、TimeoutException{
返回connectionFactory.newConnection(es);
}
我看到,对于到rabbitmq的每个tcp连接,我有两个单独的线程。在下面的屏幕截图中,这是AMQP连接线程和池中名为“pool-2”的线程

此外,因为我在ExecutorsService中指定了值2,所以在名为“pool-1”的池中又创建了两个线程

  • “泳池2”是从哪里来的

  • 连接工厂.newConnection(es)
    中,es是什么意思? JavaDocs称“连接上的消费者的执行器线程执行服务”。 在我的示例中,这是否意味着此tcp连接的所有使用者将在最多2个线程中工作

  • 如何开始同时在多个线程中处理传入消息,以便(例如)并行处理来自同一队列的10条不同消息


  • RabbitMQ(或者更确切地说是AMQP)中的每个连接都被视为一个独立的双向数据流。在基于线程的语言中,通常将连接与线程关联,并且不在通道之间共享线程(即“lightwight连接”)

    主要原因是上游和下游消息流需要独立的工作人员。这将防止在重载条件下出现滞后,并且背压机制将继续工作,因为客户端将继续交换ack消息

    但是,通常情况下,并不需要为每个客户端设置多个连接。让你的图书馆来做这项工作。您可能会担心,因为使用的消息会触发长时间运行的作业,所以在接收到消息时,会通过线程池对其进行多路复用,池中的每个线程都会使用调试器逐行处理一条消息

    execute main(),并观察线程数目的增加情况