Example: Listing spooled files asynchronously (using listeners)
This example demonstrates listing all spooled files on a server asynchronously using the PrintObjectListListener interface to get feedback as the list is being built. Listing asynchronously allows the caller to start processing the list objects before the entire list is built for a faster perceived response time for the user.
Note: Read the Code
example disclaimer for important legal information.
/////////////////////////////////////////////////////////////////////////
//
// Example that shows listing all spooled files on a server asynchronously using
// the PrintObjectListListener interface to get feedback as the list is being built.
// Listing asynchronously allows the caller to start processing the list objects
// before the entire list is built for a faster perceived response time
// for the user.
//
/////////////////////////////////////////////////////////////////////////
import com.ibm.as400.access.AS400;
import com.ibm.as400.access.SpooledFileList;
import com.ibm.as400.access.SpooledFile;
import com.ibm.as400.access.ExtendedIllegalStateException;
import com.ibm.as400.access.PrintObjectListListener;
import com.ibm.as400.access.PrintObjectListEvent;
public class NPExampleListSplfAsynch extends Object implements PrintObjectListListener
{
private AS400 system_;
private boolean fListError;
private boolean fListClosed;
private boolean fListCompleted;
private Exception listException;
private int listObjectCount;
public NPExampleListSplfAsynch(AS400 system)
{
system_ = system;
}
// list all spooled files on the server asynchronously using a listener
public void listSpooledFiles()
{
fListError = false;
fListClosed = false;
fListCompleted = false;
listException = null;
listObjectCount = 0;
try
{
String strSpooledFileName;
boolean fCompleted = false;
int listed = 0, size;
if( system_ == null )
{
system_ = new AS400();
}
System.out.println(" Now receiving all spooled files Asynchronously using a listener");
SpooledFileList splfList = new SpooledFileList(system_);
// set filters, all users, on all queues
splfList.setUserFilter("*ALL");
splfList.setQueueFilter("/QSYS.LIB/%ALL%.LIB/%ALL%.OUTQ");
// add the listener.
splfList.addPrintObjectListListener(this);
// open the list, openAsynchronously returns immediately
splfList.openAsynchronously();
do
{
// wait for the list to have at least 25 objects or to be done
waitForWakeUp();
fCompleted = splfList.isCompleted();
size = splfList.size();
// output the names of all objects added to the list
// since we last woke up
while (listed < size)
{
if (fListError)
{
System.out.println(" Exception on list - " + listException);
break;
}
if (fListClosed)
{
System.out.println(" The list was closed before it completed!");
break;
}
SpooledFile splf = (SpooledFile)splfList.getObject(listed++);
if (splf != null)
{
// output this spooled file name
strSpooledFileName = splf.getStringAttribute(SpooledFile.ATTR_SPOOLFILE);
System.out.println(" spooled file = " + strSpooledFileName);
}
}
} while (!fCompleted);
// clean up after we are done with the list
splfList.close();
splfList.removePrintObjectListListener(this);
}
catch( ExtendedIllegalStateException e )
{
System.out.println(" The list was closed before it completed!");
}
catch( Exception e )
{
// ...handle any other exceptions...
e.printStackTrace();
}
}
// This is where the foreground thread waits to be awaken by the
// the background thread when the list is updated or it ends.
private synchronized void waitForWakeUp() throws InterruptedException
{
// don''t go back to sleep if the listener says the list is done
if (!fListCompleted)
{
wait();
}
}
// The following methods implement the PrintObjectListListener interface
// This method is invoked when the list is closed.
public void listClosed(PrintObjectListEvent event)
{
System.out.println("*****The list was closed*****");
fListClosed = true;
synchronized(this)
{
// Set flag to indicate that the list has
// completed and wake up foreground thread.
fListCompleted = true;
notifyAll();
}
}
// This method is invoked when the list is completed.
public void listCompleted(PrintObjectListEvent event)
{
System.out.println("*****The list has completed*****");
synchronized (this)
{
// Set flag to indicate that the list has
// completed and wake up foreground thread.
fListCompleted = true;
notifyAll();
}
}
// This method is invoked if an error occurs while retrieving
// the list.
public void listErrorOccurred(PrintObjectListEvent event)
{
System.out.println("*****The list had an error*****");
fListError = true;
listException = event.getException();
synchronized(this)
{
// Set flag to indicate that the list has
// completed and wake up foreground thread.
fListCompleted = true;
notifyAll();
}
}
// This method is invoked when the list is opened.
public void listOpened(PrintObjectListEvent event)
{
System.out.println("*****The list was opened*****");
listObjectCount = 0;
}
// This method is invoked when an object is added to the list.
public void listObjectAdded(PrintObjectListEvent event)
{
// every 25 objects we'll wake up the foreground
// thread to get the latest objects...
if( (++listObjectCount % 25) == 0 )
{
System.out.println("*****25 more objects added to the list*****");
synchronized (this)
{
// wake up foreground thread
notifyAll();
}
}
}
public static void main( String args[] )
{
NPExampleListSplfAsynch list = new NPExampleListSplfAsynch(new AS400());
try{
list.listSpooledFiles();
}
catch( Exception e )
{
e.printStackTrace();
}
System.exit(0);
}
}