Void fetchAndUpdate()

in server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/metric/ActiveMQMetricCollectorImpl.java [126:200]


    Void fetchAndUpdate(ActiveMQMetrics stats) throws JMSException {
        Connection connection = null;
        Session session = null;
        TemporaryQueue replyTo = null;
        MessageConsumer consumer = null;
        MessageProducer producer = null;
        try {
            connection = connectionFactory.createConnection();
            connection.start();
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            replyTo = session.createTemporaryQueue();
            consumer = session.createConsumer(replyTo);

            Queue testQueue = session.createQueue(stats.getName());
            producer = session.createProducer(testQueue);
            Message msg = session.createMessage();
            msg.setJMSReplyTo(replyTo);
            producer.send(msg);

            long timeoutMs = config.getAqmpTimeout().toMillis();
            Message reply = consumer.receive(timeoutMs);
            if (reply == null) {
                throw new JMSException("no message received, timed out after " + timeoutMs + " ms");
            } else if (!(reply instanceof MapMessage)) {
                throw new JMSException("expected MapMessage but got " + reply.getClass());
            }
            stats.updateMetrics((MapMessage)reply);
        } finally {
            if (producer != null) {
                try {
                    producer.close();
                } catch (JMSException e) {
                    // ignore
                }
            }

            if (consumer != null) {
                try {
                    consumer.close();
                } catch (JMSException e) {
                    // ignore
                }
            }

            if (replyTo != null) {
                // we need to delete the temporary queue to be sure we will
                // free up memory if thats not done and a pool is used
                // its possible that we will register a new mbean in jmx for
                // every TemporaryQueue which will never get unregistered
                try {
                    replyTo.delete();
                } catch (JMSException e) {
                    // ignore
                }
            }

            if (session != null) {
                try {
                    session.close();
                } catch (JMSException e) {
                    // ignore
                }
            }

            if (connection != null) {
                try {
                    connection.close();
                } catch (JMSException e) {
                    // ignore
                }
            }
        }
        return null;
    }