76
|
1 package fdl.test.topology;
|
|
2
|
|
3 import java.io.IOException;
|
|
4 import java.net.InetAddress;
|
|
5 import java.net.UnknownHostException;
|
|
6
|
|
7 import java.nio.ByteBuffer;
|
|
8 import java.util.ArrayList;
|
|
9
|
|
10 import fdl.MetaEngine;
|
|
11 import fdl.MetaLinda;
|
|
12 import fdl.PSXLinda;
|
|
13 import fdl.PSXReply;
|
|
14
|
|
15 /**
|
|
16 * MetaProtocolEngine
|
|
17 *
|
|
18 * @author Kazuki Akamine
|
|
19 *
|
|
20 * 接続する機能までを実装した MetaEngine
|
|
21 * これを継承して、具体的な処理を書く
|
|
22 *
|
|
23 */
|
|
24
|
|
25 public class MetaProtocolEngine implements MetaEngine {
|
|
26 // Fields
|
79
|
27 protected static String lastToken = "null";
|
|
28 protected static int port = 10000;
|
|
29 protected static int manageId = 60000;
|
|
30 protected PSXLinda manager, psxLocal;
|
|
31 protected ArrayList<PSXLinda> psxSendServers;
|
|
32 protected MetaLinda fdlMeta;
|
|
33 protected String managerHostName;
|
|
34 protected String localHostName;
|
76
|
35
|
|
36 // Constructor
|
|
37 public MetaProtocolEngine(MetaLinda ml, String managerHostName) {
|
|
38 this.fdlMeta = ml;
|
|
39 this.managerHostName = managerHostName;
|
|
40 try {
|
|
41 this.localHostName = InetAddress.getLocalHost().getHostName();
|
|
42 } catch (UnknownHostException e) {
|
|
43 e.printStackTrace();
|
|
44 }
|
|
45 this.psxSendServers = new ArrayList<PSXLinda>();
|
|
46 }
|
97
|
47 public void mainLoop(MetaLinda ml) {}
|
76
|
48
|
|
49 public void mainLoop() {
|
|
50 psxLocal = fdlMeta;
|
|
51 initTopologyManager();
|
|
52 initSendServer();
|
|
53 }
|
|
54
|
79
|
55 protected void initSendServer() {
|
76
|
56 sendLocalHostName();
|
|
57 connectSendServers();
|
80
|
58 sendLocalHostName();
|
76
|
59 }
|
|
60
|
79
|
61 protected void initTopologyManager() {
|
76
|
62 // Connect to TopologyManager Server
|
|
63 try {
|
|
64 manager = fdlMeta.open(managerHostName, port);
|
|
65 } catch (IOException e) {
|
|
66 // manager は先に立ち上げてから実行する。
|
|
67 // while で回して再接続 loop にすべき?
|
|
68 e.printStackTrace();
|
|
69 }
|
|
70 }
|
|
71
|
79
|
72 protected void sendLocalHostName() {
|
76
|
73 // TopologyManager に自分のホストネームを送信して、起動を伝える
|
|
74 ByteBuffer local;
|
|
75 local = ByteBuffer.wrap(localHostName.getBytes());
|
|
76 manager.out(manageId, local);
|
|
77 try {
|
|
78 manager.sync(1);
|
|
79 } catch (IOException e) {
|
|
80 e.printStackTrace();
|
|
81 }
|
|
82 }
|
|
83
|
79
|
84 protected void connectSendServers() {
|
76
|
85 // TopologyManager から、送られてくる ConnectServer の hostName を取得して接続
|
|
86 System.out.println("[DEBUG] MethodCall connectSendServers()");
|
|
87 while (true) {
|
|
88 PSXReply reply;
|
|
89 reply = psxLocal.in(manageId);
|
|
90 do {
|
|
91 try {
|
|
92 psxLocal.sync(1);
|
|
93 } catch (IOException e) {
|
|
94 e.printStackTrace();
|
|
95 }
|
|
96 } while (!reply.ready());
|
|
97 ByteBuffer data = reply.getData();
|
|
98 String hostName = new String(data.array());
|
|
99 System.out.println("[DEBUG] GetReply " + hostName);
|
|
100 if (hostName.equals(lastToken))
|
|
101 break;
|
|
102 connectSendServer(hostName);
|
|
103 }
|
|
104 }
|
|
105
|
79
|
106 protected void connectSendServer(String hostName) {
|
76
|
107 PSXLinda linda;
|
|
108 try {
|
|
109 linda = fdlMeta.open(hostName, port);
|
|
110 psxSendServers.add(linda);
|
|
111 } catch (IOException e) {
|
|
112 e.printStackTrace();
|
|
113 }
|
|
114 System.out.println("Connect to " + hostName);
|
|
115 }
|
|
116
|
|
117 }
|