talknaplet.java

来自「移动Agent编程工具Naplet」· Java 代码 · 共 158 行

JAVA
158
字号
/*
 * @<#> TalkNaplet.java version 0.0.1, 1/1/2000
 *
 * THIS PROGRAM IS FREE SOFTWARE; YOU CAN DISTRIBUTE IT AND/OR
 * MODIFY IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE
 * AS PUBLISHED BY THE FREE SOFTWARE FOUNDATION.
 *
 * THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
 * BUT WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE
 * GNU GENERAL PUBLIC LICENSE FOR MORE DETAILS.
 *
 * Copyright (c) 2000 Wayne State University. All Rights Reserved.
 */
package talk;

/**
 * The <code>TalkNaplet</code> class implements an example of naplets
 * that is dispatched in parallel and the two spawned naplets need to
 * talk to each other.
 *
 * @version 0.0.1, 1/1/2000
 * @author C. Xu
 *
 */
import java.io.*;
import java.rmi.*;
import java.util.*;
import java.lang.reflect.*;
import naplet.*;
import naplet.itinerary.*;
import naplet.message.*;

public class TalkNaplet extends Naplet
{
    public TalkNaplet( String[] servers )
        throws InvalidNapletException, InvalidItineraryException
    {
        this( null, servers );
    }

    public TalkNaplet( String name, String[] servers )
        throws InvalidNapletException, InvalidItineraryException
    {
        super( name, null );
        setItinerary( new CommItinerary( servers ) );

    }

    /**
     * Entry point of a naplet at each server
     */
    public void onStart()
        throws InterruptedException
    {

        String server = getNapletContext().getServerURN().toString();

        System.out.println( "Naplet " + this.getNapletID().toString()
                            + " is running at " + server );

        Thread.sleep( 3000 );

        try
        {
            getItinerary().travel( this );
        }
        catch ( NapletMigrateException nme )
        {
            System.out.println( nme.getMessage() );
        }

    }

    static void classFinalize()
    {
        System.out.println( "MyNaplet was finalized" );
    }

    /**
     * The <code>Barrier</code> class defines an operation to be performed
     * at the end of an itinerary.
     */
    private class Barrier
        implements Operable
    {
        public void operate( Naplet nap )
        {

            NapletID myID = nap.getNapletID();
            System.out.println( "My NapletID =" + myID.toString() );

            Messenger postman = nap.getNapletContext().getMessenger();

            AddressBook aBook = nap.getAddressBook();
            Iterator iter = aBook.iterator();

            while ( iter.hasNext() )
            {
                AddressEntry entry = ( AddressEntry ) iter.next();
                NapletID nid = entry.getNapletID();
                try
                {
                    if ( !nid.equals( aBook.creator() ) && !nid.equals( myID ) )
                    {
                        Message msg = new Message( myID, nid,
                            "Helloooo from " + myID.toString() );

                        // postman.send(myID, id, msg);
                        postman.send( myID, entry.getServerURN(), msg );
                    }
                }
                catch ( NapletCommunicationException nce )
                {
                    System.out.println( "Unable to post message" );
                    System.exit( 1 );
                }
            }

            // Communicate to all the naplets, excluding its Creator and itself
            for ( int i = 0; i < aBook.size() - 2; i++ )
            {
                Message msg = postman.checkMailBox( myID );
                if ( msg != null )
                {
                    System.out.println( msg.getMessage() );
                }
                else
                {
                    System.out.println( "No new message" );
                }
            }
        }
    }

    private class CommItinerary extends Itinerary
    {
        public CommItinerary( String[] servers )
            throws InvalidItineraryException
        {

            Operable act = new Barrier();

            // broadcast pattern

            ItineraryPattern[] ip = new ItineraryPattern[servers.length];
            for ( int i = 0; i < servers.length; i++ )
            {
                ip[i] = new SingletonPattern( servers[i], act );
            }
            setRoute( new ParPattern( ip ) );

            System.out.println( "ICItinerary = " + getRoute().toString() );

        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?