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: */
017:
018: package org.apache.jmeter.protocol.jms.client;
019:
020: import java.util.ArrayList;
021: import java.util.HashMap;
022: import java.util.Iterator;
023:
024: /**
025: * @author pete
026: *
027: * ClientPool holds the client instances in an ArrayList. The main purpose of
028: * this is to make it easier to clean up all the instances at the end of a test.
029: * If we didn't do this, threads might become zombie.
030: */
031: public class ClientPool {
032:
033: private static ArrayList clients = new ArrayList();
034:
035: private static HashMap client_map = new HashMap();
036:
037: /**
038: * Add a ReceiveClient to the ClientPool. This is so that we can make sure
039: * to close all clients and make sure all threads are destroyed.
040: *
041: * @param client
042: */
043: public static void addClient(ReceiveSubscriber client) {
044: clients.add(client);
045: }
046:
047: /**
048: * Add a OnMessageClient to the ClientPool. This is so that we can make sure
049: * to close all clients and make sure all threads are destroyed.
050: *
051: * @param client
052: */
053: public static void addClient(OnMessageSubscriber client) {
054: clients.add(client);
055: }
056:
057: /**
058: * Add a Publisher to the ClientPool. This is so that we can make sure to
059: * close all clients and make sure all threads are destroyed.
060: *
061: * @param client
062: */
063: public static void addClient(Publisher client) {
064: clients.add(client);
065: }
066:
067: /**
068: * Clear all the clients created by either Publish or Subscribe sampler. We
069: * need to do this to make sure all the threads creatd during the test are
070: * destroyed and cleaned up. In some cases, the client provided by the
071: * manufacturer of the JMS server may have bugs and some threads may become
072: * zombie. In those cases, it is not the responsibility of JMeter for those
073: * bugs.
074: */
075: public static void clearClient() {
076: Iterator itr = clients.iterator();
077: while (itr.hasNext()) {
078: Object client = itr.next();
079: if (client instanceof ReceiveSubscriber) {
080: ReceiveSubscriber sub = (ReceiveSubscriber) client;
081: if (sub != null) {
082: sub.close();
083: sub = null;
084: }
085: } else if (client instanceof Publisher) {
086: Publisher pub = (Publisher) client;
087: if (pub != null) {
088: pub.close();
089: pub = null;
090: }
091: } else if (client instanceof OnMessageSubscriber) {
092: OnMessageSubscriber sub = (OnMessageSubscriber) client;
093: if (sub != null) {
094: sub.close();
095: sub = null;
096: }
097: }
098: }
099: clients.clear();
100: client_map.clear();
101: }
102:
103: public static void put(Object key, OnMessageSubscriber client) {
104: client_map.put(key, client);
105: }
106:
107: public static void put(Object key, Publisher client) {
108: client_map.put(key, client);
109: }
110:
111: public static Object get(Object key) {
112: return client_map.get(key);
113: }
114: }
|