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);
    }

}