public void migrate() {
String nodePath = miExchange.toString();
try {
ZNode node = new ZNode("/exchange/" + nodePath);
ZooKeeperInfo.Exchange.Builder exBuilder = ZooKeeperInfo.Exchange.newBuilder();
try {
TextFormat.merge(new String(node.getContent()), exBuilder);
}
catch(CODIException.NoNode e) {
myConsole.logResponseNL("exchange " + miExchange.toString() + " does not exist!");
isReady = true;
return;
}
String oldhost = exBuilder.build().getHost();
ZooKeeperInfo.Broker brk = brokerFarm.getBrokerByHost(oldhost);
boolean hasOld = !(brk == null);
if(hasOld) {
hasOld = false;
Socket sock = null;
try {
sock = new Socket();
sock.setReuseAddress(true);
sock.setTcpNoDelay(true);
sock.connect(new InetSocketAddress(brk.getHost(), Integer.parseInt(brk.getPort())));
BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
int wait_cnt;
for(wait_cnt = 0; wait_cnt < 20 && !in.ready(); wait_cnt++) {
Utils.justSleep(500);
}
if(in.ready()) {
if(brk.getBrokerType().equals("openmq")) {
String line = in.readLine();
if(line.startsWith("101 imqbroker"))
hasOld = true;
}
}
}
catch(IOException e) {
}
finally {
try {
sock.getInputStream().close();
sock.close();
}
catch(IOException e) {
}
}
}
node.setContent(ZooKeeperInfo.Exchange.newBuilder().setHost("").build().toString().getBytes());
miExchange.setBroker(hasOld ? oldhost: null);
Forwarder fwder = new Forwarder(miExchange);
fwder.start();
while(!fwder.getReady()) {
Utils.justSleep(100);
}
isReady = true;
String newhost = "";
for(;;) {
exBuilder = ZooKeeperInfo.Exchange.newBuilder();
TextFormat.merge(new String(node.getContent()), exBuilder);
newhost = exBuilder.build().getHost();
if(newhost.compareTo(oldhost) == 0) {
myConsole.logResponse("[%s] warning: exchange is still on the same broker %s, migration completed%n", miExchange.toString(), newhost);
fwder.done();
fwder.go();
fwder.join();
return;
}
else if(newhost.compareTo("") != 0)
break;
myConsole.logResponse("[%s] waiting for clients to migrate...%n", miExchange.toString());
Utils.justSleep(1000);
}
myConsole.logResponse("[%s] exchange has been created on %s%n", miExchange.toString(), newhost);
fwder.go();
List<String> refList = node.getChildren();
ArrayList<String> hostList = new ArrayList<String>();
for(String refPath : refList) {
String data = new String(new ZNode("/exchange/" + nodePath + "/" + refPath).getContent());
ZooKeeperInfo.Reference.Builder refBuilder = ZooKeeperInfo.Reference.newBuilder();
TextFormat.merge(data, refBuilder);
ZooKeeperInfo.Reference ref = refBuilder.build();
String host = ref.getHost();
if(!hostList.contains(host))