public class CoreServer {
private String hostName;
public CoreServer(String hostName) {
this.hostName = hostName;
}
public void start() {
ZkClient zk = ZKUtil.getZkClient();
if (!zk.exists(ZKUtil.CORE_SERVER_NODE_NAME)){
zk.createPersistent(ZKUtil.CORE_SERVER_NODE_NAME);
}
zk.createEphemeralSequential(ZKUtil.CORE_SERVER_NODE_NAME + "/server", hostName);
System.out.println(hostName + " is running...");
}
public String getHostName() {
return hostName;
}
}
ClientServer类:
package yjmyzz.test;
import org.I0Itec.zkclient.ZkClient;
import java.util.Arrays;
import java.util.List;
/**
* Created by jimmy on 15/6/28.
*/
public class ClientServer {
private String getCoreServer() {
ZkClient zk = ZKUtil.getZkClient();
List<String> servers = ZKUtil.getZkClient().getChildren(ZKUtil.CORE_SERVER_NODE_NAME);
if (servers.size() <= 0) {
return null;
}
for (String s : servers) {
System.out.println(s);
}
Object[] arr = servers.toArray();
Arrays.sort(arr);
String data = zk.readData(ZKUtil.CORE_SERVER_NODE_NAME + "/" + arr[0].toString());
System.out.println("node:" + arr[0].toString() + ", data:" + data);
return data;
}
public void run(){
System.out.println("客户端应用运行中,正在调用:" + getCoreServer() + " 上的服务");
}
}
SPOF测试类:
package yjmyzz.test;
import org.junit.Test;
import java.util.concurrent.TimeUnit;
/**
* Created by jimmy on 15/6/28.
*/
public class SPOFTest {
@Test
public void startCoreServer1() throws InterruptedException {
CoreServer server1 = new CoreServer("server1");
server1.start();
while (true) {
TimeUnit.SECONDS.sleep(5);
}
}
@Test
public void startCoreServer2() throws InterruptedException {
CoreServer server2 = new CoreServer("server2");
server2.start();
while (true) {
TimeUnit.SECONDS.sleep(5);
}
}
@Test
public void testSPOF() throws InterruptedException {
ClientServer clientServer = new ClientServer();
clientServer.run();
//此时,手动停止coreServer1
TimeUnit.SECONDS.sleep(60);
//再次运行
clientServer.run();
}