создать список очереди activemq

мой существующий код, который использует BlockingQueue, создает список BlockingQueue (например, частные очереди List>;), в который я могу помещать сообщения для обработки. Однако из-за проблем с сохранением мы планируем перейти на activemq. Может ли кто-нибудь помочь мне, если мы сможем получить список очереди activemq (в программе Java, а не из файла конфигурации). Я знаю, что могу использовать createQueue в сеансе для создания одного экземпляра очереди, но мне нужен список очереди, как это сделано для BlockingQueue.

Любая помощь приветствуется.


person Manglesh    schedule 24.12.2012    source источник


Ответы (2)


Чтобы создать список очередей, вы должны создать этот список, а затем создать каждую очередь отдельно из объекта сеанса.

Queue q = session.createQueue("someQueueName")

Однако на самом деле это не «создает» очередь в этом смысле, поскольку очередь является постоянной «вещью» в процессе/сервере ActiveMQ. Это создаст только ссылку на очередь ActiveMQ с идентификатором/именем.

Я не уверен, зачем вам сразу десять очередей. Как правило, у вас есть одна очередь для каждого типа события или варианта использования (или аналогичного), а затем вы используете одновременных потребителей для параллельной обработки.

Но, конечно, вы всегда можете сделать что-то подобное с помощью простого цикла for, создавая одну очередь за раз и присоединяя их к массиву. Обратите внимание, что вы не можете получить безопасные очереди только с Event объектами в них.

Однако вы можете отправлять ObjectMessage с событиями. Просто создайте один:

Event event = createEvent(..); // Given "Event" is serializable (need to be able to persist it).
Message m = session.createObjectMessage(event);
// Send message as usual in ActiveMQ.

Возможно, вам нужно переосмыслить одну или несколько вещей в вашем коде при преобразовании из BlockingQueues в постоянные очереди ActiveMQ.

person Petter Nordlander    schedule 28.12.2012

Вы можете получить список доступных очередей, используя DestinationSource из вашего соединения.

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
ActiveMQConnection connection = (ActiveMQConnection)connectionFactory.createConnection();
DestinationSource ds = connection.getDestinationSource();
Set<ActiveMQQueue> queues = ds.getQueues();

редактировать: чтобы создать очередь, взгляните на пример ActiveMQ Hello world ссылка Что делает код создается подключение к activeMQ-брокеру, встроенному в jvm

// Create a ConnectionFactory
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost");

// Create a Connection
Connection connection = connectionFactory.createConnection();
connection.start();

// Create a Session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

// Create the destination (Topic or Queue)
Destination destination = session.createQueue("TEST.FOO");

Что может быть неочевидно в приведенном выше коде, так это то, что строка:

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost");

не только установит соединение с брокером, но и внедрит брокера внутри соединения, если его еще нет. Объяснение внизу этой страницы

Эту функцию можно отключить с помощью (вам нужен брокер, но если вы хотите настроить его по-другому):

ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("vm://localhost?create=false");

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

person Aksel Willgert    schedule 24.12.2012
comment
Большое спасибо за ответ. Я имел в виду создание списка очередей типа List‹BlockingQueue‹Event›› queues = new ArrayList‹BlockingQueue‹Event››(10); который создаст список из 10 блокирующих очередей. можно ли сделать то же самое для activemq (создав список из 10 очередей activemq)? - person Manglesh; 27.12.2012
comment
на объекте подключения у вас есть несколько методов для создания очередей в вашем брокере. Я добавлю несколько примеров сегодня вечером, если вы не поняли это к тому времени (пока не могу кодировать с телефона :)) - person Aksel Willgert; 27.12.2012
comment
Большое спасибо, Аксель, за ваш ответ, однако я не уверен, что приведенный выше код дает мне возможность создать список очередей activemq. Как я уже упоминал, при использовании BlockingQueue я создал список очередей со следующим кодом: List‹BlockingQueue‹Event›› queues = new ArrayList‹BlockingQueue‹Event››(10); который создал список из 10 BlockingQueues. Мне было интересно, могу ли я создать список из 10 (или любого числа) activemq таким же образом. Я хочу, чтобы несколько очередей обрабатывали мое событие, а не обрабатывали мои события только с одной очередью. - person Manglesh; 28.12.2012
comment
В ActiveMQ вам нужно иметь несколько потребителей, которые потребляют сообщения из очереди, но у вас должна быть только одна очередь, если я правильно понимаю ваш сценарий. - person Aksel Willgert; 28.12.2012
comment
согласен, но что, если я хочу создать отдельную очередь для каждого типа потребителей. скажем, для потребителя type1, очереди 1 и так далее... в этом случае мне придется создать более одной очереди. одна вещь, которую я могу сделать, это создать более одной очереди в цикле for, но я не уверен, как я могу это сделать. Спасибо за вашу помощь и терпение - person Manglesh; 28.12.2012