1. SpringBoot启动主程序类:
每次直接直接启动这个启动类Application,SpringBoot就启动成功了,并且帮我们配置了好多自动配置类。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.taobao.pandora.boot.PandoraBootstrap;
/**
* Pandora Boot应用的入口类
* <p>LogUtil *
* @author xx
*/
@SpringBootApplication(scanBasePackages = {"com.alibaba.algo","com.xx.xx","com.xx.xx"})
public class Application {
public static void main(String[] args) {
PandoraBootstrap.run(args);
SpringApplication.run(Application.class, args);
PandoraBootstrap.markStartupAndWait();
}
}
注解函数:
@SpringBootApplication 源码
三个比较重要的注解:
-
@SpringBootConfiguration : Spring Boot的配置类,标注在某个类上,表示这是一个Spring Boot的配置类
-
@EnableAutoConfiguration: 开启自动配置类,SpringBoot的精华所在
-
@ComponentScan包扫描
以前我们需要配置的东西,Spring Boot帮我们自动配置;@EnableAutoConfiguration告诉SpringBoot开启自动配置功能;这样自动配置才能生效
项目实践:
Service层:Generator.xml配置自增id
<table tableName="cpw_log_save">
<generatedKey column="id" sqlStatement="SELECT LAST_INSERT_ID() as id" type="post"
identity="true"></generatedKey>
</table>
<table tableName="cpw_log_error">
<generatedKey column="id" sqlStatement="SELECT LAST_INSERT_ID() as id" type="post"
identity="true"></generatedKey>
</table>
Controller层:文件解析,字段入库
package com.alibaba.algo.controller.cpwController;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Date;
import static com.xx.xx.xx.FileWrite.pathAll;
@Controller
public class CpwLogSaveController {
public static String pathOrigin = FileRead.pathOrigin;
@Autowired
CpwLogSaveService cpwLogSaveService;
@Autowired
CpwLogSaveController cpwLogSaveController;
// 注意这里是RequestMapping 后面的内容为接口路径。此接口为logOrigin,ODPS原始日志
@RequestMapping("/logsave")
@ResponseBody
public Object runProcessTask() {
return parseData(pathOrigin, true);
}
// 读取path路径的txt文件
public CpwResultModel parseData(String path, Boolean isOrigin) {
// 文件读取必须得用try catch,文件按行读取
// 按行处理数据,一行行插入数据库
int count = 0;
try {
File file = new File(path);
BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
String s;
while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行
String result = s.trim();//去空白,末尾或者开头。去空格
if (result.equals("")) {
continue;
}
String[] array = result.split(FileWrite.rex);
count++;
if (isOrigin) {
originLogInsert(array);
}
}
br.close();
// 拷贝origin_log.txt为origin_log_copy.txt副本,删除控制台运行出原始日志origin_log.txt,防止重复请求接口导致数据重复写入
deleteOriginFileAndCopy();
// 接口结果返回字段
CpwResultModel cpwResultModel = new CpwResultModel();
cpwResultModel.setCode(Constants.CODE_SUCCESS);
cpwResultModel.setResult("success");
cpwResultModel.setCount(count);
if (count == 0) {
cpwResultModel.setError("暂无错误日志~~");
}
return cpwResultModel;
} catch (Exception e) {
e.printStackTrace();
CpwResultModel cpwResultModel = new CpwResultModel();
cpwResultModel.setCode(Constants.CODE_ERROR);
cpwResultModel.setResult("failed");
cpwResultModel.setCount(count);
cpwResultModel.setError(e.toString());
return cpwResultModel;
}
}
// private void parseError(String[] array) {
// String nowTime = array[0];
// String logTime = array[1];
// String logId = array[2];
// String appScene = array[3];
// String utdid = array[4];
// String origialParam = array[5];
//
// // 把字段解析到cpw_log_param数据表
//
// CpwLogSaveDO cpwLogParamDO = new CpwLogSaveDO();
// cpwLogParamDO.setGmtCreate(new Date());
// cpwLogParamDO.setGmtModified(new Date());
//
//
// }
// 原始日志origin_log.txt解析后字段入库
private void originLogInsert(String[] array) throws InterruptedException, IOException {
String nowTime = array[0];
String logTime = array[1];
String logId = array[2];
String appScene = array[3];
String utdid = array[4];
String originParam = array[5];
// 把字段解析到cpw_log_save数据表
CpwLogSaveDO cpwLogSaveDO = new CpwLogSaveDO();
// cpwLogSaveDO.setId((long)1);
cpwLogSaveDO.setGmtCreate(new Date());
cpwLogSaveDO.setGmtModified(new Date());
cpwLogSaveDO.setNowTime(nowTime);
cpwLogSaveDO.setLogTime(logTime);
cpwLogSaveDO.setLogId(Integer.parseInt(logId));
cpwLogSaveDO.setAppScene(appScene);
cpwLogSaveDO.setUtdid(utdid);
cpwLogSaveDO.setOriginParam(originParam);
cpwLogSaveService.insertData(cpwLogSaveDO);
}
private void deleteOriginFileAndCopy(){
// 请求接口日志入库后,拷贝本地origin_log.txt到origin_log_copy.txt 每次日志运行做备份
File origin_log = new File(pathAll + File.separator + "origin_log.txt");
File origin_log_copy = new File(pathAll + File.separator + "origin_log_copy.txt");
try {
if (origin_log_copy.exists()) {
origin_log_copy.delete();
}
System.out.println("可能没有这个文件,兼容代码===原始日志副本已删除。delete origin_log_copy.txt file ");
} catch (Exception e) {
e.printStackTrace();
}
// 拷贝副本,同步数据
FileCopy.copyFileUsingJava7Files(origin_log, origin_log_copy);
System.out.println("origin_log_copy同步完成");
// 删除正本数据,保留副本数据
FileWrite.deleteOriginLogFirstRunFile();
}
}
Model层:入库字段定义成变量,javaBeans
package com.xx.xx.xx.cpwController;
import com.xx.xx.model.CpwLogSaveDO;
import java.util.List;
// 定义接口返回参数
public class CpwResultModel {
public String code;
public String result;
public int count;
public String error;
public List<CpwLogSaveDO> list;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
public List<CpwLogSaveDO> getList() {
return list;
}
public void setList(List<CpwLogSaveDO> list) {
this.list = list;
}
}
嘻嘻嘻 头条的哥哥问的,我之前写过,只是当时是照葫芦画瓢的。。。写的仓促,时间久了忘了。。大厂的人果然nice,不会因为你没写出来给你fail。换小厂,绝对觉得你不行,会问:leetcode 1600道算法为什么不会?没完全写出来==给你挂。。。
坚持不刷题。
总结下面试经历:点点点QA面我 必挂,低T低P低级别的人面我 必挂,毕竟 谁会想招个工资比你高的呢?
小厂:你为啥不会Python?你不会这些函数,自动化怎么写的。。。
自动化很难么?遇到高T高P,我们一致认为自动化超简单,对我而言,复制粘贴 改改 运行 集成到CICD 完事了。。。