首先,我需要实现的功能是 java代码调用本地cmd进行 ping ip操作。对ping 的结果分析并 发送邮件。这里最大 的问题是如何 在 邮件线程 和 ping的线程 之间 ip的传递。
设计思路是先定接口(暂名为interface1 和 interface2),先不要管如何实现ip传递。
1.邮箱线程实现接口 interface1, 当创建邮箱线程实例的时候,重写interface1的方法 这些方法的 逻辑是 尝试接收对应ip。 创建完邮箱线程之后,把邮箱线程的引用赋给 接口interface1,这样相当于interface1也等到了实例化。
2.创建ping线程实现cmd的ping 操作。在ping线程里面 放入 接口2 interface2 ,并且使interface2 的实现了 在创建对象的时候 对构造传入接口1interface1的实例,这样在interface2 里面就能拿到接口1的实例,并使用接口1的方法。 接口interface2 的重写的方法的逻辑是 尝试发送ip。
3.这样在 ping的线程里面,就可以通过接口2 interface2 把 ip传递给 接口interface1,那么就能在邮箱线程里面通过接口interface1 得到传递过来的ip 实现发邮箱逻辑。
在整个流程里面 邮箱线程 (实现并重写) 接口1interface1 , ping线程 (包含) 接口2inteface2, 接口2 内部有 接口1 的实例引用 (能操作接口1的方法)。
当 ping线程 把ip传递给 接口2 之后 , 接口2 在方法 里面 能 实现 将ip 传递给 接口1, 然后 接口1 就能把ip 传递给 邮件线程。
public static void main(String[] args) {
List<String> iplist = Arrays.asList(configuration.getString("ip.list").split(";"));
List<Thread> threads = new ArrayList<Thread>();
// 开启Email线程扫描
MailThread mailThread = new MailThread();
IPStrategyHandler ipStrategyHandler = mailThread;
mailThread.start();
for (String ip : new HashSet<String>(iplist)) { // 去除重复IP
if (StringUtils.isBlank(ip)) {
continue;
}
PingThread t = new PingThread(ip.trim()); //开启ping线程
t.setStrategy(new StrategyImpl(ipStrategyHandler)); //ping线程内部 传入 接口2
t.start();
threads.add(t);
}
...
}
public interface IPStrategyHandler { //接口1 尝试获取ip
public void broken(IPStatus ip); //中断
public void reconnect(IPStatus ip); //重连
public void delay(IPStatus ip); //延迟
}
public class MailThread extends Thread implements IPStrategyHandler { //在邮箱线程里面 重写接口1的方法是 给 对应的集合添加ip
public MailThread() {
this.brokenMap = new Hashtable<String, IPStatus>();
this.reconnectList = new ArrayList<IPStatus>();
this.delayMap = new Hashtable<String, IPStatus>();
}
...
}
public interface Strategy { //接口2 传递ip出去
public void analysisStatus(IPStatus ip,int errorCount);
public void reconnect(IPStatus ip);
public void broken(IPStatus ip);
public void delay(IPStatus ip);
}
public class StrategyImpl implements Strategy { //接口2 的实现类 在创建实例的时候传入 接口1的实例引用
public StrategyImpl(IPStrategyHandler ipStrategyHandler) {
this.ipStrategyHandler = ipStrategyHandler;
}
@Override
public void reconnect(IPStatus ip) {
ipStrategyHandler.reconnect(ip);//传递重连ip
}
@Override
public void broken(IPStatus ip) {
ipStrategyHandler.broken(ip); //传递中断ip
}
@Override
public void delay(IPStatus ip) {
ipStrategyHandler.delay(ip);
}
...
}
public class PingThread extends Thread { //ping线程内部 包含 接口2
...
private Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}