前段时间遇到这样需求,需要从文件夹中读取.txt文件按照一定规则解析入库,并且在tomcat开启时,开5个线程共同去解析文件入库
解析代码如下:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.hrtel.analyzeMR.entity.XDR_General_purpose;
import com.hrtel.analyzeMR.entity.XDR_HTTP;
import com.hrtel.analyzeMR.entity.XDR_Instant_Communication;
import com.hrtel.analyzeMR.entity.XDR_S1_MME;
import com.hrtel.analyzeMR.entity.XDR_VoIP;
import com.hrtel.analyzeMR.service.AnalyzeXdrService;
public class AnalyzeXdrController {
//在springmvc中非controller类中调用service接口,以获取springmvc容器方法实现
ApplicationContext ac = new ClassPathXmlApplicationContext("spring-mybatis.xml");
AnalyzeXdrService analyzeXdrService = (AnalyzeXdrService) ac.getBean("analyzeXdrService");
/**
* 启动一个线程,定时去读取文件
* ScheduledExecutorService定时周期执行指定任务
*/
public void realTimeCommunication(){
ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
//启动一个线程每10秒钟调用一次读取文件的方法
exec.scheduleWithFixedDelay(new Runnable(){
public void run(){
readInstantCommunication();
}
},0, 10, TimeUnit.SECONDS);
}
public void realTimeMmeXdr(){
ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
//启动一个线程每10秒钟调用一次读取文件的方法
exec.scheduleWithFixedDelay(new Runnable(){
public void run(){
readSMmeXdr();
}
},0, 10, TimeUnit.SECONDS);
}
public void realTimeHttpXdr(){
ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
//启动一个线程每10秒钟调用一次读取文件的方法
exec.scheduleWithFixedDelay(new Runnable(){
public void run(){
readHttpXdr();
}
},0, 10, TimeUnit.SECONDS);
}
public void realTimeVoipXdr(){
ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
//启动一个线程每10秒钟调用一次读取文件的方法
exec.scheduleWithFixedDelay(new Runnable(){
public void run(){
readVoipXdr();
}
},0, 10, TimeUnit.SECONDS);
}
public void realTimePurposeXdr(){
ScheduledExecutorService exec = Executors.newScheduledThreadPool(1);
//启动一个线程每10秒钟调用一次读取文件的方法
exec.scheduleWithFixedDelay(new Runnable(){
public void run(){
readGeneralPurposeXdr();
}
},0, 10, TimeUnit.SECONDS);
}
/**
* 解析即时通信
*/
public void readInstantCommunication(){
BufferedReader br;
InputStreamReader inputStreamReader;
FileInputStream fileInputStream;
// String uri = "E:/xdr/jishitongxin";
String uri = "/sdb/xdr_msg";
List<XDR_Instant_Communication> list = new ArrayList<XDR_Instant_Communication>();
//计时
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SS");
TimeZone t = sdf.getTimeZone();
t.setRawOffset(0);
sdf.setTimeZone(t);
Long startTime = System.currentTimeMillis();
//计时
File mrefile = new File(uri);
File[] array = mrefile.listFiles();
for(int i=0;i<array.length;i++){
File file = array[i];
String inFileName = array[i].getPath();
System.out.println("路径"+inFileName);
try {
fileInputStream = new FileInputStream(inFileName);
inputStreamReader =new InputStreamReader(fileInputStream);
br = new BufferedReader(inputStreamReader);
String line = "";
while((line=br.readLine())!=null){
String[] str = line.split("\\|");
if(str.length == 56){
XDR_Instant_Communication ic = new XDR_Instant_Communication(str[0],str[1],str[2], str[3], str[4], str[5], str[6], str[7], str[8], str[9], str[10], str[11], str[12], str[13], str[14],
str[15], str[16], str[17], str[18], str[19], str[20], str[21], str[22], str[23], str[24], str[25], str[26], str[27], str[28], str[29], str[30], str[31], str[32], str[33],
str[34], str[35], str[36], str[37], str[38