JMS制作人和消费者花费了太多时间。为什么?

时间:2016-11-18 08:09:02

标签: java jms activemq

我使用ActiveMQ作为代理和JMS来接收异步。队列中的消息一旦消息进入队列就开始消耗这些消息。 为此,我有书面的制作人和消费者代码。 一切都运行正常,但整个过程花费了大约2-3分钟的时间来处理10000条记录。(我使用了一个循环只是为了模拟) 以下是整个代码:

这是JMS Producer:

public class JmsMessageProducer
{
    public void jmsListener(String obj) throws Exception 
    {
        BrokerService broker = BrokerFactory.createBroker(new URI("broker:(tcp://localhost:61616)"));
        broker.start();
        Connection connection = null;
        Session session = null;
        MessageProducer producer = null;
        try
        {
            long millis = System.currentTimeMillis() % 1000;
            // Producer
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
            connection = connectionFactory.createConnection();
            session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);

            Queue queue = session.createQueue("customerQueue3");

            MessageConsumer consumer = session.createConsumer(queue);
            consumer.setMessageListener(new ConsumerMessageListener("Consumer3"));
            connection.start();

            producer = session.createProducer(queue);

            for(int i=0; i<10000; i++)
            {
                String payload = "Important Task"+i;
                Message msg = session.createTextMessage(payload);



                System.out.println("Sending text '" + payload + "'");

                producer.send(msg);
            }

            long millis2 = System.currentTimeMillis() % 1000;
            long millis3    =   millis2- millis;
            System.out.println("time taken: "+ millis3 );

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

这是听众代码:

public class ConsumerMessageListener implements MessageListener 
{ 
    private String consumerName;

    public ConsumerMessageListener(String consumerName) 
    {
        this.consumerName = consumerName;
    }

    DummyAdapter adapter    =   new DummyAdapter();
    public void onMessage(Message message) 
    {
        TextMessage textMessage = (TextMessage) message;
        try
        {           
            System.out.println(consumerName + " received "+ textMessage.getText());
        //  adapter.dummy(textMessage.getText());
        } 
        catch (JMSException e)
        {
            e.printStackTrace();
        }
    }
}

我是第一次这样做。 谁能告诉我为什么这个过程需要花费太多时间? 我究竟做错了什么?

1 个答案:

答案 0 :(得分:1)

我不确定您期望的SLA,但您的消息Broker正以80消息/秒(大约)的速度工作,这不错。

您的代码的一个问题是session.createProducer(queue)是时滞的问题,因为它是一项代价高昂的操作(需要时间),您可以使用单个生产者对象来生成多条消息。

所以在for循环之外创建MessageProducer,如下所示:

MessageProducer producer = session.createProducer(queue);
for(int i=0; i<10000; i++) {
    String payload = "Important Task"+i;
    Message msg = session.createTextMessage(payload);

   System.out.println("Sending text '" + payload + "'");

   producer.send(msg);
}

close区块中您必须producersessionfinally个对象。

PS:另外,作为旁注,如果您将生产者class的名称命名为JmsMessagePrducer而不是JmsMessageListener,那将是一件好事,因为我们通常将名称命名为{{ 1}}仅适用于Listener个消费者。

<强>更新

  

我只是想知道在80左右处理是好事   消息/秒。?消费后也没有任何操作。如果   消息从队列消耗后添加更多任务,如插入   db或一些业务操作。

在不知道哪个服务器/操作系统/等...(需要考虑许多参数)的情况下,简单地告知80消息/秒更好或50消息/秒更好是不明智的。在性能要求方面,您需要首先指定/定义要求。

如果您当前的代码处理大约80条消息/秒,那么对于给定的条件,这就是您的应用程序(测试程序)基准。因此,如果您认为它不符合您的性能要求,那么您需要配置多个JMS侦听器以并行处理消息并更改您的设计。