0
votes

I am new to Rabbitmq and Spring. I want to know how to manage the number of connections and channels.

In my architecture there are 2 queues where messages are published from single producer based on routing key on direct exchange. As per my understanding I would need a single connection with 2 channels which will be persistent and messages will be published through them. I assumed this is managed by Spring automatically. But a connection, consisting of single channel, is created every time a message is published. - How do I manage the channels and connections? Is it the right approach to create a single channel for each queue in a connection? If the queue size increases to 10 then 10 channels should be used in a single connection?

Configuration File:

    <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>

This is my Publisher class

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

1 Answers

2
votes

But a connection, consisting of single channel, is created every time a message is published.

That is not true. There is also no dedicated channel for each routing key.

The CachingConnectionFactory maintains a single persistent connection (by default) and channels are cached.

The first publish creates a channel and puts it in the cache. The next publish gets it from the cache. Only if the cache is empty is a new channel created (and then you'll end up with 2 cached channels).

You'll only get as many channels as you need concurrently.