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”的池中又创建了两个线程
连接工厂.newConnection(es)
中,es是什么意思?
JavaDocs称“连接上的消费者的执行器线程执行服务”。
在我的示例中,这是否意味着此tcp连接的所有使用者将在最多2个线程中工作
RabbitMQ(或者更确切地说是AMQP)中的每个连接都被视为一个独立的双向数据流。在基于线程的语言中,通常将连接与线程关联,并且不在通道之间共享线程(即“lightwight连接”) 主要原因是上游和下游消息流需要独立的工作人员。这将防止在重载条件下出现滞后,并且背压机制将继续工作,因为客户端将继续交换ack消息 但是,通常情况下,并不需要为每个客户端设置多个连接。让你的图书馆来做这项工作。您可能会担心,因为使用的消息会触发长时间运行的作业,所以在接收到消息时,会通过线程池对其进行多路复用,池中的每个线程都会使用调试器逐行处理一条消息execute main(),并观察线程数目的增加情况