001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package org.jboss.test.threading.mbean;
023:
024: import javax.naming.InitialContext;
025: import org.jboss.test.threading.interfaces.EJBThreads;
026: import org.jboss.test.threading.interfaces.EJBThreadsHome;
027: import java.rmi.RemoteException;
028:
029: import java.util.Random;
030:
031: /**
032: * This test is there to make sure that the multithreaded version doesn't lock the container
033: * It works in VM and spawns many threads that will ping the server.
034: *
035: * @see <related>
036: * @author <a href="mailto:marc@jboss.org">Marc Fleury</a>
037: * @version $Revision: 57211 $
038: *
039: * Revisions:
040: *
041: * 20010524 marc fleury: Initial version
042: */
043:
044: public class Threads implements ThreadsMBean {
045: org.apache.log4j.Category log = org.apache.log4j.Category
046: .getInstance(getClass());
047:
048: // Constants -----------------------------------------------------
049:
050: // Attributes ----------------------------------------------------
051:
052: private int numberOfThreads = 0;
053: private int loops = 10;
054: private long wait = 100;
055: public boolean runMe = true;
056: private Random random = new Random();
057: private Runnable test;
058: private int threadsFinished = 0;
059:
060: // Static --------------------------------------------------------
061:
062: // Constructors --------------------------------------------------
063:
064: // Public --------------------------------------------------------
065:
066: public void setWait(long wait) {
067: this .wait = wait;
068: }
069:
070: public long getWait() {
071: return wait;
072: }
073:
074: public void setLoops(int loops) {
075: this .loops = loops;
076: }
077:
078: public int getLoops() {
079: return loops;
080: }
081:
082: public void setNumberOfThreads(int numberOfThreads) {
083: if (this .numberOfThreads > 0)
084: stopMe();
085:
086: this .numberOfThreads = numberOfThreads;
087: //restart
088: try {
089:
090: if (numberOfThreads > 0)
091: startMe();
092: } catch (Exception e) {
093: log.debug("failed", e);
094: }
095: }
096:
097: public int getNumberOfThreads() {
098: return numberOfThreads;
099: }
100:
101: public void startMe() throws Exception {
102: runMe = true;
103: threadsFinished = 0;
104: if (numberOfThreads > 0) {
105:
106: for (int i = 0; i < numberOfThreads; i++) {
107: Thread t = new Thread(new Test());
108: log.debug("started new thread " + t.hashCode());
109:
110: t.start();
111:
112: }
113: ;
114: }
115: }
116:
117: public void stopMe() {
118: log.debug("Stop called");
119: runMe = false;
120: };
121:
122: public class Test implements Runnable {
123:
124: public void run() {
125:
126: try {
127:
128: InitialContext ic = new InitialContext();
129:
130: EJBThreadsHome testHome = (EJBThreadsHome) ic
131: .lookup("threads");
132:
133: EJBThreads ejbTest;
134: while (runMe) {
135:
136: ejbTest = null;
137:
138: try {
139:
140: ejbTest = testHome.findByPrimaryKey("test1");
141: } catch (Exception e) {
142: // Bean wasn't found create it
143: try {
144: ejbTest = testHome.create("test1");
145: }
146:
147: catch (Exception e2) {
148: log.debug("****Create exception: " + e2);
149: }
150: }
151:
152: if (ejbTest != null)
153: try {
154:
155: // get a random value between 1 and 100
156: int value = random.nextInt(100);
157:
158: // 10% removal
159: if (value < 10) {
160: ejbTest.remove();
161: }
162: // 35% normal
163: else if (value < 45) {
164: ejbTest.test();
165: }
166: // 15% business exception
167: else if (value < 60) {
168: ejbTest.testBusinessException();
169: }
170: // 15 % runtime excpetion
171: else if (value < 75) {
172: ejbTest.testRuntimeException();
173: }
174: // 15 % nonTransactional
175: else if (value < 90) {
176: ejbTest.testNonTransactional();
177: }
178: // 10% timeout
179: else {
180: ejbTest.testTimeOut();
181: }
182:
183: synchronized (this ) {
184: //Thread.currentThread().yield();
185: this .wait(wait);
186: }
187: } catch (NullPointerException ignored) {
188: } catch (RemoteException ignored) {
189: } catch (Exception ex) {
190: log.debug("***Exception thrown: " + ex);
191: }
192:
193: } // while(runMe)
194: log.debug(Thread.currentThread() + " is finished!!!!");
195: log.debug("Num threads finished is: "
196: + ++threadsFinished);
197: } catch (Exception e) {
198: log.debug("Exception for thread"
199: + Thread.currentThread());
200: log.debug("failed", e);
201: }
202:
203: }
204: }
205: }
|