连接和通道数

时间:2019-06-24 13:39:24

标签: rabbitmq spring-amqp

我是Rabbitmq和Spring的新手。我想知道如何管理连接和通道的数量。

在我的体系结构中,有2个队列,这些队列根据直接交换中的路由密钥从单个生产者发布消息。根据我的理解,我需要一个具有2个通道的单一连接,这将是持久的,并且消息将通过它们发布。我假设这是由Spring自动管理的。但是,每次发布消息时,都会创建一个由单个通道组成的连接。 -如何管理频道和连接?为连接中的每个队列创建单个通道是正确的方法吗?如果队列大小增加到10,则应该在单个连接中使用10个通道?

配置文件:

    <bean id="connectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
        <property name="username" value="test"/>
        <property name="password" value="test"/>
        <property name="host" value="50.16.11.22"/>
        <property name="port" value="5672"/>
    </bean>

<bean id="publisher" class="com.test.code.Publisher">
<constructor-arg ref="amqpTemplate"></constructor-arg>
        </bean>

    <bean id="amqpTemplate" class="org.springframework.amqp.rabbit.core.RabbitTemplate">
    <property name="connectionFactory" ref="connectionFactory"/>
    <property name="mandatory" value="true"></property>
    <property name="exchange" value="x.direct"></property>
    </bean>

    <rabbit:admin connection-factory="connectionFactory" />

    <rabbit:queue name="q.queue1" />    
    <rabbit:queue name="q.queue2" />

    <rabbit:direct-exchange name="x.direct">
        <rabbit:bindings>
            <rabbit:binding queue="q.queue1" key="key1" />
            <rabbit:binding queue="q.queue2" key="key2" />
        </rabbit:bindings>
    </rabbit:direct-exchange>
</beans>

这是我的Publisher类

public class Publisher {

    public Publisher(RabbitTemplate rabbitTemplate) {   
     this.rabbitTemplate = rabbitTemplate;
    }

    public void messageToQueue1(JSONObject message) {

        amqpTemplate.convertAndSend("key1", message.toString());
    }

    public void messageToQueue2(JSONObject message) {
        amqpTemplate.convertAndSend("key2", message.toString());
    }
    }

1 个答案:

答案 0 :(得分:1)

  

但是,每次发布消息都会创建一个由单个通道组成的连接。

那是不对的。每个路由密钥也没有专用的通道。

CachingConnectionFactory维护一个持久连接(默认情况下),并且通道已缓存。

第一次发布会创建一个频道并将其放入缓存中。下一次发布会从缓存中获取它。仅当缓存为空时,才会创建一个新频道(然后您将获得2个缓存的频道)。

您只会同时获得所需的频道。