Вопрос по java, multithreading – Как я могу объединить каналы в rabbitmq?

8

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

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

Просто чтобы дать вам общее представление, вот как соединения / каналы создаются в 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   ответа
3

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

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

Образец кода :

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

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

6

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

Общие Apache на самом деле уже имеет общий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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Lostsoul
Error: User Rate Limit ExceededChannelError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Lostsoul

Похожие вопросы