package dataqueue;
/*
* Send instruction to demonstration model
running on System i
* and display
response. The console is used for input
and
* output.
*
* Enter *STOPNOW through the console as the
instruction for the
* demo model to stop
this program.
*
* This is same as DtaQExample1 except the RecordFormat objects
* are created from precompiled classes instead
of dynamically
* created.
The program CreateModelRecordFormats created
the
* precompiled classes.
*/
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Date;
import com.ibm.as400.access.AS400;
import com.ibm.as400.access.DataQueue;
import com.ibm.as400.access.KeyedDataQueue;
import
com.ibm.as400.access.KeyedDataQueueEntry;
import com.ibm.as400.access.Record;
import com.ibm.as400.access.RecordFormat;
import common.MDLIFMFormat;
import common.MDLOFMFormat;
import common.Me;
public class DtaQExample2 extends Object {
public static void main(String[]
parameters)
{
AS400 as400 = null;
System.out.println(
"
" );
try {
// Create
an AS400 object for the server that has the data queue.
System.out.println("Instantiating AS400 object.");
as400 = new AS400(Me.getSYSTEM(), Me.getUSER(), Me.getPASSWORD());
// This isn't necessary, the AS400 object will make the
// connections
as they are needed. Forcing the
connections at this
// point in
the the program put all the starting connection
overhead
// in once
place where you can see it.
System.out.println("Starting services.");
as400.connectService(AS400.COMMAND);
as400.connectService(AS400.DATAQUEUE);
// Create data queue objects
System.out.println("Instantiating data queue objects");
DataQueue
mdliDq = new DataQueue(as400, Me.getMDLI_DTAQ());
KeyedDataQueue
mdloDq = new KeyedDataQueue(as400, Me.getMDLO_DTAQ());
/* Replace dynamically build RecordFormat
*
System.out.println("Retrieving
record format descriptions.\n\n");
AS400FileRecordDescription mdliFormatDescription
=
new AS400FileRecordDescription(
as400,
Me.MDLI_DS);
AS400FileRecordDescription mdloFormatDescription
=
new AS400FileRecordDescription(
as400,
Me.MDLO_DS);
RecordFormat mdliFormat = mdliFormatDescription.retrieveRecordFormat()[0];
RecordFormat mdloFormat = mdloFormatDescription.retrieveRecordFormat()[0];
*
*/
// create RecordFormat
objects from pre-compiled classes
// makes for much faster startup
System.out.print("Creating record format objects from pre-compiled classes
... ");
Date startMilliseconds
= new Date();
RecordFormat mdliFormat = new MDLIFMFormat();
RecordFormat mdloFormat = new MDLOFMFormat();
long milliseconds = new Date().getTime() - startMilliseconds.getTime();
System.out.println("finished. Time in
milliseconds: " + milliseconds);
/*
* Debugging dump field names
String[] names = mdliFormat.getFieldNames();
for(int i=0;
i< names.length; i++)
System.out.println(names[i]);
names = mdloFormat.getFieldNames();
for(int i=0;
i< names.length; i++)
System.out.println(names[i]);
*/
// create a
reader for the console
BufferedReader stdin = new BufferedReader(new InputStreamReader(
System.in), 1);
while ( true )
{
// get input
from the keyboard
System.out.println("Instruction *STOPNOW ends this application");
System.out.print("Please enter the instruction to send to the model: ");
String
mdliInstruction = stdin.readLine();
if( mdliInstruction.equalsIgnoreCase("*STOPNOW") ) {
System.out.println(".... ok! stopping now .... goodbye");
break;
}
System.out.print("Please enter the data to send to the model: ");
// At this
point program is waiting for stdin
String
mdliMessage = stdin.readLine();
// load the model input record
and send it to the model
// either way
to get Record works
Record mdliData
= mdliFormat.getNewRecord();
// Record mdliData
= new Record(mdliFormat);
mdliData.setField("VCID", Me.getKEY());
mdliData.setField("IINSTRTN", mdliInstruction);
mdliData.setField("IMESSAGE", mdliMessage);
// Send instruction and data to model
on
// model input data queue
startMilliseconds = new Date();
System.out.print("Writing to MDLI data queue ... ");
mdliDq.write(mdliData.getContents());
milliseconds
= new Date().getTime() - startMilliseconds.getTime();
System.out.println("finished. Time in
milliseconds: " + milliseconds);
// Wait for
the model response on model output data queue.
// Wait
maximum of 15 seconds, if longer there is a problem
startMilliseconds = new Date();
System.out.print("
KeyedDataQueueEntry
mdloDataQueueEntry = mdloDq.read(Me.getKEY(), 15, "EQ");
if( mdloDataQueueEntry == null ) {
System.out.println("... the model took too long to respond " +
"... program terminated.");
break;
}
milliseconds
= new Date().getTime() - startMilliseconds.getTime();
System.out.println("finished. Time in milliseconds: " + milliseconds
+ "\n\n");
// Record data = mdliFormat.getNewRecord(mdloData.getData());
// We
just read an entry off the queue. Put
the data into
// a record object so the program
can access the fields of
// the data by name. The Record object will also convert
// the data from server format
to Java format.
Record mdloData
= mdloFormat.getNewRecord(mdloDataQueueEntry.getData());
// Get two values out of the
record and display them.
String mdloInstruction = (String)
mdloData.getField("OINSTRTN");
String mdloMessage = (String)
mdloData.getField("OMESSAGE");
System.out.println("The model received instruction: " +
mdloInstruction.trim() + " and returned data: " + mdloMessage.trim()
);
System.out.println("\n");
} // end of while(true)
}
catch (Exception e)
{
// If any of the above
operations failed say the data queue
// operation failed and output
the exception.
if (as400 != null)
as400.disconnectAllServices();
System.out.println("Data Queue operation failed");
System.out.println(e);
e.printStackTrace();
}
// clean up
if (as400 != null)
as400.disconnectAllServices();
System.exit(0);
}
}