Package org.activemq.sampler

Source Code of org.activemq.sampler.Consumer

/**
*
* Copyright 2004 Protique Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**/
package org.activemq.sampler;

import org.activemq.util.IdGenerator;
import org.activemq.util.connection.ServerConnectionFactory;
import org.apache.jmeter.samplers.Entry;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;

import org.mr.MantaAgent;

import javax.jms.Connection;
import javax.jms.Session;
import javax.jms.JMSException;
import javax.jms.Topic;
import javax.jms.Queue;
import javax.jms.TopicSession;
import javax.jms.QueueSession;
import javax.jms.Destination;
import javax.jms.MessageListener;
import javax.jms.QueueReceiver;
import javax.jms.MessageConsumer;
import javax.jms.Message;
import javax.jms.TextMessage;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

public class Consumer extends Sampler implements MessageListener {

    public static int counter;

    private static final Logger log = LoggingManager.getLoggerForClass();

    // Otherwise, the response is scanned for these strings
    private static final String STATUS_PREFIX = JMeterUtils.getPropDefault("tcp.status.prefix", "");
    private static final String STATUS_SUFFIX = JMeterUtils.getPropDefault("tcp.status.suffix", "");

    private static final String STATUS_PROPERTIES = JMeterUtils.getPropDefault("tcp.status.properties", "");
    private static final Properties statusProps = new Properties();

    private int batchCounter = 0;

    static {
        log.info("Protocol Handler name=" + getClassname());
        log.info("Status prefix=" + STATUS_PREFIX);
        log.info("Status suffix=" + STATUS_SUFFIX);
        log.info("Status properties=" + STATUS_PROPERTIES);

        if (STATUS_PROPERTIES.length() > 0) {
            File f = new File(STATUS_PROPERTIES);

            try {
                statusProps.load(new FileInputStream(f));
                log.info("Successfully loaded properties");
            } catch (FileNotFoundException e) {
                log.error("Property file not found");
            } catch (IOException e) {
                log.error("Property file error " + e.toString());
            }
        }
    }

    /**
     * Constructor for ConsumerSampler object.
     */
    public Consumer() {
        log.debug("Created " + this);
        protocolHandler = getProtocol();
        log.debug("Using Protocol Handler: " + protocolHandler.getClass().getName());
    }

    /**
     * Increments the int variable.
     *
     * @param count - variable incremented.
     */
    private synchronized void count(int count) {
        counter += count;
    }

    /**
     * @return the current number of messages sent.
     */
    public static synchronized int resetCount() {
        int answer = counter;
        counter = 0;
        return answer;
    }


    /**
     * Subscribes the subject.
     *
     * @throws JMSException
     */
    protected void subscribe() throws JMSException {
        for (int i = 0; i < getNoConsumer(); i++) {
            String subject = subjects[i % getNoSubject()];
            subscribe(subject);
        }
    }

    /**
     * Subscribes the message.
     *
     * @param subject - subject to be subscribed.
     * @throws JMSException
     */
    protected void subscribe(String subject) throws JMSException {
        Connection connection = ServerConnectionFactory.createConnectionFactory(this.getURL(),
                                                                                this.getMQServer(),
                                                                                this.getTopic(),
                                                                                this.getEmbeddedBroker());

        if (this.getDurable()) {
            if ((ServerConnectionFactory.JORAM_SERVER.equals(this.getMQServer())) ||
                (ServerConnectionFactory.MANTARAY_SERVER.equals(this.getMQServer()))) {
                //Id set by server

            } else {
                IdGenerator idGenerator = new IdGenerator();
                connection.setClientID(idGenerator.generateId());
            }
        }

        //start connection before receiving messages.
        connection.start();

        Session session = ServerConnectionFactory.createSession(connection,
                                                                this.getTransacted(),
                                                                this.getMQServer(),
                                                                this.getTopic());

        Destination destination = ServerConnectionFactory.createDestination(session,
                                                                            subject,
                                                                            this.getURL(),
                                                                            this.getMQServer(),
                                                                            this.getTopic());

        MessageConsumer consumer = null;

        if (ServerConnectionFactory.OPENJMS_SERVER.equals(this.getMQServer())) {
            if (this.getTopic()) {
                Topic topic = (Topic) destination;

                if (this.getDurable()) {
                    consumer = ((TopicSession) session).createDurableSubscriber(topic,
                                   getClass().getName());
                } else {
                    consumer = ((TopicSession) session).createSubscriber(topic);
                }

            } else {
                Queue queue = ((QueueSession) session).createQueue(subject);
                QueueReceiver receiver = ((QueueSession) session).createReceiver(queue);
                consumer = (MessageConsumer) receiver;
            }
        } else if (ServerConnectionFactory.MANTARAY_SERVER.equals(this.getMQServer())) {
            if (this.getTopic()) {
                Topic topic = (Topic) destination;

                if (this.getDurable()) {
                    consumer = ((TopicSession) session).createDurableSubscriber(topic,
                                   MantaAgent.getInstance().getAgentName());
                } else {
                    consumer = ((TopicSession) session).createSubscriber(topic);
                }

            } else {
                Queue queue = ((QueueSession) session).createQueue(subject);
                QueueReceiver receiver = ((QueueSession) session).createReceiver(queue);
                consumer = (MessageConsumer) receiver;
            }
        } else {
            if (this.getDurable() && this.getTopic()) {
                consumer = session.createDurableSubscriber((Topic) destination, getClass().getName());
            } else {
                consumer = session.createConsumer(destination);
            }
        }

        this.setSession(session);
        consumer.setMessageListener(this);
        addResource(consumer);
    }

    /**
     *  Processes the received message.
     *
     * @param message - message received by the listener.
     */
    public void onMessage(Message message) {
        try {
            TextMessage textMessage = (TextMessage) message;
            Session session;

            // lets force the content to be deserialized
            String text = textMessage.getText();
            count(1);

            if (this.getTransacted()) {
                batchCounter++;
                if (batchCounter == this.getBatchSize()) {
                    batchCounter = 0;
                    session = this.getSession();
                    session.commit();
                }
            }
        } catch (JMSException e) {
            log.error("Unable to force deserialize the content ", e);
        }
    }

    /**
     * Runs and subscribes to messages.
     *
     * @throws JMSException
     */
    public void run() throws JMSException {
        start();
        subscribe();
    }

    /**
     * Retrieves the sample as SampleResult object. There are times that this
     * is ignored.
     *
     * @param e - Entry object.
     * @return Returns the sample result.
     */
    public SampleResult sample(Entry e) {// Entry tends to be ignored ...
        SampleResult res = new SampleResult();
        res.setSampleLabel(getName());
        res.setSamplerData(getURL());
        res.sampleStart();

        try {
            this.run();
        } catch (JMSException ex) {
            log.error("Error running consumer ", ex);
            res.setResponseCode("500");
            res.setResponseMessage(ex.toString());
        }

        //Calculate response time
        res.sampleEnd();

        // Set if we were successful or not
        res.setSuccessful(true);

        return res;
    }

    /**
     * Starts an instance of the Consumer tool.
     */
    public static void main(String args[]) {
        System.out.println("##########################################");
        System.out.println(" Consumer * start *");
        System.out.println("##########################################");

        Consumer cons = new Consumer();

        if (args.length == 0) {
            displayToolParameters();
        }

        if (args.length > 0) {
            String mqServer = args[0];

            if (mqServer.equalsIgnoreCase("SONICMQ")) {
                cons.setMQServer(ServerConnectionFactory.SONICMQ_SERVER);
            } else if (mqServer.equalsIgnoreCase("TIBCOMQ")) {
                cons.setMQServer(ServerConnectionFactory.TIBCOMQ_SERVER);
            } else if (mqServer.equalsIgnoreCase("JBOSSMQ")) {
                cons.setMQServer(ServerConnectionFactory.JBOSSMQ_SERVER);
            } else if (mqServer.equalsIgnoreCase("OPENJMS")) {
                cons.setMQServer(ServerConnectionFactory.OPENJMS_SERVER);
            } else if (mqServer.equalsIgnoreCase("JORAM")) {
                cons.setMQServer(ServerConnectionFactory.JORAM_SERVER);
            } else if (mqServer.equalsIgnoreCase("MANTARAY")) {
                cons.setMQServer(ServerConnectionFactory.MANTARAY_SERVER);
            } else if (mqServer.equalsIgnoreCase("ACTIVEMQ")) {
                //Run with the default broker
            } else {
                System.out.print("Please enter a valid mq server: [ ");
                System.out.print("SONICMQ | ");
                System.out.print("TIBCOMQ | ");
                System.out.print("JBOSSMQ | ");
                System.out.print("OPENJMS | ");
                System.out.print("JORAM | ");
                System.out.print("MANTARAY |");
                System.out.println("ACTIVEMQ ]");
                return;
            }

        }

        if (args.length > 1) {
            cons.setURL(args[1]);
        }

        if (args.length > 2) {
            cons.setDuration(args[2]);
        }

        if (args.length > 3) {
            cons.setRampUp(args[3]);
        }

        if (args.length > 4) {
            cons.setNoConsumer(args[4]);
        }

        if (args.length > 5) {
            cons.setNoSubject(args[5]);
        }

        if (args.length > 6) {
            cons.setDurable(args[6]);
        }

        if (args.length > 7) {
            cons.setTopic(args[7]);
        }

        if (args.length > 8) {
            cons.setTransacted(args[8]);

            if (cons.getTransacted()) {
                if (args.length > 9) {
                    cons.setBatchSize(args[9]);
                } else {
                    displayToolParameters();
                    System.out.println("Please specify the batch size.");
                    return;
                }
            }
        }
        System.out.println("Runnning Consumer tool with the following parameters:");
        System.out.println("Server=" + cons.getMQServer());
        System.out.println("URL=" + cons.getURL());
        System.out.println("Duration=" + cons.getDuration());
        System.out.println("Ramp up=" + cons.getRampUp());
        System.out.println("No consumer=" + cons.getNoConsumer());
        System.out.println("No Subject=" + cons.getNoSubject());
        System.out.println("Is Durable=" + cons.getDurable());
        System.out.println("Is Topic=" + cons.getTopic());
        System.out.println("Is Transacted=" + cons.getTransacted());
        System.out.println("Batch size=" + cons.getBatchSize());

        try {
            cons.run();
        } catch (Exception e) {
            System.out.println("Excception e=" + e);

        }

        System.out.println("##########################################");
        System.out.println(" Consumer * end *");
        System.out.println("##########################################");

    }

    /**
     * Prints to the console the Consumer tool parameters.
     */
    private static void displayToolParameters() {
        System.out.println(" Consumer tool usage: ");
        System.out.print("[Message Queue Server] ");
        System.out.print("[URL] ");
        System.out.print("[Duration] ");
        System.out.print("[Ramp up] ");
        System.out.print("[No. of consumer] ");
        System.out.print("[No. of subject] ");
        System.out.print("[Delivery mode] ");
        System.out.print("[Is topic] ");
        System.out.print("[Is transacted] ");
        System.out.print("[Batch size] ");
    }
}
TOP

Related Classes of org.activemq.sampler.Consumer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.