This Java™ example program shows how to use the Start transaction and End transaction APIs to integrate user-defined transaction performance data into Collection Services.
import com.ibm.iseries.collectionservices.PerformanceDataReporter; // parameters: // number of TXs per thread // number of threads // log|nolog // enable|disable // transaction seconds public class TestTXApi { static TestTXApiThread[] thread; static private String[] TxTypeString; static private byte[][] TxTypeArray; static private String TxEventString; static private byte[] TxEventArray; static { int i; // initialize transaction type strings and byte arrays TxTypeString = new String[20]; TxTypeString[ 0] = "Transaction type 00"; TxTypeString[ 1] = "Transaction type 01"; TxTypeString[ 2] = "Transaction type 02"; TxTypeString[ 3] = "Transaction type 03"; TxTypeString[ 4] = "Transaction type 04"; TxTypeString[ 5] = "Transaction type 05"; TxTypeString[ 6] = "Transaction type 06"; TxTypeString[ 7] = "Transaction type 07"; TxTypeString[ 8] = "Transaction type 08"; TxTypeString[ 9] = "Transaction type 09"; TxTypeString[10] = "Transaction type 10"; TxTypeString[11] = "Transaction type 11"; TxTypeString[12] = "Transaction type 12"; TxTypeString[13] = "Transaction type 13"; TxTypeString[14] = "Transaction type 14"; TxTypeString[15] = "Transaction type 15"; TxTypeString[16] = "Transaction type 16"; TxTypeString[17] = "Transaction type 17"; TxTypeString[18] = "Transaction type 18"; TxTypeString[19] = "Transaction type 19"; TxTypeArray = new byte[20][]; for ( i = 0; i < 20; i++ ) try { TxTypeArray[i] = TxTypeString[i].getBytes("Cp037"); } catch(Exception e) { System.out.println("Exception \"" + e + "\" when converting"); } }/* static */ public static void main( String[] args ) { int numberOfTXPerThread; int numberOfThreads; boolean log; boolean enable; int secsToDelay; // process parameters if ( args.length >= 5 ) try { numberOfTXPerThread = Integer.parseInt( args[0] ); numberOfThreads = Integer.parseInt( args[1] ); if ( args[2].equalsIgnoreCase( "log" ) ) log = true; else if ( args[2].equalsIgnoreCase( "nolog" ) ) log = false; else { System.out.println( "Wrong value for 3rd parameter!" ); System.out.println( "\tshould be log|nolog" ); return; } if ( args[3].equalsIgnoreCase( "enable" ) ) enable = true; else if ( args[3].equalsIgnoreCase( "disable" ) ) enable = false; else { System.out.println( "Wrong value for 4th parameter!" ); System.out.println( "\tshould be enable|disable" ); return; } secsToDelay = Integer.parseInt( args[4] ); } catch (Exception e) { System.out.println( "Oops! Cannot process parameters!" ); return; } else { System.out.println( "Incorrect Usage." ); System.out.println( "The correct usage is:" ); System.out.println( "java TestTXApi numberOfTXPerThread numberOfThreads log|nolog enable|disable secsToDelay"); System.out.println("\tlog will make the program cut 1 log transaction per start / end pair"); System.out.println("\tdisable will disable performance collection to minimize overhead"); System.out.print("\nExample: \"java TestTXApi 10000 100 log enable 3\" will call " ); System.out.println("cause 10000 transactions for each of 100 threads"); System.out.println("with 3 seconds between start and end of transaction"); System.out.println("Plus it will place additional log call and will enable reporting." ); return; } System.out.println( "Parameters are processed:" ); System.out.println( "\tnumberOfTxPerThread = " + numberOfTXPerThread ); System.out.println( "\tnumberOfThreads = " + numberOfThreads ); System.out.println( "\tlog = " + log ); System.out.println( "\tenable = " + enable ); System.out.println( "\tsecsToDelay = " + secsToDelay ); // cause initialization of a PerformanceDataReporter class { PerformanceDataReporter pReporter = new PerformanceDataReporter(); pReporter.enableReporting(); } TestTXApi t = new TestTXApi( ); System.out.println( "\nAbout to start ..." ); t.prepareTests( numberOfTXPerThread, numberOfThreads, log, enable, secsToDelay ); long startTime = System.currentTimeMillis(); t.runTests( numberOfThreads ); // wait for threads to complete for ( int i = 0; i < numberOfThreads; i++ ) try { thread[i].join( ); } catch(Exception e) { System.out.println( "***Exception \"" + e + "\" while joining thread " + i ); } long endTime = System.currentTimeMillis(); System.out.println( "\nTest runtime for " + ( numberOfTXPerThread * numberOfThreads) + " TXs was " + ( endTime - startTime ) + " msec" ); }/* main() */ private void prepareTests( int numberOfTxPerThread, int numberOfThreads, boolean log, boolean enable, int secsToDelay ) { System.out.println( "Creating " + numberOfThreads + " threads"); thread = new TestTXApiThread[numberOfThreads]; for ( int i = 0; i < numberOfThreads; i++ ) thread[i] = new TestTXApiThread( i, numberOfTxPerThread, log, enable, secsToDelay ); }/* prepareTests() */ private void runTests( int numberOfThreads ) { for ( int i = 0; i < numberOfThreads; i++ ) thread[i].start( ); }/* runTests() */ private class TestTXApiThread extends Thread { private int ordinal; private int numberOfTxPerThread; private boolean log; private boolean enable; private int secsToDelay; private PerformanceDataReporter pReporter; private long timeStamp[]; private long userCounters[]; public TestTXApiThread( int ordinal, int numberOfTxPerThread, boolean log, boolean enable, int secsToDelay ) { super(); this.ordinal = ordinal; this.numberOfTxPerThread = numberOfTxPerThread; this.log = log; this.enable = enable; this.secsToDelay = secsToDelay; pReporter = new PerformanceDataReporter( false ); if ( enable ) pReporter.enableReporting(); timeStamp = new long[1]; userCounters = new long[16]; for ( int i = 0; i < 16; i++ ) userCounters[i] = i; }/* constructor */ public void run() { int i; for ( i = 0; i < numberOfTxPerThread; i++ ) { pReporter.startTransaction( TxTypeArray[i%20], i, TxTypeArray[i%20], 20, timeStamp ); // pReporter.startTransaction( TxTypeArray[i%20], i, TxTypeString[i%20], timeStamp ); if ( log ) pReporter.logTransaction( TxTypeArray[i%20], i, TxTypeArray[i%20], 20 ); // pReporter.logTransaction( TxTypeArray[i%20], i, TxTypeString[i%20] ); if (secsToDelay > 0) try { Thread.sleep(secsToDelay * 1000); } catch(Exception e) { } pReporter.endTransaction( TxTypeArray[i%20], i, TxTypeArray[i%20], 20, timeStamp, userCounters ); // pReporter.endTransaction( TxTypeArray[i%20], i, TxTypeString[i%20], timeStamp, // userCounters ); } }/* run() */ }/* class TestTXApiThread */ }/* class TestTXApi */