有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从队列的挂起消息列表中提取消息时出现java性能问题

队列服务器:ActiveMQ, 协议:AMQP API:ApacheQPID客户端JMS 0.3.0

在正常情况下,它对我来说工作正常,可以在几毫秒内获取消息

在以下场景中面临问题:

  1. 假设队列名称:TESTQUEUE
  2. 它在队列中有500条带有JMSCorrelationID的挂起消息
  3. 使用qpid API获取带有JMSCOrrationId的消息

检索消息大约需要25秒

在这种情况下我该怎么办

    // LOGIC: declaration
    Connection connection = null;
    MessageConsumer consumer = null;
    MetaData objMetaData = new MetaData();
    String strReturnData = "";
    String user = "";
    String password = "";
    String host = "";
    int port = 0;
    ConnectionFactoryImpl factory = null;
    Session session = null;
    Destination destination = null;
    Message msg = null;

    try {

        // LOGIC: set the connection details
        user = objMetaData.getMetaData(CommonConstant.QUEUE_USERNAME);
        password = objMetaData.getMetaData(CommonConstant.QUEUE_PASSWORD);
        host = objMetaData.getMetaData(CommonConstant.QUEUE_HOST);
        port = Integer.parseInt(objMetaData.getMetaData(
                CommonConstant.QUEUE_PORT).trim());

        // LOGIC: Initialize the connection factory with connection details
        factory = new ConnectionFactoryImpl(host, port, user, password, strCorelationId);

        // LOGIC: create connection
        connection = factory.createConnection();

        // LOGIC: create session
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        // LOGIC: initialize destination with queue name
        destination = (Destination) session.createQueue(strQueueName);

        // LOGIC: open connection
        connection.start();

        // LOGIC: set correlation id
        consumer = session
                .createConsumer(
                        destination,"JMSCorrelationID ='"+ strCorelationId + "'");

        // LOGIC: get message
        if (blnIsRequestModeSync) {
            msg = consumer.receive((1000 * 60 * 2));
        } else {
            msg = consumer.receive(30000);
        }

        // LOGIC: check message type
        if (msg instanceof TextMessage) {

            // LOGIC: when text message
            TextMessage txtmsg = (TextMessage) msg;
            //System.out.println("TEXT MSG: " + txtmsg.getText());
            strReturnData = txtmsg.getText();
        } else {
            // LOGIC: when object message
            ObjectMessage objmsg = (ObjectMessage) msg;
            //System.out.println("Object  MSG:" + objmsg);
            strReturnData = (null != objmsg ? objmsg.toString() : "");
        }

共 (1) 个答案

  1. # 1 楼答案

    没有足够的信息给你一个明确的答案,但这里有几件事可能在起作用

    第一种情况是,队列中有多个使用者,消息将根据它们到达的时间预取给它们,这样第一个使用者将保留第二个使用者感兴趣的消息等。您可以尝试减少客户端上的预取,以排除这种情况

    第二,队列深度足够大,以至于客户端感兴趣的消息深入到ActiveMQ用于在内存中保存消息的默认页面大小的队列中,这意味着客户端将无法接收其消息,直到其他消费者提取足够多的消息,使慢客户端成为慢客户端对内存感兴趣,可供选择。您可以在per-destination的基础上调整ActiveMQ使用的页面大小。但是,您应该考虑自己警告,在深度队列中的选择器是消息传递反模式,并且容易出现这些类型的麻烦。p>