Java 以多线程方式浏览Jms队列

Java 以多线程方式浏览Jms队列,java,jms,spring-batch,Java,Jms,Spring Batch,我有一个spring批处理,它浏览队列消息,这个队列应该包含大量消息。然后要花很多时间来治疗他们。因此,我考虑使用多线程来处理这个问题,但我还不清楚 下面是一个不使用多线程浏览队列的示例: import java.net.URISyntaxException; import java.util.Enumeration; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Messa

我有一个spring批处理,它浏览队列消息,这个队列应该包含大量消息。然后要花很多时间来治疗他们。因此,我考虑使用多线程来处理这个问题,但我还不清楚

下面是一个不使用多线程浏览队列的示例:


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();
            }
        }
    }

}

谢谢

除了close方法之外,JMS API资源(如会话、MessageConsumer、QueueBrowser等)不允许由多个控制线程使用,因此,尝试同时迭代从QueueBrowser枚举返回的消息可能会导致错误

JMS规范增加了对会话资源并发性的一些见解

对于可以使用会话对象或其创建的会话对象的线程数没有限制。限制是一个会话的资源不应该被多个线程同时使用。由用户确保满足此并发限制。最简单的方法是使用一个线程。在异步传递的情况下,在停止模式下使用一个线程进行设置,然后启动异步传递。在更复杂的情况下,用户必须提供显式同步


感谢anwser,您是否知道如何在不使用多线程的情况下尽可能缩短浏览大型集合的时间?使用选择器限制您收到的消息?不要在队列中存储大量消息,因为代理不是数据库?我在网上搜索,发现了BlockingQueue共享队列,但我不知道如何在Jms队列浏览器中使用它