热切换与RoundRobin的简单实例
HotSwitch经常在一些数据库的主从备份中出现。另一个场景索引的切换。
下面提一个java模拟的路径切换的示例。采用简单的round robin算法实现:
import java.io.File; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestHotSwitch implements Runnable { File file; File file2; SwitchObj[] sos = new SwitchObj[2]; public TestHotSwitch() { try { ExecutorService exec = Executors.newSingleThreadExecutor(); exec.execute(this); exec.shutdown(); } catch (Exception ex) { System.out.println(ex); } } public void init() { System.out.println("do some init"); SwitchObj obj1 = new SwitchObj(); obj1.isUse = true; obj1.filepath = "/tmp/res1"; sos[0] = obj1; SwitchObj obj2 = new SwitchObj(); obj2.isUse = false; obj2.filepath = "/tmp/res2"; sos[1] = obj2; file = new File("/tmp/middle"); file2 = new File("/tmp/dest"); } // 主线程模拟每隔2S,一个新的/tmp/middle文件夹生成。main方法可以用cronjob代替。renameTo也可以用mv代替。 public static void main(String[] args) throws Exception { TestHotSwitch tf = new TestHotSwitch(); tf.init(); for (int i = 0; i < 5; i++) { if (!tf.file.exists()) tf.file.mkdir(); tf.file.renameTo(tf.file2); Thread.sleep(2000); } } @Override public void run() { while (true) // block { try { // 每隔1s处理 Thread.sleep(1000); // 如果存在,开始应用程序处理。 if (file2.exists()) { for (int i = 0; i < sos.length; i++) { if (sos[i].isUse) { continue; } file2.renameTo(new File(sos[i].filepath)); sos[i].isUse = true; sos[(i + 1) % 2].isUse = false; System.out.println("success switch sos[" + i + "]"); } } } catch (Exception e) { e.printStackTrace(); } } } class SwitchObj { boolean isUse; //热切换通常需要一个状态位来确定是否可用。 String filepath; } }