初始化自动分段项目
parent
521de09dca
commit
fa09517f5b
@ -0,0 +1,17 @@
|
||||
package com.docus.server.common.config;
|
||||
|
||||
import com.docus.infrastructure.WebConfig;
|
||||
import com.docus.infrastructure.web.json.JsonSerializerModule;
|
||||
import com.docus.server.common.serializer.DefJsonSerializerModule;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@Configuration
|
||||
public class DefaultWebConfig extends WebConfig {
|
||||
|
||||
@Override
|
||||
public JsonSerializerModule jsonSerializerModu1e() {
|
||||
super.jsonSerializerModu1e();
|
||||
return new DefJsonSerializerModule();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.docus.server.common.serializer;
|
||||
|
||||
import com.docus.core.util.Convert;
|
||||
import com.docus.infrastructure.web.json.JsonSerializerModule;
|
||||
import com.fasterxml.jackson.core.JsonGenerator;
|
||||
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.time.ZoneId;
|
||||
import java.util.Date;
|
||||
import java.util.TimeZone;
|
||||
|
||||
public class DefJsonSerializerModule extends JsonSerializerModule {
|
||||
public DefJsonSerializerModule() {
|
||||
|
||||
addSerializer(Date.class, new JsonSerializer<Date>() {
|
||||
@Override
|
||||
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
|
||||
jsonGenerator.writeString(date == null ? null : Convert.toString(date, Convert.DATA_FORMAT_DATETIME_SLASH, TimeZone.getTimeZone(ZoneId.systemDefault())));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,64 @@
|
||||
package com.docus.server.common.serializer;
|
||||
|
||||
import org.springframework.core.convert.converter.Converter;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 全局handler前日期统一处理
|
||||
*/
|
||||
@Component
|
||||
public class StringToDateConverter implements Converter<String, Date> {
|
||||
|
||||
private static final List<String> DATE_FORMARTS = new ArrayList<>(4);
|
||||
|
||||
static {
|
||||
DATE_FORMARTS.add("yyyy-MM");
|
||||
DATE_FORMARTS.add("yyyy-MM-dd");
|
||||
DATE_FORMARTS.add("yyyy-MM-dd hh:mm");
|
||||
DATE_FORMARTS.add("yyyy-MM-dd hh:mm:ss");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date convert(String source) {
|
||||
String value = source.trim();
|
||||
if ("".equals(value)) {
|
||||
return null;
|
||||
}
|
||||
if (source.matches("^\\d{4}-\\d{1,2}$")) {
|
||||
return parseDate(source, DATE_FORMARTS.get(0));
|
||||
} else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) {
|
||||
return parseDate(source, DATE_FORMARTS.get(1));
|
||||
} else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {
|
||||
return parseDate(source, DATE_FORMARTS.get(2));
|
||||
} else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
|
||||
return parseDate(source, DATE_FORMARTS.get(3));
|
||||
} else {
|
||||
throw new IllegalArgumentException("Invalid boolean value '" + source + "'");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化日期
|
||||
*
|
||||
* @param dateStr String 字符型日期
|
||||
* @param format String 格式
|
||||
* @return Date 日期
|
||||
*/
|
||||
public Date parseDate(String dateStr, String format) {
|
||||
Date date = null;
|
||||
try {
|
||||
DateFormat dateFormat = new SimpleDateFormat(format);
|
||||
date = dateFormat.parse(dateStr);
|
||||
} catch (Exception e) {
|
||||
System.out.println(String.format("日期%s转换%s错误", dateStr, format));
|
||||
}
|
||||
return date;
|
||||
}
|
||||
|
||||
}
|
Binary file not shown.
@ -0,0 +1,73 @@
|
||||
<assembly xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/assembly-1.0.0.xsd">
|
||||
|
||||
<id>exe</id>
|
||||
<formats>
|
||||
<format>dir</format>
|
||||
</formats>
|
||||
<includeBaseDirectory>false</includeBaseDirectory>
|
||||
|
||||
<fileSets>
|
||||
|
||||
<fileSet>
|
||||
<outputDirectory>/lib</outputDirectory>
|
||||
<directory>${basedir}/target/lib</directory>
|
||||
</fileSet>
|
||||
|
||||
<fileSet>
|
||||
<outputDirectory>/config</outputDirectory>
|
||||
<directory>${basedir}/target/resources</directory>
|
||||
<fileMode>0755</fileMode>
|
||||
<includes>
|
||||
<include>*.xml</include>
|
||||
<include>*.yml</include>
|
||||
<include>*.properties</include>
|
||||
</includes>
|
||||
</fileSet>
|
||||
|
||||
<fileSet>
|
||||
<outputDirectory>/dataConfig</outputDirectory>
|
||||
<directory>${basedir}/target/dataConfig</directory>
|
||||
<fileMode>0755</fileMode>
|
||||
<includes>
|
||||
<include>*.json</include>
|
||||
</includes>
|
||||
</fileSet>
|
||||
|
||||
<fileSet>
|
||||
<outputDirectory>/</outputDirectory>
|
||||
<directory>${basedir}/target/resources/bin</directory>
|
||||
<fileMode>0755</fileMode>
|
||||
<includes>
|
||||
<include>*.bat</include>
|
||||
</includes>
|
||||
</fileSet>
|
||||
|
||||
<fileSet>
|
||||
<outputDirectory>/</outputDirectory>
|
||||
<directory>${basedir}/target/resources/bin</directory>
|
||||
<fileMode>0755</fileMode>
|
||||
<includes>
|
||||
<include>*.xml</include>
|
||||
</includes>
|
||||
</fileSet>
|
||||
|
||||
<fileSet>
|
||||
<outputDirectory>/</outputDirectory>
|
||||
<directory>${basedir}</directory>
|
||||
<fileMode>0755</fileMode>
|
||||
<includes>
|
||||
<include>*.exe</include>
|
||||
</includes>
|
||||
</fileSet>
|
||||
<!-- 将项目启动jar打包到boot目录中 -->
|
||||
<fileSet>
|
||||
<directory>${basedir}/target</directory>
|
||||
<outputDirectory>/</outputDirectory>
|
||||
<fileMode>0755</fileMode>
|
||||
<includes>
|
||||
<include>${project.build.finalName}.jar</include>
|
||||
</includes>
|
||||
</fileSet>
|
||||
</fileSets>
|
||||
</assembly>
|
@ -0,0 +1,16 @@
|
||||
package com.docus.server;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.cloud.openfeign.EnableFeignClients;
|
||||
import org.springframework.scheduling.annotation.EnableAsync;
|
||||
|
||||
@EnableAsync
|
||||
@EnableFeignClients(basePackages = {"com.docus.core.excel.feign", "com.docus.server.api"})
|
||||
@SpringBootApplication(scanBasePackages = {"com.docus"})
|
||||
public class SegmentationBootstrap {
|
||||
public static void main(String[] args) {
|
||||
System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
|
||||
SpringApplication.run(SegmentationBootstrap.class, args);
|
||||
}
|
||||
}
|
@ -0,0 +1,68 @@
|
||||
package com.docus.server.common;
|
||||
|
||||
public class MsgConstants {
|
||||
|
||||
/**
|
||||
* 客户端与采集调度器心跳
|
||||
*/
|
||||
public static final String HEARTBEAT_REQUEST = "0";
|
||||
|
||||
/**
|
||||
* 客户端上线注册
|
||||
*/
|
||||
public static final String ONLINE_REGISTER = "1";
|
||||
|
||||
/**
|
||||
* 客户端下线移除
|
||||
*/
|
||||
public static final String OFFLINE_REMOVE = "2";
|
||||
|
||||
/**
|
||||
* 客户端异常注册
|
||||
*/
|
||||
public static final String EXCEPTION_REMOVE = "3";
|
||||
|
||||
/**
|
||||
* 终端重启命令
|
||||
*/
|
||||
public static final String TERMINATOR_RESTART = "4";
|
||||
|
||||
/**
|
||||
* 采集器重启命令
|
||||
*/
|
||||
public static final String COLLECTOR_RESTART = "5";
|
||||
|
||||
/**
|
||||
* 虚拟机重启命令
|
||||
*/
|
||||
public static final String VIRTUAL_RESTART = "6";
|
||||
|
||||
/**
|
||||
* 更新采集器文件命令
|
||||
*/
|
||||
public static final String UPDATE_COLLECTOR_FILE = "7";
|
||||
|
||||
/**
|
||||
* 更新采集器配置命令
|
||||
*/
|
||||
public static final String UPDATE_COLLECTOR_CONFIG = "8";
|
||||
|
||||
/**
|
||||
* 采集调度器下发任务命令
|
||||
*/
|
||||
public static final String SCH_DISTRIBUTE_TASKS = "9";
|
||||
/**
|
||||
* 接收采集器上报的任务
|
||||
*/
|
||||
public static final String REV_COLLECTOR_TASK = "10";
|
||||
|
||||
/**
|
||||
* 是否有可用类型的采集器命令
|
||||
*/
|
||||
public static final String HAS_VALID_COLLECTOR = "11";
|
||||
|
||||
/**
|
||||
* 获取终端采集器数据量命令
|
||||
*/
|
||||
public static final String HAS_COLLECTOR_COUNT = "12";
|
||||
}
|
@ -0,0 +1,52 @@
|
||||
package com.docus.server.common;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.docus.server.api.scheduling.management.SchVirtualLogApi;
|
||||
import com.docus.server.common.utils.SystemInfoUtils;
|
||||
import com.docus.server.dto.scheduling.management.schvirtuallog.AddSchVirtualLogDTO;
|
||||
import com.xxl.job.core.util.IpUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Date;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class SchVirtualLogTask {
|
||||
|
||||
@Resource
|
||||
private SchVirtualLogApi schVirtualLogApi;
|
||||
|
||||
//定时任务
|
||||
// 5 * * * * ? 在每分钟的5秒执行
|
||||
@Scheduled(cron = "${docus.vm-task-cron}")
|
||||
public void runTask() {
|
||||
try {
|
||||
log.info("收集虚拟机信息定时任务: 开始执行");
|
||||
|
||||
JSONObject info = SystemInfoUtils.getInfo();
|
||||
|
||||
AddSchVirtualLogDTO addSchVirtualLogDTO = new AddSchVirtualLogDTO();
|
||||
addSchVirtualLogDTO.setCpuUtilization((String) ((JSONObject) info.get("cpuInfo")).get("cSys"));
|
||||
addSchVirtualLogDTO.setMemoryTotal((String) ((JSONObject) info.get("memInfo")).get("total"));
|
||||
addSchVirtualLogDTO.setMemoryAllowance((String) ((JSONObject) info.get("memInfo")).get("free"));
|
||||
addSchVirtualLogDTO.setUplinkRate((String) ((JSONObject) info.get("networkInfo")).get("txPercent"));
|
||||
addSchVirtualLogDTO.setDescendingRate((String) ((JSONObject) info.get("networkInfo")).get("rxPercent"));
|
||||
addSchVirtualLogDTO.setIp(IpUtil.getIp());
|
||||
addSchVirtualLogDTO.setClientTime(new Date());
|
||||
addSchVirtualLogDTO.setDiskJson(info.get("sysFileInfo").toString());
|
||||
schVirtualLogApi.add(addSchVirtualLogDTO);
|
||||
System.out.println(info);
|
||||
|
||||
log.info("收集虚拟机信息定时任务: 执行完毕");
|
||||
} catch (Exception e) {
|
||||
log.error("收集虚拟机信息定时任务执行出错", e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,154 @@
|
||||
package com.docus.server.common.download;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import sun.misc.BASE64Decoder;
|
||||
import sun.misc.BASE64Encoder;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
|
||||
@Slf4j
|
||||
public class Base64Utils {
|
||||
private static Base64Utils utils =null;
|
||||
private Base64Utils(){
|
||||
|
||||
}
|
||||
public static Base64Utils getInstance(){
|
||||
if(utils==null){
|
||||
synchronized (Base64Utils.class){
|
||||
if(utils == null){
|
||||
utils = new Base64Utils();
|
||||
}
|
||||
}
|
||||
}
|
||||
return utils;
|
||||
}
|
||||
|
||||
public String imageToBase64Str(String imgFile) {
|
||||
InputStream inputStream = null;
|
||||
byte[] data = null;
|
||||
try {
|
||||
inputStream = new FileInputStream(imgFile);
|
||||
data = new byte[inputStream.available()];
|
||||
inputStream.read(data);
|
||||
inputStream.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
// 加密
|
||||
BASE64Encoder encoder = new BASE64Encoder();
|
||||
return encoder.encode(data);
|
||||
}
|
||||
|
||||
|
||||
public byte[] base64StrToBytes(String imgStr) {
|
||||
if (imgStr == null) {
|
||||
return null;
|
||||
}
|
||||
String[] s = imgStr.split(",");
|
||||
if(s.length>0){
|
||||
imgStr=s[1];
|
||||
}
|
||||
BASE64Decoder decoder = new BASE64Decoder();
|
||||
try {
|
||||
// 解密
|
||||
byte[] b = decoder.decodeBuffer(imgStr);
|
||||
// 处理数据
|
||||
for (int i = 0; i < b.length; ++i) {
|
||||
if (b[i] < 0) {
|
||||
b[i] += 256;
|
||||
}
|
||||
}
|
||||
return b;
|
||||
} catch (Exception e) {
|
||||
log.error("Base64 转 byte[] 出错啦!",e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public boolean base64StrToImage(byte[] bytes, String path) {
|
||||
if (bytes == null) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
//文件夹不存在则自动创建
|
||||
File tempFile = new File(path);
|
||||
if (!tempFile.getParentFile().exists()) {
|
||||
tempFile.getParentFile().mkdirs();
|
||||
}
|
||||
OutputStream out = new FileOutputStream(tempFile);
|
||||
out.write(bytes);
|
||||
out.flush();
|
||||
out.close();
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
log.error("图片文件下载失败:"+e.getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean base64StrToImage(String imgStr, String path) {
|
||||
if (imgStr == null) {
|
||||
return false;
|
||||
}
|
||||
String[] s = imgStr.split(",");
|
||||
if(s.length>0){
|
||||
imgStr=s[1];
|
||||
}
|
||||
BASE64Decoder decoder = new BASE64Decoder();
|
||||
try {
|
||||
// 解密
|
||||
byte[] b = decoder.decodeBuffer(imgStr);
|
||||
// 处理数据
|
||||
for (int i = 0; i < b.length; ++i) {
|
||||
if (b[i] < 0) {
|
||||
b[i] += 256;
|
||||
}
|
||||
}
|
||||
//文件夹不存在则自动创建
|
||||
File tempFile = new File(path);
|
||||
if (!tempFile.getParentFile().exists()) {
|
||||
tempFile.getParentFile().mkdirs();
|
||||
}
|
||||
OutputStream out = new FileOutputStream(tempFile);
|
||||
out.write(b);
|
||||
out.flush();
|
||||
out.close();
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
log.error("图片文件下载失败:"+e.getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int getFileSize(File inFile){
|
||||
InputStream in =null;
|
||||
try{
|
||||
in= new FileInputStream(inFile);
|
||||
int len =in.available();
|
||||
return len;
|
||||
}
|
||||
catch (Exception e){
|
||||
|
||||
}
|
||||
finally {
|
||||
try{
|
||||
in.close();
|
||||
}
|
||||
catch (IOException e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println(Base64Utils.getInstance().imageToBase64Str("e:\\1.jpg"));
|
||||
}
|
||||
}
|
@ -0,0 +1,67 @@
|
||||
package com.docus.server.common.download;
|
||||
|
||||
import com.docus.core.util.SpringUtils;
|
||||
import com.docus.server.common.download.downLoader.HttpDownloader;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
|
||||
public class DownloadManager {
|
||||
|
||||
private static Logger logger = LoggerFactory.getLogger(DownloadManager.class);
|
||||
|
||||
enum ProtocolType {HTTP, HTTPS, FTP, BASE64, SMB, OTHER}
|
||||
|
||||
;
|
||||
|
||||
public static void feedLinks(Collection<RemoteLocalPair> list, int maxHttpRetry) {
|
||||
for (RemoteLocalPair pair : list) {
|
||||
ProtocolType deal = getLinkProtocol(pair.remoteUrl);
|
||||
if (deal == ProtocolType.HTTP || deal == ProtocolType.HTTPS) {
|
||||
HttpDownload(pair, maxHttpRetry);
|
||||
} else if (deal == ProtocolType.FTP) {
|
||||
} else if (deal == ProtocolType.BASE64) {
|
||||
} else if (deal == ProtocolType.SMB) {
|
||||
} else {
|
||||
logger.error(pair.remoteUrl + " Url is not http or ftp!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void HttpDownload(RemoteLocalPair pair, int maxHttpRetry) {
|
||||
//GeneralDownloadInfo info = new GeneralDownloadInfo(pair);
|
||||
NoCheckPointInfo info = new NoCheckPointInfo(pair);
|
||||
HttpDownloader downloader = new HttpDownloader(info, maxHttpRetry);
|
||||
downloader.intiCallBack(SpringUtils.getBean(IDownCallBack.class));
|
||||
//可以用thread.start()不过不建议
|
||||
downloader.run();
|
||||
}
|
||||
|
||||
|
||||
protected static ProtocolType getLinkProtocol(String link) {
|
||||
int idx = link.indexOf("://");
|
||||
if (idx == -1) {
|
||||
if (link.contains("base64")) {
|
||||
return ProtocolType.BASE64;
|
||||
}
|
||||
return ProtocolType.OTHER;
|
||||
}
|
||||
String name = link.substring(0, idx);
|
||||
if (name.equals("http")) {
|
||||
return ProtocolType.HTTP;
|
||||
}
|
||||
if (name.equals("https")) {
|
||||
return ProtocolType.HTTPS;
|
||||
}
|
||||
if (name.equals("ftp")) {
|
||||
return ProtocolType.FTP;
|
||||
}
|
||||
if (name.equals("smb")) {
|
||||
return ProtocolType.SMB;
|
||||
}
|
||||
return ProtocolType.OTHER;
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package com.docus.server.common.download;
|
||||
|
||||
public class FileCheckPoints {
|
||||
public int statecode;
|
||||
public long timestamp = -99;
|
||||
public long totalSize = -99;
|
||||
private int split = -1;
|
||||
private long[] startPos;
|
||||
private long[] endPos;
|
||||
|
||||
public long[] getStartPos() {
|
||||
return startPos;
|
||||
}
|
||||
|
||||
public void setStartPos(long[] startPos) {
|
||||
split = startPos.length;
|
||||
this.startPos = startPos;
|
||||
}
|
||||
|
||||
public long[] getEndPos() {
|
||||
return endPos;
|
||||
}
|
||||
|
||||
public void setEndPos(long[] endPos) {
|
||||
split = endPos.length;
|
||||
this.endPos = endPos;
|
||||
}
|
||||
|
||||
public int getSplit() {
|
||||
return split;
|
||||
}
|
||||
|
||||
public void copy(FileCheckPoints _chp) {
|
||||
this.setEndPos(_chp.endPos);
|
||||
this.setStartPos(_chp.startPos);
|
||||
this.totalSize = _chp.totalSize;
|
||||
this.timestamp = _chp.timestamp;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package com.docus.server.common.download;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class FtpInfo {
|
||||
private String ip;
|
||||
private Integer port;
|
||||
private String user;
|
||||
private String pwd;
|
||||
}
|
@ -0,0 +1,143 @@
|
||||
package com.docus.server.common.download;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Properties;
|
||||
|
||||
public class GlobalData {
|
||||
|
||||
/**
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
|
||||
}
|
||||
|
||||
private Properties properties;
|
||||
private String filePath;
|
||||
|
||||
private GlobalData(String filePath) {
|
||||
this.filePath = filePath;
|
||||
properties = loadProperties(filePath);
|
||||
}
|
||||
|
||||
//===================================
|
||||
private Properties loadProperties(String filePath) {
|
||||
InputStream is;
|
||||
try {
|
||||
is = new BufferedInputStream(new FileInputStream(new File(filePath)));
|
||||
Properties properties = new Properties();
|
||||
properties.load(is);
|
||||
return properties;
|
||||
} catch (FileNotFoundException e) {
|
||||
// e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
// e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Properties getProperties() {
|
||||
return properties;
|
||||
}
|
||||
|
||||
public void setPropertity(String key, String value) {
|
||||
FileOutputStream oFile;
|
||||
try {
|
||||
properties.setProperty(key, value);
|
||||
oFile = new FileOutputStream(filePath);
|
||||
properties.store(oFile, "add counter!");
|
||||
oFile.close();
|
||||
} catch (IOException e) {
|
||||
// e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public String getTempDir() {
|
||||
String path = properties.getProperty("TEMP_PATH");
|
||||
File dir = new File(path);
|
||||
if (!dir.exists()) {
|
||||
try {
|
||||
dir.mkdir();
|
||||
} catch (SecurityException e) {
|
||||
// e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
public String getParserDir() {
|
||||
String path = properties.getProperty("PARSER_DIR");
|
||||
File dir = new File(path);
|
||||
if (!dir.exists()) {
|
||||
try {
|
||||
dir.mkdir();
|
||||
} catch (SecurityException e) {
|
||||
// e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
public String getHomoGoaUrl() {
|
||||
return properties.getProperty("GO_HOMO_GOA_GZ_LINK");
|
||||
}
|
||||
|
||||
public String getGoBasicOboUrl() {
|
||||
return properties.getProperty("GO_OBO_BASIC_LINK");
|
||||
}
|
||||
|
||||
public String getGoOboUrl() {
|
||||
return properties.getProperty("GO_OBO_LINK");
|
||||
}
|
||||
|
||||
public String getGoOwlUrl() {
|
||||
return properties.getProperty("GO_OWL_LINK");
|
||||
}
|
||||
|
||||
public String getGoOwlPlusUrl() {
|
||||
return properties.getProperty("GO_OWL_PLUS_LINK");
|
||||
}
|
||||
|
||||
public String getDoOboUrl() {
|
||||
return properties.getProperty("DO_OBO_LINK");
|
||||
}
|
||||
|
||||
public String getProOboUrl() {
|
||||
return properties.getProperty("PRO_OBO_LINK");
|
||||
}
|
||||
|
||||
public String getChebiOboUrl() {
|
||||
return properties.getProperty("CHEBI_OBO_LINK");
|
||||
}
|
||||
|
||||
public String getLocalGoBasicPath() {
|
||||
String goUrl = getGoBasicOboUrl();
|
||||
return getTempDir() + File.separator + GlobalData.getFileName(goUrl);
|
||||
}
|
||||
|
||||
//====================================
|
||||
private static GlobalData single;
|
||||
private static Object lock = new Object();
|
||||
|
||||
//====================================
|
||||
public static String getFileName(String url) {
|
||||
return url.substring(url.lastIndexOf("/") + 1, url.length());
|
||||
}
|
||||
|
||||
public static GlobalData getInstance() {
|
||||
synchronized (lock) {
|
||||
if (single == null) {
|
||||
single = new GlobalData("configure/settings.properties");
|
||||
}
|
||||
return single;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package com.docus.server.common.download;
|
||||
|
||||
public interface IDownCallBack {
|
||||
void success(CallBackPara para);
|
||||
|
||||
void fail(CallBackPara para);
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package com.docus.server.common.download;
|
||||
|
||||
public class MultiDownFile {
|
||||
public MultiDownFile(String remoteUrl, String localPath, String localName) {
|
||||
this.remoteUrl = remoteUrl;
|
||||
this.localPath = localPath;
|
||||
this.localName = localName;
|
||||
}
|
||||
|
||||
private String remoteUrl;
|
||||
private String localPath;
|
||||
private String localName;
|
||||
|
||||
public String getRemoteUrl() {
|
||||
return remoteUrl;
|
||||
}
|
||||
|
||||
public void setRemoteUrl(String remoteUrl) {
|
||||
this.remoteUrl = remoteUrl;
|
||||
}
|
||||
|
||||
public String getLocalPath() {
|
||||
return localPath;
|
||||
}
|
||||
|
||||
public void setLocalPath(String localPath) {
|
||||
this.localPath = localPath;
|
||||
}
|
||||
|
||||
public String getLocalName() {
|
||||
return localName;
|
||||
}
|
||||
|
||||
public void setLocalName(String localName) {
|
||||
this.localName = localName;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,73 @@
|
||||
package com.docus.server.common.download;
|
||||
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* 使用这个info可以实现无断线续传功能的下载
|
||||
*
|
||||
* @author burkun
|
||||
*/
|
||||
public class NoCheckPointInfo implements IDownloadInfo {
|
||||
|
||||
|
||||
private boolean isDownloding;
|
||||
|
||||
public NoCheckPointInfo(RemoteLocalPair pair) {
|
||||
this.pair = pair;
|
||||
File file = new File(pair.localPath);
|
||||
if (!file.exists()) {
|
||||
file.mkdirs();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initDownload() {
|
||||
isDownloding = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isNeedDownload(FileCheckPoints serverInitChp) {
|
||||
chp = serverInitChp;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean writeInfo(FileCheckPoints chkp) {
|
||||
chp = chkp;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FileCheckPoints getCurCheckPoints() {
|
||||
return chp;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FileCheckPoints readInfo() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void downloadDone(FileCheckPoints chkp) {
|
||||
isDownloding = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RemoteLocalPair getPair() {
|
||||
return pair;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSplitNum() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
public boolean IsDownloading() {
|
||||
return isDownloding;
|
||||
}
|
||||
|
||||
private RemoteLocalPair pair;
|
||||
private FileCheckPoints chp = null;
|
||||
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package com.docus.server.common.download;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Properties;
|
||||
import java.util.UUID;
|
||||
|
||||
public class Tools {
|
||||
public static UUID getRandomUUID() {
|
||||
return UUID.randomUUID();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param filename propertiy file path
|
||||
* @return
|
||||
* @author burkun
|
||||
*/
|
||||
public static Properties readPropertiesFile(String filename) {
|
||||
Properties properties = new Properties();
|
||||
try {
|
||||
InputStream inputs = new FileInputStream(filename);
|
||||
properties.load(inputs);
|
||||
inputs.close();
|
||||
} catch (IOException e) {
|
||||
// e.printStackTrace();
|
||||
}
|
||||
return properties;
|
||||
}
|
||||
}
|
@ -0,0 +1,313 @@
|
||||
package com.docus.server.common.utils;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import oshi.SystemInfo;
|
||||
import oshi.hardware.CentralProcessor;
|
||||
import oshi.hardware.GlobalMemory;
|
||||
import oshi.hardware.HardwareAbstractionLayer;
|
||||
import oshi.hardware.NetworkIF;
|
||||
import oshi.software.os.FileSystem;
|
||||
import oshi.software.os.OSFileStore;
|
||||
import oshi.software.os.OperatingSystem;
|
||||
import oshi.util.Util;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.Formatter;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Properties;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
/**
|
||||
* 系统消息工具类
|
||||
**/
|
||||
public class SystemInfoUtils {
|
||||
|
||||
private static final int OSHI_WAIT_SECOND = 1000;
|
||||
private static final int SLEEP_TIME = 2 * 1000;
|
||||
private static SystemInfo systemInfo = new SystemInfo();
|
||||
private static HardwareAbstractionLayer hardware = systemInfo.getHardware();
|
||||
private static OperatingSystem operatingSystem = systemInfo.getOperatingSystem();
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
JSONObject info = getInfo();
|
||||
System.out.println(info);
|
||||
}
|
||||
|
||||
public static JSONObject getCpuInfo() {
|
||||
JSONObject cpuInfo = new JSONObject();
|
||||
CentralProcessor processor = hardware.getProcessor();
|
||||
// CPU信息
|
||||
long[] prevTicks = processor.getSystemCpuLoadTicks();
|
||||
Util.sleep(OSHI_WAIT_SECOND);
|
||||
long[] ticks = processor.getSystemCpuLoadTicks();
|
||||
long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
|
||||
long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
|
||||
long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
|
||||
long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
|
||||
long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
|
||||
long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
|
||||
long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
|
||||
long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
|
||||
long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
|
||||
//cpu核数
|
||||
cpuInfo.put("cpuNum", processor.getLogicalProcessorCount());
|
||||
//cpu系统使用率
|
||||
cpuInfo.put("cSys", new DecimalFormat("#.##%").format(cSys * 1.0 / totalCpu));
|
||||
//cpu用户使用率
|
||||
cpuInfo.put("user", new DecimalFormat("#.##%").format(user * 1.0 / totalCpu));
|
||||
//cpu当前等待率
|
||||
cpuInfo.put("iowait", new DecimalFormat("#.##%").format(iowait * 1.0 / totalCpu));
|
||||
//cpu当前使用率
|
||||
cpuInfo.put("idle", new DecimalFormat("#.##%").format(1.0 - (idle * 1.0 / totalCpu)));
|
||||
return cpuInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 系统jvm信息
|
||||
*/
|
||||
public static JSONObject getJvmInfo() {
|
||||
JSONObject cpuInfo = new JSONObject();
|
||||
Properties props = System.getProperties();
|
||||
Runtime runtime = Runtime.getRuntime();
|
||||
long jvmTotalMemoryByte = runtime.totalMemory();
|
||||
long freeMemoryByte = runtime.freeMemory();
|
||||
//jvm总内存
|
||||
cpuInfo.put("total", formatByte(runtime.totalMemory()));
|
||||
//空闲空间
|
||||
cpuInfo.put("free", formatByte(runtime.freeMemory()));
|
||||
//jvm最大可申请
|
||||
cpuInfo.put("max", formatByte(runtime.maxMemory()));
|
||||
//vm已使用内存
|
||||
cpuInfo.put("user", formatByte(jvmTotalMemoryByte - freeMemoryByte));
|
||||
//jvm内存使用率
|
||||
cpuInfo.put("usageRate", new DecimalFormat("#.##%").format((jvmTotalMemoryByte - freeMemoryByte) * 1.0 / jvmTotalMemoryByte));
|
||||
//jdk版本
|
||||
cpuInfo.put("jdkVersion", props.getProperty("java.version"));
|
||||
//jdk路径
|
||||
cpuInfo.put("jdkHome", props.getProperty("java.home"));
|
||||
return cpuInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 系统内存信息
|
||||
*/
|
||||
public static JSONObject getMemInfo() {
|
||||
JSONObject cpuInfo = new JSONObject();
|
||||
GlobalMemory memory = systemInfo.getHardware().getMemory();
|
||||
//总内存
|
||||
long totalByte = memory.getTotal();
|
||||
//剩余
|
||||
long acaliableByte = memory.getAvailable();
|
||||
//总内存
|
||||
cpuInfo.put("total", formatByte(totalByte));
|
||||
//使用
|
||||
cpuInfo.put("used", formatByte(totalByte - acaliableByte));
|
||||
//剩余内存
|
||||
cpuInfo.put("free", formatByte(acaliableByte));
|
||||
//使用率
|
||||
cpuInfo.put("usageRate", new DecimalFormat("#.##%").format((totalByte - acaliableByte) * 1.0 / totalByte));
|
||||
return cpuInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 带宽
|
||||
*/
|
||||
public static JSONArray networkIFs() throws Exception {
|
||||
JSONObject cpuInfo;
|
||||
JSONArray sysFiles = new JSONArray();
|
||||
|
||||
List<NetworkIF> networkIFs = systemInfo.getHardware().getNetworkIFs();
|
||||
for (NetworkIF networkIF : networkIFs) {
|
||||
String name = networkIF.getName();
|
||||
long receiveBytes = networkIF.getBytesRecv();
|
||||
long transmitBytes = networkIF.getBytesSent();
|
||||
|
||||
cpuInfo = new JSONObject();
|
||||
//名称
|
||||
cpuInfo.put("name", name);
|
||||
//网络接收
|
||||
cpuInfo.put("receiveBytes", formatNumber(receiveBytes / (1024.0 * (2 * 1000 / 1000))));
|
||||
//网络发送
|
||||
cpuInfo.put("transmitBytes", formatNumber(transmitBytes / (1024.0 * (2 * 1000 / 1000))));
|
||||
|
||||
sysFiles.add(cpuInfo);
|
||||
}
|
||||
return sysFiles;
|
||||
}
|
||||
|
||||
public static JSONObject getNetWork() {
|
||||
JSONObject networkInfo = new JSONObject();
|
||||
Properties props = System.getProperties();
|
||||
String os = props.getProperty("os.name").toLowerCase();
|
||||
os = os.startsWith("win") ? "windows" : "linux";
|
||||
Map<String, String> result = new HashMap<>();
|
||||
Process pro = null;
|
||||
Runtime r = Runtime.getRuntime();
|
||||
BufferedReader input = null;
|
||||
try {
|
||||
String command = "windows".equals(os) ? "netstat -e" : "ifconfig";
|
||||
pro = r.exec(command);
|
||||
input = new BufferedReader(new InputStreamReader(pro.getInputStream()));
|
||||
long result1[] = readInLine(input, os);
|
||||
Thread.sleep(SLEEP_TIME);
|
||||
pro.destroy();
|
||||
input.close();
|
||||
pro = r.exec(command);
|
||||
input = new BufferedReader(new InputStreamReader(pro.getInputStream()));
|
||||
long result2[] = readInLine(input, os);
|
||||
String rxPercent = formatNumber((result2[0] - result1[0]) / (1024.0 * (SLEEP_TIME / 1000)));// 下行速率(kB/s)
|
||||
String txPercent = formatNumber((result2[1] - result1[1]) / (1024.0 * (SLEEP_TIME / 1000)));// 上行速率(kB/s)
|
||||
networkInfo.put("rxPercent", rxPercent);
|
||||
networkInfo.put("txPercent", txPercent);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (input != null) {
|
||||
try {
|
||||
input.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
Optional.ofNullable(pro).ifPresent(p -> p.destroy());
|
||||
}
|
||||
return networkInfo;
|
||||
}
|
||||
|
||||
private static long[] readInLine(BufferedReader input, String osType) {
|
||||
long arr[] = new long[2];
|
||||
StringTokenizer tokenStat = null;
|
||||
try {
|
||||
if (osType.equals("linux")) { // 获取linux环境下的网口上下行速率
|
||||
long rx = 0, tx = 0;
|
||||
String line = null;
|
||||
//RX packets:4171603 errors:0 dropped:0 overruns:0 frame:0
|
||||
//TX packets:4171603 errors:0 dropped:0 overruns:0 carrier:0
|
||||
while ((line = input.readLine()) != null) {
|
||||
if (line.indexOf("RX packets") >= 0) {
|
||||
rx += Long.parseLong(line.substring(line.indexOf("RX packets") + 11, line.indexOf(" ", line.indexOf("RX packets") + 11)));
|
||||
} else if (line.indexOf("TX packets") >= 0) {
|
||||
tx += Long.parseLong(line.substring(line.indexOf("TX packets") + 11, line.indexOf(" ", line.indexOf("TX packets") + 11)));
|
||||
}
|
||||
}
|
||||
arr[0] = rx;
|
||||
arr[1] = tx;
|
||||
} else { // 获取windows环境下的网口上下行速率
|
||||
input.readLine();
|
||||
input.readLine();
|
||||
input.readLine();
|
||||
input.readLine();
|
||||
tokenStat = new StringTokenizer(input.readLine());
|
||||
tokenStat.nextToken();
|
||||
arr[0] = Long.parseLong(tokenStat.nextToken());
|
||||
arr[1] = Long.parseLong(tokenStat.nextToken());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
|
||||
|
||||
private static String formatNumber(double f) {
|
||||
return new Formatter().format("%.2f", f).toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 系统盘符信息
|
||||
*/
|
||||
public static JSONArray getSysFileInfo() {
|
||||
JSONObject cpuInfo;
|
||||
JSONArray sysFiles = new JSONArray();
|
||||
FileSystem fileSystem = operatingSystem.getFileSystem();
|
||||
List<OSFileStore> fsArray = fileSystem.getFileStores();
|
||||
for (OSFileStore fs : fsArray) {
|
||||
cpuInfo = new JSONObject();
|
||||
//盘符路径
|
||||
cpuInfo.put("dirName", fs.getMount());
|
||||
//盘符类型
|
||||
cpuInfo.put("sysTypeName", fs.getType());
|
||||
//文件类型
|
||||
cpuInfo.put("typeName", fs.getName());
|
||||
//总大小
|
||||
cpuInfo.put("total", formatByte(fs.getTotalSpace()));
|
||||
//剩余大小
|
||||
cpuInfo.put("free", formatByte(fs.getUsableSpace()));
|
||||
//已经使用量
|
||||
cpuInfo.put("used", formatByte(fs.getTotalSpace() - fs.getUsableSpace()));
|
||||
if (fs.getTotalSpace() == 0) {
|
||||
//资源的使用率
|
||||
cpuInfo.put("usage", 0);
|
||||
} else {
|
||||
cpuInfo.put("usage", new DecimalFormat("#.##%").format((fs.getTotalSpace() - fs.getUsableSpace()) * 1.0 / fs.getTotalSpace()));
|
||||
}
|
||||
sysFiles.add(cpuInfo);
|
||||
}
|
||||
return sysFiles;
|
||||
}
|
||||
|
||||
/**
|
||||
* 系统信息
|
||||
*/
|
||||
public static JSONObject getSysInfo() throws UnknownHostException {
|
||||
JSONObject cpuInfo = new JSONObject();
|
||||
Properties props = System.getProperties();
|
||||
//操作系统名
|
||||
cpuInfo.put("osName", props.getProperty("os.name"));
|
||||
//系统架构
|
||||
cpuInfo.put("osArch", props.getProperty("os.arch"));
|
||||
//服务器名称
|
||||
cpuInfo.put("computerName", InetAddress.getLocalHost().getHostName());
|
||||
//服务器Ip
|
||||
cpuInfo.put("computerIp", InetAddress.getLocalHost().getHostAddress());
|
||||
//项目路径
|
||||
cpuInfo.put("userDir", props.getProperty("user.dir"));
|
||||
return cpuInfo;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 所有系统信息
|
||||
*/
|
||||
public static JSONObject getInfo() throws Exception {
|
||||
JSONObject info = new JSONObject();
|
||||
info.put("cpuInfo", getCpuInfo());
|
||||
info.put("jvmInfo", getJvmInfo());
|
||||
info.put("memInfo", getMemInfo());
|
||||
info.put("sysInfo", getSysInfo());
|
||||
info.put("sysFileInfo", getSysFileInfo());
|
||||
info.put("networkInfo", getNetWork());
|
||||
return info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 单位转换
|
||||
*/
|
||||
private static String formatByte(long byteNumber) {
|
||||
//换算单位
|
||||
double FORMAT = 1024.0;
|
||||
double kbNumber = byteNumber / FORMAT;
|
||||
if (kbNumber < FORMAT) {
|
||||
return new DecimalFormat("#.##KB").format(kbNumber);
|
||||
}
|
||||
double mbNumber = kbNumber / FORMAT;
|
||||
if (mbNumber < FORMAT) {
|
||||
return new DecimalFormat("#.##MB").format(mbNumber);
|
||||
}
|
||||
double gbNumber = mbNumber / FORMAT;
|
||||
if (gbNumber < FORMAT) {
|
||||
return new DecimalFormat("#.##GB").format(gbNumber);
|
||||
}
|
||||
double tbNumber = gbNumber / FORMAT;
|
||||
return new DecimalFormat("#.##TB").format(tbNumber);
|
||||
}
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
package com.docus.server.controller;
|
||||
|
||||
import com.docus.server.service.IFileUploadService;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiImplicitParam;
|
||||
import io.swagger.annotations.ApiImplicitParams;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
/**
|
||||
* 文件上传下载 API
|
||||
*
|
||||
* @author AutoGenerator
|
||||
* @since 2023-07-15
|
||||
*/
|
||||
@Api(value = "通用文件上传下载接口", tags = "通用文件上传下载接口")
|
||||
@RestController
|
||||
@RequestMapping("/file")
|
||||
public class FileController {
|
||||
@Resource
|
||||
private IFileUploadService iFileUploadService;
|
||||
|
||||
@ApiOperation("文件下载")
|
||||
@GetMapping("/download")
|
||||
public void downloadFile(String filePath, HttpServletResponse response) throws Exception {
|
||||
iFileUploadService.downloadFile(filePath, response);
|
||||
}
|
||||
|
||||
@ApiOperation("文件上传")
|
||||
@PostMapping("/upload")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "files", value = "文件", required = true, dataTypeClass = MultipartFile.class)
|
||||
})
|
||||
public void uploadFile(MultipartFile[] files, String pathKey) throws Exception {
|
||||
iFileUploadService.uploadFile(files, pathKey);
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package com.docus.server.infrastructure.cache;
|
||||
|
||||
import com.docus.server.annotation.CacheLayer;
|
||||
|
||||
@CacheLayer("schetaskCacheLayer")
|
||||
public class TaskCacheLayer {
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
package com.docus.server.infrastructure.client;
|
||||
|
||||
public class DownLoadAPI {
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package com.docus.server.service;
|
||||
|
||||
import com.docus.server.vo.scheduling.management.schcollectorversionfile.UploadFileVO;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
|
||||
public interface IFileUploadService {
|
||||
|
||||
List<UploadFileVO> uploadFile(MultipartFile[] multipartFiles, String pathKey) throws Exception;
|
||||
|
||||
void downloadFile(String filePath, HttpServletResponse response);
|
||||
}
|
@ -0,0 +1,137 @@
|
||||
package com.docus.server.service.impl;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.docus.core.util.Func;
|
||||
import com.docus.infrastructure.web.exception.ApiException;
|
||||
import com.docus.infrastructure.web.exception.ExceptionCode;
|
||||
import com.docus.server.service.IFileUploadService;
|
||||
import com.docus.server.vo.scheduling.management.schcollectorversionfile.UploadFileVO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import javax.servlet.ServletOutputStream;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.net.URLEncoder;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class FileUploadServiceImpl implements IFileUploadService {
|
||||
|
||||
@Value("${file.uploadFolder:D://docus/}")
|
||||
private String saveFilePath;
|
||||
|
||||
private static final String COLLECTOR_PACKAGES = "collector_packages";
|
||||
|
||||
private static DateTimeFormatter ymdDtf = DateTimeFormatter.ofPattern("yyyyMMdd");
|
||||
|
||||
@Override
|
||||
public List<UploadFileVO> uploadFile(MultipartFile[] multipartFiles, String pathKey) throws Exception {
|
||||
|
||||
if (Func.isBlank(pathKey)) {
|
||||
pathKey = COLLECTOR_PACKAGES;
|
||||
}
|
||||
|
||||
List<UploadFileVO> uploadFileVOList = new ArrayList<>();
|
||||
|
||||
for (MultipartFile multipartFile : multipartFiles) {
|
||||
|
||||
valid(multipartFile);
|
||||
|
||||
uploadFileVOList.add(actionUploadFile(multipartFile, pathKey));
|
||||
}
|
||||
return uploadFileVOList;
|
||||
|
||||
}
|
||||
|
||||
private UploadFileVO actionUploadFile(MultipartFile multipartFile, String pathKey) throws Exception {
|
||||
|
||||
String todayFormat = ymdDtf.format(LocalDateTime.now());
|
||||
|
||||
String path = pathKey + "/" + todayFormat + "/" + UUID.randomUUID().toString() + "/";
|
||||
File fileDir = new File(saveFilePath + path);
|
||||
if (!fileDir.exists()) {
|
||||
fileDir.mkdirs();
|
||||
}
|
||||
String fileName = path + multipartFile.getOriginalFilename();
|
||||
|
||||
File dest = new File(saveFilePath + fileName);
|
||||
|
||||
multipartFile.transferTo(dest);
|
||||
|
||||
|
||||
UploadFileVO uploadFileVO = new UploadFileVO();
|
||||
uploadFileVO.setFileName(multipartFile.getOriginalFilename());
|
||||
uploadFileVO.setFileSize(multipartFile.getSize());
|
||||
uploadFileVO.setFileTitle(multipartFile.getName());
|
||||
uploadFileVO.setFileType(multipartFile.getContentType());
|
||||
uploadFileVO.setFilePath(fileName);
|
||||
|
||||
return uploadFileVO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void downloadFile(String path, HttpServletResponse response) {
|
||||
|
||||
try {
|
||||
//获取要下载的文件
|
||||
File file = new File(saveFilePath + "/" + path);
|
||||
|
||||
//设置响应的内容类型为二进制流,即文件类型
|
||||
response.setContentType("application/octet-stream");
|
||||
|
||||
//设置文件名
|
||||
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
|
||||
|
||||
//创建输入流
|
||||
FileInputStream inputStream = new FileInputStream(file);
|
||||
BufferedInputStream buffInputStream = new BufferedInputStream(inputStream);
|
||||
|
||||
//创建输出流
|
||||
ServletOutputStream outputStream = response.getOutputStream();
|
||||
BufferedOutputStream buffOutputStream = new BufferedOutputStream(outputStream);
|
||||
|
||||
//循环读取数据并写入到响应输出流中
|
||||
byte[] buffer = new byte[1024];
|
||||
int len = -1;
|
||||
while ((len = buffInputStream.read(buffer)) != -1) {
|
||||
buffOutputStream.write(buffer, 0, len);
|
||||
}
|
||||
|
||||
//关闭流
|
||||
buffOutputStream.flush();
|
||||
buffOutputStream.close();
|
||||
outputStream.flush();
|
||||
outputStream.close();
|
||||
buffInputStream.close();
|
||||
inputStream.close();
|
||||
} catch (Exception e) {
|
||||
log.error(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
private void valid(MultipartFile multipartFile) {
|
||||
if (multipartFile.isEmpty()) {
|
||||
throw new ApiException(ExceptionCode.ParamIllegal.getCode(), "上传失败,请选择文件!");
|
||||
}
|
||||
|
||||
String originalFilename = multipartFile.getOriginalFilename();
|
||||
if (StrUtil.isBlank(originalFilename)) {
|
||||
throw new ApiException(ExceptionCode.ParamIllegal.getCode(), "未找到原文件文件名!");
|
||||
}
|
||||
if (!originalFilename.contains(".")) {
|
||||
throw new ApiException(ExceptionCode.ParamIllegal.getCode(), "原文件名未识别到后缀!");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
#当前项目的根package
|
||||
api.base-package=com.docus.server
|
||||
|
||||
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
|
||||
spring.datasource.url=jdbc:mysql://db.docus.cn:3306/docus-collector-scheduling?autoReconnect=true&allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
|
||||
spring.datasource.username=docus
|
||||
spring.datasource.password=docus702
|
||||
|
||||
mybatis-plus.type-enums-package=com.docus.server.enums
|
@ -0,0 +1,6 @@
|
||||
@echo off
|
||||
|
||||
|
||||
WinSW.exe status|findstr NonExistent && winsw install
|
||||
|
||||
WinSW.exe status|findstr stopped && winsw start
|
@ -0,0 +1,21 @@
|
||||
@echo off
|
||||
|
||||
set deployDir=%1\@project.artifactId@
|
||||
if %deployDir%=="" set deployDir=d:\webroot\@project.artifactId@
|
||||
|
||||
set curr_file=%cd%
|
||||
cd /d %deployDir%
|
||||
call stop.bat
|
||||
sc query @project.artifactId@ |Find "RUNNING" && ping 127.0.0.1 -n 10 >nul
|
||||
cd %curr_file%
|
||||
rd/s/q %deployDir%\lib
|
||||
rd/s/q %deployDir%\dataConfig
|
||||
rd/s/q %deployDir%\config
|
||||
rd/s/q %deployDir%\mybatis.mapper
|
||||
del /s/q %deployDir%\*.jar
|
||||
xcopy /Y/E/I * %deployDir%
|
||||
|
||||
cd /d %deployDir%
|
||||
call auto.bat
|
||||
cd %curr_file%
|
||||
|
@ -0,0 +1,21 @@
|
||||
set java_opts=-Xms512m -Xmx512m
|
||||
set key="java_opts"
|
||||
|
||||
|
||||
rem 文件不存在,就跳过
|
||||
if not exist java-ops.ini goto end
|
||||
|
||||
for /f "tokens=1,2 delims==" %%i in (java-ops.ini) do (
|
||||
if "%%i"==%key% set java_opts=%%j)
|
||||
echo java_opts is : %java_opts%
|
||||
|
||||
:end
|
||||
|
||||
rem 启动java
|
||||
|
||||
java %java_opts% -Dfile.encoding=utf-8 -jar -Dspring.profiles.active=@profile.name@ -Dloader.path=config,lib @project.build.finalName@.jar
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,3 @@
|
||||
@echo off
|
||||
|
||||
winsw stop
|
@ -0,0 +1,47 @@
|
||||
@echo off
|
||||
|
||||
set curr_file=%cd%
|
||||
|
||||
set parentDir=%1
|
||||
if %parentDir%=="" set deployDir=d:\webroot
|
||||
|
||||
|
||||
set deployDir=%parentDir%\@project.artifactId@
|
||||
|
||||
set backupDir=%parentDir%\backup
|
||||
|
||||
set dateStr=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
|
||||
|
||||
|
||||
cd /d %deployDir%
|
||||
|
||||
call stop.bat
|
||||
sc query @project.artifactId@ |Find "RUNNING" && ping 127.0.0.1 -n 10 >nul
|
||||
|
||||
cd /d %parentDir%
|
||||
|
||||
xcopy /Y/E/I project.artifactId@\lib %backupDir%\%dateStr%\@project.artifactId@lib
|
||||
xcopy /Y/E/I project.artifactId@\config %backupDir%\%dateStr%\@project.artifactId@config
|
||||
xcopy /Y/E/I project.artifactId@\*.jar %backupDir%\%dateStr%\@project.artifactId@
|
||||
xcopy /Y/E/I project.artifactId@\*.bat %backupDir%\%dateStr%\@project.artifactId@
|
||||
xcopy /Y/E/I project.artifactId@\*.exe %backupDir%\%dateStr%\@project.artifactId@
|
||||
xcopy /Y/E/I project.artifactId@\*.xml %backupDir%\%dateStr%\@project.artifactId@
|
||||
|
||||
|
||||
cd %curr_file%
|
||||
|
||||
rd/s/q %deployDir%\lib
|
||||
rd/s/q %deployDir%\config
|
||||
del /s/q %deployDir%\*.jar
|
||||
|
||||
|
||||
xcopy /Y/E/I lib %deployDir%\lib
|
||||
xcopy /Y/E/I config %deployDir%\config
|
||||
xcopy /Y/E/I *.jar %deployDir%
|
||||
xcopy /Y/E/I *.bat %deployDir%
|
||||
xcopy /Y/E/I *.exe %deployDir%
|
||||
xcopy /Y/E/I *.xml %deployDir%
|
||||
|
||||
cd /d %deployDir%
|
||||
call auto.bat
|
||||
cd %curr_file%
|
@ -0,0 +1,10 @@
|
||||
<service>
|
||||
<id>docus-segmentation</id>
|
||||
<name>生产-自动分段(docus-segmentation)-服务</name>
|
||||
<description>生产-自动分段(docus-segmentation)-服务</description>
|
||||
<startmode>Automatic</startmode>
|
||||
<executable>%BASE%\start.bat</executable>
|
||||
<log mode="none"></log>
|
||||
<depend>nacos</depend>
|
||||
<depend>seata-server</depend>
|
||||
</service>
|
@ -0,0 +1,2 @@
|
||||
# If you use SLF4J. First, you need to tell log4jdbc-log4j2 that you want to use the SLF4J logger
|
||||
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
|
@ -0,0 +1,56 @@
|
||||
package com.docus.server;
|
||||
|
||||
import oshi.SystemInfo;
|
||||
import oshi.hardware.CentralProcessor;
|
||||
import oshi.hardware.GlobalMemory;
|
||||
import oshi.hardware.HardwareAbstractionLayer;
|
||||
import oshi.hardware.NetworkIF;
|
||||
import oshi.software.os.FileSystem;
|
||||
import oshi.software.os.OSFileStore;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class Example {
|
||||
public static void main(String[] args) {
|
||||
SystemInfo systemInfo = new SystemInfo();
|
||||
CentralProcessor processor = systemInfo.getHardware().getProcessor();
|
||||
int logicalProcessorCount = processor.getLogicalProcessorCount();
|
||||
String cpuModel = processor.getProcessorIdentifier().getName();
|
||||
long[] systemCpuLoadTicks = processor.getSystemCpuLoadTicks();
|
||||
|
||||
System.out.println(logicalProcessorCount);
|
||||
System.out.println(cpuModel);
|
||||
System.out.println(Arrays.asList(systemCpuLoadTicks));
|
||||
|
||||
GlobalMemory memory = systemInfo.getHardware().getMemory();
|
||||
long totalMemorySize = memory.getTotal();
|
||||
long availableMemorySize = memory.getAvailable();
|
||||
double memoryUsage = (totalMemorySize - availableMemorySize) * 100.0 / totalMemorySize;
|
||||
System.out.println(totalMemorySize);
|
||||
System.out.println(availableMemorySize);
|
||||
System.out.println(memoryUsage);
|
||||
|
||||
HardwareAbstractionLayer hal = systemInfo.getHardware();
|
||||
FileSystem fileSystem = systemInfo.getOperatingSystem().getFileSystem();
|
||||
List<OSFileStore> fileStores = fileSystem.getFileStores();
|
||||
for (OSFileStore store : fileStores) {
|
||||
long totalSpace = store.getTotalSpace();
|
||||
long usableSpace = store.getUsableSpace();
|
||||
double usage = (totalSpace - usableSpace) * 100.0 / totalSpace;
|
||||
System.out.println(totalSpace);
|
||||
System.out.println(usableSpace);
|
||||
System.out.println(usage);
|
||||
}
|
||||
|
||||
List<NetworkIF> networkIFs = systemInfo.getHardware().getNetworkIFs();
|
||||
for (NetworkIF networkIF : networkIFs) {
|
||||
String name = networkIF.getName();
|
||||
long receiveBytes = networkIF.getBytesRecv();
|
||||
long transmitBytes = networkIF.getBytesSent();
|
||||
System.out.println(name);
|
||||
System.out.println(receiveBytes);
|
||||
System.out.println(transmitBytes);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package com.docus.server;
|
||||
|
||||
import cn.hutool.core.util.ZipUtil;
|
||||
import com.docus.server.common.download.downLoader.HttpDownloader;
|
||||
import com.docus.server.common.utils.StartUpExeUtils;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
/**
|
||||
* 文件上传下载 API
|
||||
*
|
||||
* @author AutoGenerator
|
||||
* @since 2023-07-15
|
||||
*/
|
||||
@SpringBootTest
|
||||
public class FileController {
|
||||
|
||||
public static void test() throws Exception {
|
||||
/**
|
||||
* 1、接收调度器下载采集器包命令
|
||||
* 2、下载保存到指定部署路径
|
||||
* 3、启动采集器
|
||||
*/
|
||||
|
||||
HttpDownloader httpDownloader = new HttpDownloader(null);
|
||||
String url = "http://192.168.16.110:9113/sch/file/download?filePath=collector_packages/20230718/91d930e6-0490-44e5-9756-caee3251d645/navicat.zip";
|
||||
String fileName = "collector.zip";
|
||||
String savePath = "H:\\docus\\1"; //部署路径
|
||||
String procName = "navicat.exe"; //进程名称
|
||||
|
||||
httpDownloader.downLoadFromUrl(url, fileName, savePath);
|
||||
|
||||
ZipUtil.unzip(savePath + "\\" + fileName, savePath + "\\collector");
|
||||
|
||||
StartUpExeUtils.startUpExe(savePath + "\\collector\\" + procName, procName);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
test();
|
||||
}
|
||||
|
||||
public static void test1() throws Exception {
|
||||
ZipUtil.unzip("/Users/linruifeng/Desktop/collector_packages/collector.zip", "/Users/linruifeng/Desktop/collector_packages");
|
||||
// ZipUtil.unGzip(new GZIPInputStream(new FileInputStream(new File("/Users/linruifeng/Desktop/collector_packages/index.tar.gz"))));
|
||||
// FileUtils.unTarGz("/Users/linruifeng/Desktop/collector_packages/", "/Users/linruifeng/Desktop/collector_packages/test");
|
||||
}
|
||||
}
|
@ -0,0 +1,162 @@
|
||||
package com.docus.server;
|
||||
|
||||
import org.apache.tools.tar.TarInputStream;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
/**
|
||||
* @program: JavaCode
|
||||
* @ClassName FileUtils
|
||||
* @description:
|
||||
* @author: ltcz99
|
||||
* @create: 2023-04-16
|
||||
* @Version 1.0
|
||||
**/
|
||||
public class FileUtils {
|
||||
|
||||
|
||||
/**
|
||||
* 解压tar.gz文件到指定目录
|
||||
*
|
||||
* @param sourceDir 源文件夹
|
||||
* @param destDir 解压后的目标文件夹
|
||||
*/
|
||||
public static void unTarGz(String sourceDir, String destDir) throws Exception {
|
||||
File outFile = new File(sourceDir);
|
||||
File[] files = outFile.listFiles();
|
||||
try {
|
||||
//创建输出目录
|
||||
createDirectory(destDir, null);
|
||||
TarInputStream tarIn;
|
||||
int index = 1;
|
||||
for (File file : files) {
|
||||
if (file.getName().contains("tar.gz")) {
|
||||
tarIn = new TarInputStream(new GZIPInputStream(
|
||||
new BufferedInputStream(new FileInputStream(file))),
|
||||
1024 * 2);
|
||||
|
||||
String outFileName = destDir + "/" + file.getName();
|
||||
OutputStream out = new FileOutputStream(new File(outFileName));
|
||||
int length = 0;
|
||||
byte[] b = new byte[2048];
|
||||
while ((length = tarIn.read(b)) != -1) {
|
||||
out.write(b, 0, length);
|
||||
}
|
||||
out.close();
|
||||
tarIn.close();
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 解压gz到指定的文件夹下面
|
||||
*
|
||||
* @param sourceDir
|
||||
* @param destDir
|
||||
*/
|
||||
public static void unGzipFile(String sourceDir, String destDir) {
|
||||
//创建输出目录
|
||||
createDirectory(destDir, null);
|
||||
File sourceFile = new File(sourceDir);
|
||||
File[] files = sourceFile.listFiles();
|
||||
try {
|
||||
int index = 1;
|
||||
for (File file : files) {
|
||||
if (file.getName().contains("gz")) {
|
||||
FileInputStream fin = new FileInputStream(file);
|
||||
//建立gzip解压工作流
|
||||
GZIPInputStream gzin = new GZIPInputStream(fin);
|
||||
//建立解压文件输出流
|
||||
File tmpFile = new File(destDir + "/" + index++ + ".log");
|
||||
FileOutputStream fout = new FileOutputStream(tmpFile);
|
||||
int length;
|
||||
byte[] buf = new byte[2048];
|
||||
while ((length = gzin.read(buf, 0, buf.length)) != -1) {
|
||||
fout.write(buf, 0, length);
|
||||
}
|
||||
gzin.close();
|
||||
fout.close();
|
||||
fin.close();
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
System.err.println(ex);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取文件到指定的文件夹下面
|
||||
*
|
||||
* @param sourceLogPath
|
||||
* @param destLogPath
|
||||
*/
|
||||
public static void readFileToDestLogPath(String sourceLogPath, String destLogPath) {
|
||||
File sourceFile = new File(sourceLogPath);
|
||||
File[] files = sourceFile.listFiles();
|
||||
for (File file : files) {
|
||||
String fileName = destLogPath + "/" + file.getName();
|
||||
File destFile = new File(fileName);
|
||||
if (file.getName().contains("log") && !fileName.contains("gz")) {
|
||||
try {
|
||||
if (destFile.exists()) {
|
||||
destFile.delete();
|
||||
}
|
||||
String logFile = sourceFile + "/" + file.getName();
|
||||
FileInputStream fis = new FileInputStream(logFile);
|
||||
FileOutputStream fos = new FileOutputStream(destFile);
|
||||
BufferedInputStream bis = new BufferedInputStream(fis);
|
||||
BufferedOutputStream bos = new BufferedOutputStream(fos);
|
||||
int len = 0;
|
||||
while ((len = bis.read()) != -1) {
|
||||
bos.write(len);
|
||||
}
|
||||
bos.flush();
|
||||
// 关闭资源
|
||||
fis.close();
|
||||
bis.close();
|
||||
fos.close();
|
||||
bos.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建目录
|
||||
*
|
||||
* @param outputDir
|
||||
* @param subDir
|
||||
*/
|
||||
public static void createDirectory(String outputDir, String subDir) {
|
||||
File file = new File(outputDir);
|
||||
//子目录不为空
|
||||
if (!(subDir == null || subDir.trim().equals(""))) {
|
||||
file = new File(outputDir + "/" + subDir);
|
||||
}
|
||||
if (!file.exists()) {
|
||||
if (!file.getParentFile().exists()) {
|
||||
file.getParentFile().mkdirs();
|
||||
}
|
||||
file.mkdirs();
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
String sourceDir = "/Users/ltcz99/Downloads/templog";
|
||||
String destDir = "/Users/ltcz99/Downloads/unzip/";
|
||||
//解压.gz文件到指定的文件件下面
|
||||
unGzipFile(sourceDir, destDir);
|
||||
// 解压tar.gz文件到指定的文件夹下面
|
||||
unTarGz(sourceDir, destDir);
|
||||
//读取特定的文件到指定的文件夹下面
|
||||
readFileToDestLogPath(sourceDir, destDir);
|
||||
}
|
||||
}
|
@ -0,0 +1,313 @@
|
||||
package com.docus.server;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import oshi.SystemInfo;
|
||||
import oshi.hardware.CentralProcessor;
|
||||
import oshi.hardware.GlobalMemory;
|
||||
import oshi.hardware.HardwareAbstractionLayer;
|
||||
import oshi.hardware.NetworkIF;
|
||||
import oshi.software.os.FileSystem;
|
||||
import oshi.software.os.OSFileStore;
|
||||
import oshi.software.os.OperatingSystem;
|
||||
import oshi.util.Util;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.Formatter;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Properties;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
/**
|
||||
* 系统消息工具类
|
||||
**/
|
||||
public class SystemInfoUtils {
|
||||
|
||||
private static final int OSHI_WAIT_SECOND = 1000;
|
||||
private static final int SLEEP_TIME = 2 * 1000;
|
||||
private static SystemInfo systemInfo = new SystemInfo();
|
||||
private static HardwareAbstractionLayer hardware = systemInfo.getHardware();
|
||||
private static OperatingSystem operatingSystem = systemInfo.getOperatingSystem();
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
JSONObject info = getInfo();
|
||||
System.out.println(info);
|
||||
}
|
||||
|
||||
public static JSONObject getCpuInfo() {
|
||||
JSONObject cpuInfo = new JSONObject();
|
||||
CentralProcessor processor = hardware.getProcessor();
|
||||
// CPU信息
|
||||
long[] prevTicks = processor.getSystemCpuLoadTicks();
|
||||
Util.sleep(OSHI_WAIT_SECOND);
|
||||
long[] ticks = processor.getSystemCpuLoadTicks();
|
||||
long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
|
||||
long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
|
||||
long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
|
||||
long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
|
||||
long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
|
||||
long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
|
||||
long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
|
||||
long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
|
||||
long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
|
||||
//cpu核数
|
||||
cpuInfo.put("cpuNum", processor.getLogicalProcessorCount());
|
||||
//cpu系统使用率
|
||||
cpuInfo.put("cSys", new DecimalFormat("#.##%").format(cSys * 1.0 / totalCpu));
|
||||
//cpu用户使用率
|
||||
cpuInfo.put("user", new DecimalFormat("#.##%").format(user * 1.0 / totalCpu));
|
||||
//cpu当前等待率
|
||||
cpuInfo.put("iowait", new DecimalFormat("#.##%").format(iowait * 1.0 / totalCpu));
|
||||
//cpu当前使用率
|
||||
cpuInfo.put("idle", new DecimalFormat("#.##%").format(1.0 - (idle * 1.0 / totalCpu)));
|
||||
return cpuInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 系统jvm信息
|
||||
*/
|
||||
public static JSONObject getJvmInfo() {
|
||||
JSONObject cpuInfo = new JSONObject();
|
||||
Properties props = System.getProperties();
|
||||
Runtime runtime = Runtime.getRuntime();
|
||||
long jvmTotalMemoryByte = runtime.totalMemory();
|
||||
long freeMemoryByte = runtime.freeMemory();
|
||||
//jvm总内存
|
||||
cpuInfo.put("total", formatByte(runtime.totalMemory()));
|
||||
//空闲空间
|
||||
cpuInfo.put("free", formatByte(runtime.freeMemory()));
|
||||
//jvm最大可申请
|
||||
cpuInfo.put("max", formatByte(runtime.maxMemory()));
|
||||
//vm已使用内存
|
||||
cpuInfo.put("user", formatByte(jvmTotalMemoryByte - freeMemoryByte));
|
||||
//jvm内存使用率
|
||||
cpuInfo.put("usageRate", new DecimalFormat("#.##%").format((jvmTotalMemoryByte - freeMemoryByte) * 1.0 / jvmTotalMemoryByte));
|
||||
//jdk版本
|
||||
cpuInfo.put("jdkVersion", props.getProperty("java.version"));
|
||||
//jdk路径
|
||||
cpuInfo.put("jdkHome", props.getProperty("java.home"));
|
||||
return cpuInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 系统内存信息
|
||||
*/
|
||||
public static JSONObject getMemInfo() {
|
||||
JSONObject cpuInfo = new JSONObject();
|
||||
GlobalMemory memory = systemInfo.getHardware().getMemory();
|
||||
//总内存
|
||||
long totalByte = memory.getTotal();
|
||||
//剩余
|
||||
long acaliableByte = memory.getAvailable();
|
||||
//总内存
|
||||
cpuInfo.put("total", formatByte(totalByte));
|
||||
//使用
|
||||
cpuInfo.put("used", formatByte(totalByte - acaliableByte));
|
||||
//剩余内存
|
||||
cpuInfo.put("free", formatByte(acaliableByte));
|
||||
//使用率
|
||||
cpuInfo.put("usageRate", new DecimalFormat("#.##%").format((totalByte - acaliableByte) * 1.0 / totalByte));
|
||||
return cpuInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 带宽
|
||||
*/
|
||||
public static JSONArray networkIFs() throws Exception {
|
||||
JSONObject cpuInfo;
|
||||
JSONArray sysFiles = new JSONArray();
|
||||
|
||||
List<NetworkIF> networkIFs = systemInfo.getHardware().getNetworkIFs();
|
||||
for (NetworkIF networkIF : networkIFs) {
|
||||
String name = networkIF.getName();
|
||||
long receiveBytes = networkIF.getBytesRecv();
|
||||
long transmitBytes = networkIF.getBytesSent();
|
||||
|
||||
cpuInfo = new JSONObject();
|
||||
//名称
|
||||
cpuInfo.put("name", name);
|
||||
//网络接收
|
||||
cpuInfo.put("receiveBytes", formatNumber(receiveBytes / (1024.0 * (2 * 1000 / 1000))));
|
||||
//网络发送
|
||||
cpuInfo.put("transmitBytes", formatNumber(transmitBytes / (1024.0 * (2 * 1000 / 1000))));
|
||||
|
||||
sysFiles.add(cpuInfo);
|
||||
}
|
||||
return sysFiles;
|
||||
}
|
||||
|
||||
public static JSONObject getNetWork() {
|
||||
JSONObject networkInfo = new JSONObject();
|
||||
Properties props = System.getProperties();
|
||||
String os = props.getProperty("os.name").toLowerCase();
|
||||
os = os.startsWith("win") ? "windows" : "linux";
|
||||
Map<String, String> result = new HashMap<>();
|
||||
Process pro = null;
|
||||
Runtime r = Runtime.getRuntime();
|
||||
BufferedReader input = null;
|
||||
try {
|
||||
String command = "windows".equals(os) ? "netstat -e" : "ifconfig";
|
||||
pro = r.exec(command);
|
||||
input = new BufferedReader(new InputStreamReader(pro.getInputStream()));
|
||||
long result1[] = readInLine(input, os);
|
||||
Thread.sleep(SLEEP_TIME);
|
||||
pro.destroy();
|
||||
input.close();
|
||||
pro = r.exec(command);
|
||||
input = new BufferedReader(new InputStreamReader(pro.getInputStream()));
|
||||
long result2[] = readInLine(input, os);
|
||||
String rxPercent = formatNumber((result2[0] - result1[0]) / (1024.0 * (SLEEP_TIME / 1000)));// 下行速率(kB/s)
|
||||
String txPercent = formatNumber((result2[1] - result1[1]) / (1024.0 * (SLEEP_TIME / 1000)));// 上行速率(kB/s)
|
||||
networkInfo.put("rxPercent", rxPercent);
|
||||
networkInfo.put("txPercent", txPercent);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (input != null) {
|
||||
try {
|
||||
input.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
Optional.ofNullable(pro).ifPresent(p -> p.destroy());
|
||||
}
|
||||
return networkInfo;
|
||||
}
|
||||
|
||||
private static long[] readInLine(BufferedReader input, String osType) {
|
||||
long arr[] = new long[2];
|
||||
StringTokenizer tokenStat = null;
|
||||
try {
|
||||
if (osType.equals("linux")) { // 获取linux环境下的网口上下行速率
|
||||
long rx = 0, tx = 0;
|
||||
String line = null;
|
||||
//RX packets:4171603 errors:0 dropped:0 overruns:0 frame:0
|
||||
//TX packets:4171603 errors:0 dropped:0 overruns:0 carrier:0
|
||||
while ((line = input.readLine()) != null) {
|
||||
if (line.indexOf("RX packets") >= 0) {
|
||||
rx += Long.parseLong(line.substring(line.indexOf("RX packets") + 11, line.indexOf(" ", line.indexOf("RX packets") + 11)));
|
||||
} else if (line.indexOf("TX packets") >= 0) {
|
||||
tx += Long.parseLong(line.substring(line.indexOf("TX packets") + 11, line.indexOf(" ", line.indexOf("TX packets") + 11)));
|
||||
}
|
||||
}
|
||||
arr[0] = rx;
|
||||
arr[1] = tx;
|
||||
} else { // 获取windows环境下的网口上下行速率
|
||||
input.readLine();
|
||||
input.readLine();
|
||||
input.readLine();
|
||||
input.readLine();
|
||||
tokenStat = new StringTokenizer(input.readLine());
|
||||
tokenStat.nextToken();
|
||||
arr[0] = Long.parseLong(tokenStat.nextToken());
|
||||
arr[1] = Long.parseLong(tokenStat.nextToken());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
|
||||
|
||||
private static String formatNumber(double f) {
|
||||
return new Formatter().format("%.2f", f).toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 系统盘符信息
|
||||
*/
|
||||
public static JSONArray getSysFileInfo() {
|
||||
JSONObject cpuInfo;
|
||||
JSONArray sysFiles = new JSONArray();
|
||||
FileSystem fileSystem = operatingSystem.getFileSystem();
|
||||
List<OSFileStore> fsArray = fileSystem.getFileStores();
|
||||
for (OSFileStore fs : fsArray) {
|
||||
cpuInfo = new JSONObject();
|
||||
//盘符路径
|
||||
cpuInfo.put("dirName", fs.getMount());
|
||||
//盘符类型
|
||||
cpuInfo.put("sysTypeName", fs.getType());
|
||||
//文件类型
|
||||
cpuInfo.put("typeName", fs.getName());
|
||||
//总大小
|
||||
cpuInfo.put("total", formatByte(fs.getTotalSpace()));
|
||||
//剩余大小
|
||||
cpuInfo.put("free", formatByte(fs.getUsableSpace()));
|
||||
//已经使用量
|
||||
cpuInfo.put("used", formatByte(fs.getTotalSpace() - fs.getUsableSpace()));
|
||||
if (fs.getTotalSpace() == 0) {
|
||||
//资源的使用率
|
||||
cpuInfo.put("usage", 0);
|
||||
} else {
|
||||
cpuInfo.put("usage", new DecimalFormat("#.##%").format((fs.getTotalSpace() - fs.getUsableSpace()) * 1.0 / fs.getTotalSpace()));
|
||||
}
|
||||
sysFiles.add(cpuInfo);
|
||||
}
|
||||
return sysFiles;
|
||||
}
|
||||
|
||||
/**
|
||||
* 系统信息
|
||||
*/
|
||||
public static JSONObject getSysInfo() throws UnknownHostException {
|
||||
JSONObject cpuInfo = new JSONObject();
|
||||
Properties props = System.getProperties();
|
||||
//操作系统名
|
||||
cpuInfo.put("osName", props.getProperty("os.name"));
|
||||
//系统架构
|
||||
cpuInfo.put("osArch", props.getProperty("os.arch"));
|
||||
//服务器名称
|
||||
cpuInfo.put("computerName", InetAddress.getLocalHost().getHostName());
|
||||
//服务器Ip
|
||||
cpuInfo.put("computerIp", InetAddress.getLocalHost().getHostAddress());
|
||||
//项目路径
|
||||
cpuInfo.put("userDir", props.getProperty("user.dir"));
|
||||
return cpuInfo;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 所有系统信息
|
||||
*/
|
||||
public static JSONObject getInfo() throws Exception {
|
||||
JSONObject info = new JSONObject();
|
||||
info.put("cpuInfo", getCpuInfo());
|
||||
info.put("jvmInfo", getJvmInfo());
|
||||
info.put("memInfo", getMemInfo());
|
||||
info.put("sysInfo", getSysInfo());
|
||||
info.put("sysFileInfo", getSysFileInfo());
|
||||
info.put("networkInfo", getNetWork());
|
||||
return info;
|
||||
}
|
||||
|
||||
/**
|
||||
* 单位转换
|
||||
*/
|
||||
private static String formatByte(long byteNumber) {
|
||||
//换算单位
|
||||
double FORMAT = 1024.0;
|
||||
double kbNumber = byteNumber / FORMAT;
|
||||
if (kbNumber < FORMAT) {
|
||||
return new DecimalFormat("#.##KB").format(kbNumber);
|
||||
}
|
||||
double mbNumber = kbNumber / FORMAT;
|
||||
if (mbNumber < FORMAT) {
|
||||
return new DecimalFormat("#.##MB").format(mbNumber);
|
||||
}
|
||||
double gbNumber = mbNumber / FORMAT;
|
||||
if (gbNumber < FORMAT) {
|
||||
return new DecimalFormat("#.##GB").format(gbNumber);
|
||||
}
|
||||
double tbNumber = gbNumber / FORMAT;
|
||||
return new DecimalFormat("#.##TB").format(tbNumber);
|
||||
}
|
||||
}
|
@ -0,0 +1,79 @@
|
||||
package com.docus.server;
|
||||
|
||||
import cn.smallbun.screw.core.Configuration;
|
||||
import cn.smallbun.screw.core.engine.EngineConfig;
|
||||
import cn.smallbun.screw.core.engine.EngineFileType;
|
||||
import cn.smallbun.screw.core.engine.EngineTemplateType;
|
||||
import cn.smallbun.screw.core.execute.DocumentationExecute;
|
||||
import cn.smallbun.screw.core.process.ProcessConfig;
|
||||
import com.zaxxer.hikari.HikariConfig;
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.util.ArrayList;
|
||||
|
||||
@SpringBootTest
|
||||
class ScrewTests {
|
||||
|
||||
@Autowired
|
||||
private ApplicationContext applicationContext;
|
||||
|
||||
@Test
|
||||
void test() {
|
||||
|
||||
HikariConfig hikariConfig = new HikariConfig();
|
||||
hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
|
||||
hikariConfig.setJdbcUrl("jdbc:mysql://db.docus.cn:3306/docus-collector-scheduling?autoReconnect=true&allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai");
|
||||
hikariConfig.setUsername("docus");
|
||||
hikariConfig.setPassword("docus702");
|
||||
//设置可以获取tables remarks信息
|
||||
hikariConfig.addDataSourceProperty("useInformationSchema", "true");
|
||||
hikariConfig.setMinimumIdle(2);
|
||||
hikariConfig.setMaximumPoolSize(5);
|
||||
DataSource dataSource = new HikariDataSource(hikariConfig);
|
||||
|
||||
//生成文件配置
|
||||
EngineConfig engineConfig = EngineConfig
|
||||
.builder()
|
||||
//文件生成路径
|
||||
.fileOutputDir("h:\\file")
|
||||
//打开目录
|
||||
.openOutputDir(false)
|
||||
//文件类型
|
||||
.fileType(EngineFileType.HTML)
|
||||
//生成模板实现
|
||||
.produceType(EngineTemplateType.freemarker)
|
||||
.build();
|
||||
//配置想要生成的表
|
||||
ProcessConfig processConfig = ProcessConfig
|
||||
.builder()
|
||||
//根据名称指定表生成
|
||||
.designatedTableName(new ArrayList<>())
|
||||
//根据表前缀生成
|
||||
.designatedTablePrefix(new ArrayList<>())
|
||||
//根据表后缀生成
|
||||
.designatedTableSuffix(new ArrayList<>())
|
||||
//忽略表名
|
||||
.ignoreTableName(new ArrayList<>())
|
||||
//忽略表前缀
|
||||
.ignoreTablePrefix(new ArrayList<>())
|
||||
//忽略表后缀
|
||||
.ignoreTableSuffix(new ArrayList<>())
|
||||
.build();
|
||||
//生成文档配置
|
||||
Configuration configuration = Configuration.builder()
|
||||
.version("1.0.0")
|
||||
.description("描述")
|
||||
.dataSource(dataSource)
|
||||
.engineConfig(engineConfig)
|
||||
.produceConfig(processConfig)
|
||||
.build();
|
||||
|
||||
//生成
|
||||
new DocumentationExecute(configuration).execute();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue