多线程 分批调用方法接口

工具类 

public abstract class BatchHandlerList<T> implements BatchHandlerInterface<T> {
	
	private static final Logger LOGGER = Logger.getLogger(BatchHandlerList.class);
	//每次处理条数
	private Integer perNum;
	
	private List<T> aylist;

	public BatchHandlerList(Integer perNum, List<T> aylist) {
		super();
		this.perNum = perNum;
		this.aylist = aylist;
	}
	
	/**
	 * 分批调用方法
	 * */
	public void handlerList(){
		try{
			if(aylist!=null && aylist.size() > 0){
				int size = aylist.size();
				int startIndex = 0;
				int endIndex = 1;
				int num = 1;
				if (size > perNum) {
					num = size / perNum;
				}
				for (int i = 1; i <= num; i++) {
					endIndex = (i) * perNum > size ? size : (i) * perNum;
					List<T> subList = aylist.subList(startIndex, endIndex);
					
					startIndex = perNum * i;
					if (subList!=null && subList.size() > 0) {
						handler(subList);
					}
					
					if (num == i && perNum * num < size) {
						//最后一批处理
						subList = aylist.subList(perNum * num, size);
						if (subList.size() > 0) {
							handler(subList);
						}
					}
			   }
			}
		}catch(Throwable e){
			LOGGER.error("batchHandlerList handler exception",e);
			//错误回调方法可以重写
			errorHandler();
		}
	}
	
	public void errorHandler(){};
}

实现方法


	   //组装数据
	   BatchHandlerList<String> handler = new BatchHandlerList<String>(20,waybillNos) {
			@Override
			public void handler(List<String> subList) {
				//这里的records用的是引用传递 后面要用
				SispInfoRequestInfoRunnable sispRunable = new SispInfoRequestInfoRunnable(subList, contextOrder, language, count, records);
				sispInfoExecutor.execute(sispRunable);
				runList.add(sispRunable);
			}
	   };
	   
	   //执行调用
	   handler.handlerList();

SispInfoRequestInfoRunnable  

import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import com.sf.iec.common.util.SispWsUtil;
import com.sf.iec.operationbusiness.sisp.bean.BarRecord;

public class SispInfoRequestInfoRunnable implements Runnable{
	protected final Logger LOGGER = Logger.getLogger(getClass());
	
	private List<String> subList;
	private String contextOrder;
	private String language;
	private Integer count;
	private Map<String, Map<String,BarRecord>> records;
	
	public SispInfoRequestInfoRunnable(List<String> subList,
			String contextOrder, String language, Integer count,
			Map<String, Map<String, BarRecord>> records) {
		super();
		this.subList = subList;
		this.contextOrder = contextOrder;
		this.language = language;
		this.count = count;
		this.records = records;
	}

	private boolean status = false; // 线程是否执行完成
	
	@Override
	public void run() {
			try{
				Map<String, Map<String,BarRecord>> recordMap = SispWsUtil.querySispRecord(subList, contextOrder,language,count);
				records.putAll(recordMap);
			}catch(Throwable e){
				LOGGER.error("SispInfoRequestInfoRunnable running exception",e);
			}finally{
				status = true;
			}
	}
	
	public boolean getStatus() {
		return status;
	}	

	public List<String> getSubList() {
		return subList;
	}

	public void setSubList(List<String> subList) {
		this.subList = subList;
	}

	public String getContextOrder() {
		return contextOrder;
	}

	public void setContextOrder(String contextOrder) {
		this.contextOrder = contextOrder;
	}

	public String getLanguage() {
		return language;
	}

	public void setLanguage(String language) {
		this.language = language;
	}

	public Integer getCount() {
		return count;
	}

	public void setCount(Integer count) {
		this.count = count;
	}

	public Map<String, Map<String, BarRecord>> getRecords() {
		return records;
	}

	public void setRecords(Map<String, Map<String, BarRecord>> records) {
		this.records = records;
	}

	public Logger getLOGGER() {
		return LOGGER;
	}

	public void setStatus(boolean status) {
		this.status = status;
	}

	public SispInfoRequestInfoRunnable(){}
}

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
利用Java多线程技术导入数据到Elasticsearch的方法步骤如下: 步骤1:引入必要的依赖 首先,需要在项目中引入Elasticsearch的Java客户端依赖,可以通过Maven或Gradle进行引入。 步骤2:创建Elasticsearch客户端 使用Elasticsearch的Java客户端创建与Elasticsearch服务器的连接。可以使用TransportClient或RestClient来进行连接。 步骤3:创建数据导入任务 创建一个数据导入任务类,实现Runnable接口,并重写run()方法。该任务类负责将数据导入到Elasticsearch中。根据需求,可以将数据分批导入,也可以按照一定规则并发导入。 步骤4:创建线程池 创建一个线程池,用于管理多个线程执行数据导入任务。可以使用Java自带的ThreadPoolExecutor类来创建线程池,并根据需求设置线程池的大小、任务队列等相关参数。 步骤5:提交任务到线程池 将数据导入任务提交到线程池中执行。可以使用execute()方法提交任务,也可以使用submit()方法提交任务并获取返回结果。 步骤6:等待任务完成 使用CountDownLatch或其他同步工具等待所有的数据导入任务完成。可以通过调用shutdown()方法关闭线程池,并在主线程中调用awaitTermination()方法等待所有任务执行完成。 步骤7:关闭Elasticsearch客户端 在数据导入完成后,关闭与Elasticsearch服务器的连接,释放资源。 步骤8:处理导入结果 根据需要,可以在任务类中添加相应的处理逻辑,比如统计导入数据的成功和失败数量,打印异常信息等。 总结: 利用Java多线程技术导入数据到Elasticsearch的主要步骤包括引入依赖、创建Elasticsearch客户端、创建数据导入任务、创建线程池、提交任务到线程池、等待任务完成、关闭客户端和处理导入结果。根据具体需求,可以灵活调整以上步骤的顺序和细节。同时,还应注意线程安全和异常处理等问题,以保证数据导入的正确性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值