/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.activemq.console.command; import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.command.ActiveMQDestination; import org.apache.activemq.util.ConsumerThread; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.jms.Connection; import javax.jms.Session; import java.util.List; import java.util.concurrent.CountDownLatch; public class ConsumerCommand extends AbstractCommand { private static final Logger LOG = LoggerFactory.getLogger(ConsumerCommand.class); String brokerUrl = ActiveMQConnectionFactory.DEFAULT_BROKER_URL; String user = ActiveMQConnectionFactory.DEFAULT_USER; String password = ActiveMQConnectionFactory.DEFAULT_PASSWORD; String destination = "queue://TEST"; int messageCount = 1000; int sleep; boolean transacted; private boolean durable; private String clientId; int batchSize = 10; int ackMode = Session.AUTO_ACKNOWLEDGE; int parallelThreads = 1; boolean bytesAsText; @Override protected void runTask(List<String> tokens) throws Exception { LOG.info("Connecting to URL: " + brokerUrl + " as user: " + user); LOG.info("Consuming " + destination); LOG.info("Sleeping between receives " + sleep + " ms"); LOG.info("Running " + parallelThreads + " parallel threads"); ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(brokerUrl); Connection conn = null; try { conn = factory.createConnection(user, password); if (durable && clientId != null && clientId.length() > 0 && !"null".equals(clientId)) { conn.setClientID(clientId); } conn.start(); CountDownLatch active = new CountDownLatch(parallelThreads); for (int i = 1; i <= parallelThreads; i++) { Session sess; if (transacted) { sess = conn.createSession(true, Session.SESSION_TRANSACTED); } else { sess = conn.createSession(false, ackMode); } ConsumerThread consumer = new ConsumerThread(sess, ActiveMQDestination.createDestination(destination, ActiveMQDestination.QUEUE_TYPE)); consumer.setName("consumer-" + i); consumer.setDurable(durable); consumer.setBreakOnNull(false); consumer.setMessageCount(messageCount); consumer.setSleep(sleep); consumer.setBatchSize(batchSize); consumer.setFinished(active); consumer.setBytesAsText(bytesAsText); consumer.start(); } active.await(); } finally { if (conn != null) { conn.close(); } } } public String getBrokerUrl() { return brokerUrl; } public void setBrokerUrl(String brokerUrl) { this.brokerUrl = brokerUrl; } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getDestination() { return destination; } public void setDestination(String destination) { this.destination = destination; } public int getMessageCount() { return messageCount; } public void setMessageCount(int messageCount) { this.messageCount = messageCount; } public int getSleep() { return sleep; } public void setSleep(int sleep) { this.sleep = sleep; } public int getBatchSize() { return batchSize; } public void setBatchSize(int batchSize) { this.batchSize = batchSize; } public int getParallelThreads() { return parallelThreads; } public void setParallelThreads(int parallelThreads) { this.parallelThreads = parallelThreads; } public boolean isBytesAsText() { return bytesAsText; } public void setBytesAsText(boolean bytesAsText) { this.bytesAsText = bytesAsText; } public boolean isTransacted() { return transacted; } public void setTransacted(boolean transacted) { this.transacted = transacted; } public int getAckMode() { return ackMode; } public void setAckMode(String ackMode) { if ("CLIENT_ACKNOWLEDGE".equals(ackMode)) { this.ackMode = Session.CLIENT_ACKNOWLEDGE; } if ("AUTO_ACKNOWLEDGE".equals(ackMode)) { this.ackMode = Session.AUTO_ACKNOWLEDGE; } if ("DUPS_OK_ACKNOWLEDGE".equals(ackMode)) { this.ackMode = Session.DUPS_OK_ACKNOWLEDGE; } } public boolean isDurable() { return durable; } public void setDurable(boolean durable) { this.durable = durable; } public String getClientId() { return clientId; } public void setClientId(String clientId) { this.clientId = clientId; } @Override protected void printHelp() { printHelpFromFile(); } @Override public String getName() { return "consumer"; } @Override public String getOneLineDescription() { return "Receives messages from the broker"; } }