001/**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.activemq.tool.properties;
018
019import java.util.HashMap;
020import java.util.Map;
021import java.util.Set;
022
023import org.slf4j.Logger;
024import org.slf4j.LoggerFactory;
025
026public class JmsProducerProperties extends JmsClientProperties {
027
028    private static final Logger LOG = LoggerFactory.getLogger(ReflectionUtil.class);
029
030    public static final String TIME_BASED_SENDING  = "time"; // Produce messages base on a time interval
031    public static final String COUNT_BASED_SENDING = "count"; // Produce a specific count of messages
032    public static final String DELIVERY_MODE_PERSISTENT     = "persistent"; // Persistent message delivery
033    public static final String DELIVERY_MODE_NON_PERSISTENT = "nonpersistent"; // Non-persistent message delivery
034
035    protected String deliveryMode = DELIVERY_MODE_NON_PERSISTENT; // Message delivery mode
036    protected int messageSize = 1024; // Send 1kb messages by default
037    protected long sendCount  = 1000000; // Send a million messages by default
038    protected long sendDuration = 5 * 60 * 1000; // Send for 5 mins by default
039    protected String sendType = TIME_BASED_SENDING;
040    protected long sendDelay = 0;  // delay in milliseconds between each producer send
041    protected String msgFileName = null; // for sending a particular msg from a file
042
043    protected Map<String,Object> headerMap = null;
044
045
046    // If true, create a different message on each send, otherwise reuse.
047    protected boolean createNewMsg;
048
049    public JmsProducerProperties() {
050        this.headerMap = new HashMap<String, Object>();
051    }
052
053    public String getDeliveryMode() {
054        return deliveryMode;
055    }
056
057    public void setDeliveryMode(String deliveryMode) {
058        this.deliveryMode = deliveryMode;
059    }
060
061    public int getMessageSize() {
062        return messageSize;
063    }
064
065    public void setMessageSize(int messageSize) {
066        this.messageSize = messageSize;
067    }
068
069    public long getSendCount() {
070        return sendCount;
071    }
072
073    public void setSendCount(long sendCount) {
074        this.sendCount = sendCount;
075    }
076
077    public long getSendDuration() {
078        return sendDuration;
079    }
080
081    public void setSendDuration(long sendDuration) {
082        this.sendDuration = sendDuration;
083    }
084
085    public String getSendType() {
086        return sendType;
087    }
088
089    public void setSendType(String sendType) {
090        this.sendType = sendType;
091    }
092
093    public boolean isCreateNewMsg() {
094        return createNewMsg;
095    }
096
097    public void setCreateNewMsg(boolean createNewMsg) {
098        this.createNewMsg = createNewMsg;
099    }
100
101    public void setSendDelay(long delay) {
102        this.sendDelay = delay;
103    }
104
105    public long getSendDelay() {
106        return this.sendDelay;
107    }
108
109
110    /* Operations for supporting message headers */
111
112    /**
113     * Method for setting a message header.
114     * @param encodedHeader - the header is encoded as a string using this syntax:
115     * encodedHeader = [headerkey '=' headervalue ':' ]*
116     * E.g. an encodedHeader could read "JMSType=car", or
117     * "JMSType=car:MyHeader=MyValue"
118     *
119     * That implies neither the header key nor the value
120     * can contain any of the characters ':' and '='.
121     */
122    public void setHeader(String encodedHeader) {
123
124        // remove any trailing ':' characters
125        if (encodedHeader.endsWith(":")) {
126            encodedHeader = encodedHeader.substring(0, encodedHeader.length()-1);
127        }
128
129        // split headers
130        String headers[] = encodedHeader.split(":");
131        for (String h : headers) {
132
133            // split into header name and value
134            String tokens[] = h.split("=");
135
136            // sanity check, don't allow empty string for header names
137            if (tokens.length != 2 || tokens[0].equals("") || tokens[1].equals("") ) {
138                LOG.error("Error parsing message headers. Header: \"" + h +
139                        "\". This header will be ignored.");
140            } else {
141                this.headerMap.put(tokens[0], tokens[1]);
142            }
143        }
144    }
145
146    public Set<String> getHeaderKeys() {
147        return this.headerMap.keySet();
148    }
149
150    public Object getHeaderValue(String key) {
151        return this.headerMap.get(key);
152    }
153
154    public void clearHeaders() {
155        this.headerMap.clear();
156    }
157
158    public void setMsgFileName(String file) {
159        LOG.info("\"producer.msgFileName\" specified. " +
160                "Will ignore setting \"producer.messageSize\".");
161        this.msgFileName = file;
162    }
163
164    public String getMsgFileName() {
165        return this.msgFileName;
166    }
167
168}