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!
戻る