HAのシミュレーション

戻る

アーキテクチャ

::::::::::::::
Client.java
::::::::::::::
package HA;

/**
* $Id: HA.html,v 1.1 2009/06/22 16:11:45 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class Client implements Runnable {

    public void run() {
        Controller controller = Controller.getInstance();
        Session session = controller.dispatchRequest();
        System.out.println( session.getID() );

    }

    public static void main( String[] args ) {

        Client[] clients = new Client[ 50 ];

        for ( int i = 0;i < clients.length;i++ ) {

            try {
                Thread.sleep( 500 );
            } catch ( Exception e ) {
                e.printStackTrace();
            }

            clients[ i ] = new Client();
            new Thread( clients[ i ] ).start();
        }

    }
}
::::::::::::::
ContextReceiver.java
::::::::::::::
package HA;

/**
* $Id: HA.html,v 1.1 2009/06/22 16:11:45 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public interface ContextReceiver {
    public void receive( Service activeService );

}
::::::::::::::
Controller.java
::::::::::::::
package HA;

/**
* $Id: HA.html,v 1.1 2009/06/22 16:11:45 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class Controller implements ContextReceiver {
    static private Controller instance;
    static private int sessionID = 0;
    static Service nodeA = null;
    static Service nodeB = null;
    static Service activeNode = null;

    public static synchronized Controller getInstance() {

        if ( instance == null ) {
            instance = new Controller();

            nodeA = new Service( "nodeA", 0.1 );
            nodeB = new Service( "nodeB", 0.3 );

            ServiceObserver observer = new ServiceObserver();
            observer.incorporate( nodeA );
            observer.incorporate( nodeB );
            observer.setReceiver( instance );

            new Thread( observer ).start();
        }

        return instance;
    }

    public static synchronized Session dispatchRequest() {

        return new Session( ++sessionID, activeNode );

    }

    public synchronized void receive( Service service ) {
        activeNode = service;
    }

}
::::::::::::::
Service.java
::::::::::::::
package HA;

/**
* $Id: HA.html,v 1.1 2009/06/22 16:11:45 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class Service implements Runnable {
    private String nodeName;
    private boolean isRunning = true;
    private double downTimeRate;
    private int counter = 0;

    public Service( String nodeName, double downTimeRate ) {
        this.nodeName = nodeName;
        this.downTimeRate = downTimeRate;
    }

    public void run() {
        while ( true ) {
            try {
                Thread.sleep( 1000 );
            } catch ( Exception e ) {
                e.printStackTrace();
            }

            if ( ++counter == ( int ) ( 1.0 / downTimeRate ) ) {
                isRunning = false;
                System.err.println( "-- " + nodeName + " is down!" );
                counter = 0;
            } else {
                isRunning = true;
            }

        }
    }

    public boolean getEnabled() {
        return isRunning;
    }

    public String getNodeName() {
        return nodeName;
    }
}
::::::::::::::
ServiceObserver.java
::::::::::::::
package HA;

import java.util.*;

/**
* $Id: HA.html,v 1.1 2009/06/22 16:11:45 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class ServiceObserver implements Runnable {

    private List<Service> serviceList;
    private Service activeService;
    private ContextReceiver receiver;

    public ServiceObserver() {
        serviceList = new LinkedList();
    }
    public void setReceiver( ContextReceiver receiver ) {
        this.receiver = receiver;
    }

    public void incorporate( Service service ) {
        serviceList.add( service );
        // サービスの開始
        new Thread( service ).start();
    }

    public void run() {
        while ( true ) {
            try {
                Thread.sleep( 1000 );
            } catch ( Exception e ) {
                e.printStackTrace();
            }

            activeService = null;
            for ( Service service : serviceList ) {
                if ( service.getEnabled() ) {
                    activeService = service;
                    receiver.receive( activeService );
                    break;
                }
            }

        }

    }

    public static void main( String[] args ) {
        Service nodeA = new Service( "nodeA", 0.1 );
        Service nodeB = new Service( "nodeB", 0.3 );

        // ダミーのRecieverを作成 -- スタブとして
        ContextReceiver receiver = new ContextReceiver() {
                                       public void receive( Service service ) {
                                           System.out.println( service.getNodeName() + " is available..." );
                                       }
                                   };

        ServiceObserver observer = new ServiceObserver();
        observer.incorporate( nodeA );
        observer.incorporate( nodeB );
        observer.setReceiver( receiver );

        new Thread( observer ).start();
    }
}
::::::::::::::
Session.java
::::::::::::::
package HA;

/**
* $Id: HA.html,v 1.1 2009/06/22 16:11:45 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class Session extends Thread {
    private int sessionID;
    private Service activeNode;

    public Session( int sessionID, Service activeNode ) {
        this.sessionID = sessionID;
        this.activeNode = activeNode;
        this.start();
    }

    public void run() {
        try {
            getResponse();
        } catch ( Exception e ) {
            e.printStackTrace();
        }
    }

    public int getID() {
        return sessionID;
    }

    public void getResponse() throws Exception {
        if ( activeNode != null ) {
            System.out.println( "Hello, I am " + activeNode.getNodeName() );
        } else {
            throw new Exception( "*** SERVICE NOT AVAILABLE ***" );
        }
    }
}
::::::::::::::
build.xml
::::::::::::::
<?xml version="1.0" encoding="Shift_JIS"?>
<!-- $Id: HA.html,v 1.1 2009/06/22 16:11:45 kishi Exp kishi $ -->

<project name="ThreadManager" default="jar" basedir=".">

  <property name="src.dir" value="src"/>

  <property name="classes.dir" value="classes"/>

  <property name="javadoc.dir" value="docs"/>

  <property name="jar.name" value="HA.jar"/>

  <target name="jar" depends="compile">
    <jar jarfile="${jar.name}" basedir="${classes.dir}"></jar>
  </target>

  <target name="compile">
    <mkdir dir="${classes.dir}" />
    <javac srcdir="${src.dir}" destdir="${classes.dir}"/>
  </target>

  <target name="javadoc" depends="compile">
    <javadoc destdir="${javadoc.dir}" access="private">
      <fileset dir="${src.dir}"/>
    </javadoc>
  </target>

  <target name="clean">
    <delete dir="${classes.dir}" />
    <delete dir="${javadoc.dir}" />
    <delete file="${jar.name}" />
  </target>

</project>

::::::::::::::
HA.sh
::::::::::::::
#!/bin/sh

java -cp HA.jar HA.Client

::::::::::::::
UnitTest.sh
::::::::::::::
#!/bin/sh

if [ $# != 1 ] ; then
        echo "USage: $0 [packageName.className]"
        exit 1
fi
CLASSNAME=$1

java -cp HA.jar HA.${CLASSNAME}

::::::::::::::
indent.sh
::::::::::::::
#!/bin/sh
# $Id: HA.html,v 1.1 2009/06/22 16:11:45 kishi Exp kishi $

CURRENT_DIR=`pwd`
echo ${CURRENT_DIR}

for JAVA in `find . -name "*.java"` ; do
        DIR=`dirname ${JAVA}`
        cd ${DIR}

        TARGET=`basename ${JAVA}`
        astyle -j -a -P ${TARGET} && vu.sh ${TARGET} && rm -f *.orig *.bak

        cd ${CURRENT_DIR}
done

$ ./HA.sh
1
java.lang.Exception: *** SERVICE NOT AVAILABLE ***
        at HA.Session.getResponse(Unknown Source)
        at HA.Session.run(Unknown Source)
2
java.lang.Exception: *** SERVICE NOT AVAILABLE ***
        at HA.Session.getResponse(Unknown Source)
        at HA.Session.run(Unknown Source)
3
java.lang.Exception: *** SERVICE NOT AVAILABLE ***
        at HA.Session.getResponse(Unknown Source)
        at HA.Session.run(Unknown Source)
4
Hello, I am nodeA
5
Hello, I am nodeA
6
Hello, I am nodeA
7
Hello, I am nodeA
-- nodeB is down!
8
Hello, I am nodeA
9
Hello, I am nodeA
10
Hello, I am nodeA
11
Hello, I am nodeA
12
Hello, I am nodeA
-- nodeB is down!
13
Hello, I am nodeA
14
Hello, I am nodeA
15
Hello, I am nodeA
16
Hello, I am nodeA
17
Hello, I am nodeA
18
Hello, I am nodeA
-- nodeB is down!
19
Hello, I am nodeA
20
Hello, I am nodeA
-- nodeA is down!
21
Hello, I am nodeA
22
Hello, I am nodeA
23
Hello, I am nodeA
24
Hello, I am nodeA
-- nodeB is down!
25
Hello, I am nodeA
26
Hello, I am nodeA
27
Hello, I am nodeA
28
Hello, I am nodeA
29
Hello, I am nodeA
30
Hello, I am nodeA
-- nodeB is down!
31
Hello, I am nodeA
32
Hello, I am nodeA
33
Hello, I am nodeA
34
Hello, I am nodeA
35
Hello, I am nodeA
36
Hello, I am nodeA
-- nodeB is down!
37
Hello, I am nodeA
38
Hello, I am nodeA
39
Hello, I am nodeA
40
Hello, I am nodeA
-- nodeA is down!
41
Hello, I am nodeB
42
Hello, I am nodeB
-- nodeB is down!
43
Hello, I am nodeA
44
Hello, I am nodeA
45
Hello, I am nodeA
46
Hello, I am nodeA
47
Hello, I am nodeA
48
Hello, I am nodeA
-- nodeB is down!
49
Hello, I am nodeA
50
Hello, I am nodeA
-- nodeB is down!
戻る

inserted by FC2 system