Как я могу объединить каналы в 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);
}
нет необходимости закрывать каналы, так как они будут закрыты вашим приложением при закрытии соединения. Хотя это решение может не подойти вам, если вы сильно создаете новые потоки, так как это выделит много новых каналов, которые никогда не будет закрыт. Но если вы делаете что-то подобное , вы, вероятно, делаете что-то неправильно.