繁体   English   中英

以多线程方式浏览Jms队列

[英]Browse Jms Queue in a multiThreading way

我有一个浏览批消息的spring-batch,该队列应该包含大量消息。 那么要花费很多时间来治疗所有这些。 因此,我考虑过使用多线程来解决该问题,但目前还不清楚。

这是不使用多线程浏览队列的示例:


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资源(例如Session,MessageConsumer,QueueBrowser等)并不意味着只能由单个控制线程使用,因此尝试并发迭代QueueBrowser枚举返回的消息很可能会导致是错误。

JMS规范为会话资源的并发添加了一些见识。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM