需求:多实例机器处理各自分表

环境:1.多实例机器。2.已配置好 各台机器的IP 与 所有分表的对应关系。

效果:无论哪个机器得到的资源,它都要通过HTTP请求通知另外的实例去执行相应的方法。

(1)获取到系统中所有线程

代码参考自获取Java VM中当前运行的所有线程 - 苍穹冰尘 

/**
* 获取Java VM中当前运行的所有线程
* @return
*/
public static Thread[] findAllThreads() {
ThreadGroup group = Thread.currentThread().getThreadGroup();
ThreadGroup topGroup = group;
// 遍历线程组树,获取根线程组
while (group != null) {
topGroup = group;
group = group.getParent();
}
// 激活的线程数加倍
int estimatedSize = topGroup.activeCount() * 2;
Thread[] slacks = new Thread[estimatedSize];
//获取根线程组的所有线程
int actualSize = topGroup.enumerate(slacks);
Thread[] threads = new Thread[actualSize];
System.arraycopy(slacks, 0, threads, 0, actualSize);
return threads;
}

(2)通过当前IP查到该机器需要处理的分表。

(3)对所有线程进行遍历,然后判断是否有处理某张分表的thread_${tableName}线程。

                没有则启动。  已启动则忽略。

                伪代码:

                if ( JVM中所有线程 . 不包含 ( thread_${tableName} ) ) {

                        new Thread( runnable任务 , 线程名称:thread_${tableName} ).start()

                }

这样就能利用多台机器的资源。且将这个方法封装到某个Job中,方便给与Quartz管理。