|
As long as you don't disconnect, when you use the same AS400 object all command calls and program calls go to the same AS/400 job. After your command runs you could use program call to call the get job info API, extract the job name/user/number out of the returned data, then use JobLog to read the log. Here is an example I cut/pasted from a couple of different places. void PrintJobLog() { try { AS400 system = new AS400(); CommandCall cc = new CommandCall(system); cc.run("crtlib fred"); cc.run("crtlib fred"); cc.run("crtlib fred"); ProgramCall pc = new ProgramCall(system); // Set up the parameter list for the program that we will use to get the Job information (QWCRTVCA). // Format for Retrieve Current Attributes (QWCRTVCA) API: // 1 - Receiver variable - Output - Char(*) // 2 - Length of receiver variable - Input - Binary(4) // 3 - Format name - Input - Char(8) // 4 - Number of attributes to return - Input - Binary(4) // 5 - Key of attributes to be returned - Input - Array(*) of Binary(4) // 6 - Error code - I/O - Char(*) // Relevant Key Attributes for QWCRTVCA API: // ______ ___________ ______________ // | Key | Type | Description | // |______|___________|______________| // | 1009 | CHAR(26) | Job name | Values shown in decimal. // |______|___________|______________| ProgramParameter[] parameterList = new ProgramParameter[6]; // First parameter: output, the receiver variable. byte[] dataReceived = new byte[46]; // RTVC0100's 20-byte header, plus 26 bytes for "Job name" field. parameterList[0] = new ProgramParameter(dataReceived.length); // Second parameter: input, length of receiver variable. byte[] receiverLength = new byte[4]; BinaryConverter.intToByteArray(dataReceived.length, receiverLength, 0); parameterList[1] = new ProgramParameter(receiverLength); // Third parameter: input, format name. AS400Text converter8 = new AS400Text(8, system); byte[] formatName = converter8.toBytes("RTVC0100"); parameterList[2] = new ProgramParameter(formatName); // Fourth parameter: input, number of attributes to return. byte[] numAttributes = new byte[4]; BinaryConverter.intToByteArray(1, numAttributes, 0); parameterList[3] = new ProgramParameter(numAttributes); // Fifth parameter: input, key(s) of attribute(s) to return. byte[] attributeKey = new byte[4]; BinaryConverter.intToByteArray(1009, // "Job name" attributeKey, 0); parameterList[4] = new ProgramParameter(attributeKey); // Sixth parameter: input/output, error code. // In format ERRC0100, the first field in the structure, "bytes // provided", is a 4-byte INPUT field; it controls whether an exception // is returned to the application, or the error code structure is filled // in with the exception information. // When the "bytes provided" field is zero, all other fields are // ignored and an exception is returned (rather than the error code // structure getting filled in). byte[] errorCode = new byte[17]; // Format ERRC0100 BinaryConverter.intToByteArray(0, errorCode, 0); // return exception if error parameterList[5] = new ProgramParameter(errorCode, 17); // Call Retrieve Current Attributes. Failure is returned as a message list. if(!pc.run("/QSYS.LIB/QWCRTVCA.PGM", parameterList)) { AS400Message[] messageList_ = pc.getMessageList(); for (int i = 0; i < messageList_.length; ++i) { System.out.println(messageList_[i].toString()); } return; } // Get the data returned from the program. dataReceived = parameterList[0].getOutputData(); // Format of RTVC0100 structure returned from QWCRTVCA API: // Offset // __________ // 0 | BINARY(4) | Number of attributes returned // __________|____________|______________ // These | BINARY(4) | Length of attribute information returned // fields |____________|______________ // repeat, | BINARY(4) | Key // in the |____________|______________ // order | CHAR(1) | Type of data // listed, |____________|______________ // for each | CHAR(3) | Reserved // key |____________|______________ // requested.| BINARY(4) | Length of data // |____________|______________ // | CHAR(*) | Data // |____________|______________ // | CHAR(*) | Reserved // __________|____________|______________ // Verify that one attribute was returned. Assume that if exactly // one was returned, it's the one we asked for. int numAttributesReturned = BinaryConverter.byteArrayToInt(dataReceived, 0); if (numAttributesReturned != 1) { System.out.println("unexpected data returned: " + numAttributesReturned); return; } // Examine the "Job name" field. 26 bytes starting at offset 20. // Parse out the job name, user name, and job number. // Contents of returned "Job name" field: // The name of the user job that this thread is associated with. // The format of the job name is a 10-character simple job name, // a 10-character user name, and a 6-character job number. AS400Text converter10 = new AS400Text(10, system); AS400Text converter6 = new AS400Text(6, system); String name = (String) converter10.toObject(dataReceived, 20); String user = (String) converter10.toObject(dataReceived, 30); String number = (String) converter6.toObject(dataReceived, 40); System.out.println(name + " " + user + " " +number); JobLog log = new JobLog(system, name, user, number); Enumeration messages = log.getMessages(); while (messages.hasMoreElements()) { QueuedMessage message = (QueuedMessage) messages.nextElement (); System.out.println (message.getText ()); } } catch (Exception e) { e.printStackTrace(); } } David Wall AS/400 Toolbox for Java jjmatthe@us.ibm.com on 08/10/2000 09:07:13 AM Please respond to JAVA400-L@midrange.com To: JAVA400-L@midrange.com cc: Subject: ?Java Function for RCVMSG? Hello, I have recently developed a servlet that does many CL commands based on data submitted from a user. During the input stages there is room for a user to enter data that I can not tell if it is valid at the time of input, but can later because an error in a CL command. What I would like to do is to display the whole job log if an error happens, so they could better understand why the command did not run. I currently use the command class and do a command.getMessage( ) but this only gives me an cut down version of the error. In the JobLog class you have to specify the job name and the job number. I was wondering if anyone knows of a simpler way to do something like a RCVMSG in java with out specifying the job name and job number. Any information would be appreciated, Jeff Matthes +--- | This is the JAVA/400 Mailing List! | To submit a new message, send your mail to JAVA400-L@midrange.com. | To subscribe to this list send email to JAVA400-L-SUB@midrange.com. | To unsubscribe from this list send email to JAVA400-L-UNSUB@midrange.com. | Questions should be directed to the list owner: joe@zappie.net +--- +--- | This is the JAVA/400 Mailing List! | To submit a new message, send your mail to JAVA400-L@midrange.com. | To subscribe to this list send email to JAVA400-L-SUB@midrange.com. | To unsubscribe from this list send email to JAVA400-L-UNSUB@midrange.com. | Questions should be directed to the list owner: joe@zappie.net +---
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.