【问题标题】:Difference in creating ActiveMQ listeners in separate threads or in a same thread在单独的线程或在同一线程中创建 ActiveMQ 侦听器的区别
【发布时间】:2014-05-02 21:20:01
【问题描述】:

我有以下两个用于 activeMQ 侦听器的代码案例。我期待案例 2 更快,但事实并非如此......

案例1:这里我在main函数中创建了多个activemq的监听器

public class FileReceiver {


    public static void main(String[] args) {
         List<MessageReceiver> messageReceiverList = new ArrayList<MessageReceiver>();

         MessageReceiver msgReceiver1 = new MessageReceiver();
         messageReceiverList.add(msgReceiver1);
         msgReceiver1.run();

         MessageReceiver msgReceiver2 = new MessageReceiver();
         messageReceiverList.add(msgReceiver2);
         msgReceiver2.run();

         MessageReceiver msgReceiver3 = new MessageReceiver();
         messageReceiverList.add(msgReceiver3);
         msgReceiver3.run();

    }
}

案例2:这里我在多个线程中创建多个activemq的监听器

public class FileReceiver {


    public static void main(String[] args) {
         List<MessageReceiver> messageReceiverList = new ArrayList<MessageReceiver>();


         for(int i = 0 ; i < 3 ; i++) {
             MessageReceiver msgReceiver = new MessageReceiver();
             Thread thread = new Thread(msgReceiver);
             thread.start();
             messageReceiverList.add(msgReceiver);
             System.out.println("Listener " + i + " started.");
         }

    }
}

这是我正在使用的 MessageReceiver 类...

class MessageReceiver implements Runnable,MessageListener {

    private int numMsgsReceived = 0;

    private void start() {
        try {
            ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
                    "tcp://localhost:61616");
            Connection connection = connectionFactory.createConnection();
            connection.start();
            ActiveMQSession session = (ActiveMQSession) connection
                    .createSession(false, Session.AUTO_ACKNOWLEDGE);
            Destination ftQueue = session.createQueue("TEMP.DEST");
            MessageConsumer consumer = session.createConsumer(ftQueue);
            consumer.setMessageListener(this);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void onMessage(Message msg) {
        incNumMsgsReceived();
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void run() {
        start();

    }
}

在这两种情况下,我每秒只能接收 30 条消息。 情况 2 不应该更快,因为它在三个单独的线程上运行吗?

【问题讨论】:

    标签: java multithreading jms activemq


    【解决方案1】:

    实际上,您正在使用 3 个不同的连接/会话来创建 3 个 MessageListener,因此您同时在案例 1 和案例 2 中使用消息。这就是您看到相同吞吐量的原因。

    您不需要创建线程来同时从队列中消费。对于每个会话,您都有一个线程。他们在以下 URL 中对此进行了解释:

    http://activemq.apache.org/multiple-consumers-on-a-queue.html

    因此,如果您在案例 1 中从同一会话创建消息侦听器,在案例 2 中从不同会话创建消息侦听器,您应该会看到差异。

    【讨论】:

      【解决方案2】:

      MessageListener onMessage 是从创建消费者的 Session 内的调度线程的上下文中调用的。创建多少线程并不重要,因为实际调用 onMessage 调用的线程总是相同的。在您的情况下,额外的线程不会为您做任何实际工作,因为消息继续来自相同的三个 Connection / Session 实例,因此您有三个会话线程在任何一种情况下调度相同的消息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多