Как я могу объединить каналы в rabbitmq?

Я пытался поделиться соединением между потоками и открыть каналы только при создании потока, но после исследования немного больше, я думаю, что хочу также попробовать connection pooling. Как я могу сделать это на rabbitmq? или это общая идея, которую я могу применить в целом? Моя цель-создать X потоков, а затем им не нужно открывать новые каналы (что требует циклического установления между клиентом и сервером).

поскольку потоки являются их собственным классом, я не уверен, что мне нужно чтобы поместить пул в сам класс, который порождает потоки или куда они идут?У меня также есть несколько типов потоков, которые я хотел бы разделить между этими соединениями(а не только один). Это возможно?

чтобы дать вам общее представление, вот как соединения / каналы estblished в rabbitmq:

ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();  //I want to share several of these between threads

2 ответов


все, что вам нужно-это бассейн Channel объекты, из которых могут вытягиваться ваши потоки.

Apache commons На самом деле уже имеет общий ObjectPool вы можете использовать.

javadoc для интерфейса можно найти здесь: http://commons.apache.org/pool/api-1.6/org/apache/commons/pool/ObjectPool.html

javadoc для одной из их предварительно построенных реализаций можно найти здесь: http://commons.apache.org/pool/api-1.6/org/apache/commons/pool/impl/GenericObjectPool.html

учебник по его использованию можно найти здесь: http://commons.apache.org/pool/examples.html

если это слишком сложно для вас простые потребности, на самом деле все, что вам нужно сделать, это написать класс, который управляет набором Channel объекты, позволяющие потокам проверять их и возвращать в пул, с соответствующей синхронизацией для предотвращения двух нити от получения ахольд того же Channel


вы также можете использовать ThreadLocal объект, если вы используете каналы.

RabbitMq советует вам использовать каналы в потоке, так что это будет идеальное совпадение.

пример кода :

    private final ThreadLocal<Channel> channels = new ThreadLocal<>();
    ...
    Channel channel = channels.get();
     if (channel == null){
            channel = connection.createChannel();
            channels.set(channel);
        }

нет необходимости закрывать каналы, так как они будут закрыты вашим приложением при закрытии соединения. Хотя это решение может не подойти вам, если вы сильно создаете новые потоки, так как это выделит много новых каналов, которые никогда не будет закрыт. Но если вы делаете что-то подобное , вы, вероятно, делаете что-то неправильно.