此次需求做的是同步功能,将第三方数据拉取到本地
思考
1、同步将由多线程进行,节省时间
2、拉取过来后将与本地表进行对比:add、update、delete三种情况
3、本地数据修改后,将通过rabbitmq形式发送消息到其他服务进行业务处理。
主要知识点:
一、 获取线程池
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.initialize();
//线程池维护线程的最少数量
executor.setCorePoolSize(15);
//线程池维护线程的最大数量
executor.setMaxPoolSize(100);
//缓存队列
executor.setQueueCapacity(10000);
//允许的空闲时间
executor.setKeepAliveSeconds(60);
//线程名称前缀
executor.setThreadNamePrefix("sync-");
//对拒绝task的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//等待所有任务结束后再关闭线程池
executor.setWaitForTasksToCompleteOnShutdown(true);
二、数据比较过程通过线程池进行异步处理
1、创建Future(判断任务是否完成;能够中断任务;能够获取任务执行结果)
List<Future<List<CommandEntity>>> futures = new ArrayList<Future<List<CommandEntity>>>();
2、线程池执行多线程任务
通过submit 方法能够获取线程的返回结果
通过execute方法不会获取线程返回
在此 我使用了submit方法来执行多线程任务
futures.add(pool.submit(new CompareCallable(request, localIndex)));
3、实现Callable接口来创建一个线程任务 并能够获取其返回值且能够让让执行端捕获到异常(跟实现Runnable接口类似)
一般来说Future和Callable是搭配在一起使用的
public class CompareCallable implements Callable<List<CommandEntity>>{
public List<CommandEntity> call() throws Exception {
// TODO Auto-generated method stub
//数据比对逻辑
}
}
三、获取线程返回值
//最大等待时间,等待时间单位
//最多等待10s
List<CommandEntity> commands = future.get(10, TimeUnit.SECONDS);
get方法为阻塞式超过最大等待时间将抛出异常