Example: List Spooled Files Asynchronously Using A Listener
/////////////////////////////////////////////////////////////////////////
// Example that shows listing all spooled files on a system 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.
//
// For more information about AS/400 Printing, refer to :
// OS/400 Printer Device Programming, SC41-3713
// IBM AS/400 Printing IV Redbook, GG24-4389
//
/////////////////////////////////////////////////////////////////////////
//
// This source is an example of AS/400 Toolbox for Java "PrintObjectList".
// IBM grants you a nonexclusive license to use this as an example
// from which you can generate similar function tailored to
// your own specific needs.
//
// This sample code is provided by IBM for illustrative purposes
// only. These examples have not been thoroughly tested under all
// conditions. IBM, therefore, cannot guarantee or imply
// reliability, serviceability, or function of these programs.
//
// All programs contained herein are provided to you "AS IS"
// without any warranties of any kind. The implied warranties of
// merchantablility and fitness for a particular purpose are
// expressly disclaimed.
//
// AS/400 Toolbox for Java
// (C) Copyright IBM Corp. 1997
// All rights reserved.
// US Government Users Restricted Rights -
// Use, duplication, or disclosure restricted
// by GSA ADP Schedule Contract with IBM Corp.
//
/////////////////////////////////////////////////////////////////////////
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 system 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);
}
}