java - 在单独线程或同一线程中创建 ActiveMQ 监听器的区别

标签 java multithreading jms activemq

我有以下两种用于 activeMQ 监听器的代码。我原以为情况 2 会更快,但事实并非如此......

情况1:这里我在主函数中创建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 不是应该更快吗,因为它在三个独立的线程上运行?

最佳答案

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

您不需要创建线程来同时从队列中使用。对于您的每一次 session ,您都有一个主题。他们在下面的 URL 中解释了这一点:

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

因此,如果在情况 1 中从同一 session 创建消息监听器,在情况 2 中从不同 session 创建消息监听器,您应该会看到差异。

关于java - 在单独线程或同一线程中创建 ActiveMQ 监听器的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22627685/

相关文章:

javax.naming.NameNotFoundException : ConnectionFactory with Wildfly 9. 0.1.Final

java - Arjuna JTA 事务意外回滚

java - 如何将war文件部署者的第三方类加载到tomcat中

java - 重绘树叶轨迹

java - 防止 EL 访问 session 属性

java - java HashMap中的ConcurrentModificationException程序

Python队列和线程混淆

每次运行时 Java 字符串到字节数组的变化

java - 循环将无法正常执行

android - 手动结束 IntentService 工作线程