Просматривайте Jms Queue в многопоточном режиме - PullRequest
0 голосов
/ 01 июля 2019

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

Вот пример просмотра очереди без многопоточности:


import java.net.URISyntaxException;
import java.util.Enumeration;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueBrowser;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;

public class JmsQueueBrowseExample {
    public static void main(String[] args) throws URISyntaxException, Exception {
        Connection connection = null;
        try {
            // Producer
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
                    "tcp://localhost:61616");
            connection = connectionFactory.createConnection();
            Session session = connection.createSession(false,
                    Session.AUTO_ACKNOWLEDGE);
            Queue queue = session.createQueue("browseQueue");
            MessageConsumer consumer = session.createConsumer(queue);
            connection.start();

            System.out.println("Browse through the elements in queue");
            QueueBrowser browser = session.createBrowser(queue);
            Enumeration e = browser.getEnumeration();
            //Multithreading here
            while (e.hasMoreElements()) {
                TextMessage message = (TextMessage) e.nextElement();
                System.out.println("Browse [" + message.getText() + "]");
            }
            System.out.println("Done");
            browser.close();

            session.close();
        } finally {
            if (connection != null) {
                connection.close();
            }
        }
    }

}

Спасибо

1 Ответ

1 голос
/ 01 июля 2019

Кроме методов close ресурсы JMS API, такие как Session, MessageConsumer, QueueBrowser и т. Д., Не предназначены для использования более чем одним потоком элементов управления, поэтому попытка одновременно выполнить итерацию по сообщениям, возвращенным перечислением QueueBrowser,Вероятно, это приведет к ошибкам.

Спецификация JMS добавляет некоторое понимание параллелизма с ресурсами сеанса.

Нет ограничений на количество потоков, которые могут использовать объект Session или те, которые он создает.Ограничение состоит в том, что ресурсы сеанса не должны использоваться одновременно несколькими потоками.Пользователь должен убедиться, что это ограничение параллелизма выполнено.Самый простой способ сделать это - использовать один поток.В случае асинхронной доставки используйте один поток для установки в режиме остановки, а затем запустите асинхронную доставку.В более сложных случаях пользователь должен обеспечить явную синхронизацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...