diff --git a/04.系统编码/01.xxl-job/xxl-job-executor/src/main/java/com/ping/chuan/ahpmsdp/xxljobexecutor/jobhandler/FileJobHandler.java b/04.系统编码/01.xxl-job/xxl-job-executor/src/main/java/com/ping/chuan/ahpmsdp/xxljobexecutor/jobhandler/FileJobHandler.java new file mode 100644 index 0000000..b09b701 --- /dev/null +++ b/04.系统编码/01.xxl-job/xxl-job-executor/src/main/java/com/ping/chuan/ahpmsdp/xxljobexecutor/jobhandler/FileJobHandler.java @@ -0,0 +1,30 @@ +package com.ping.chuan.ahpmsdp.xxljobexecutor.jobhandler; + +import com.ping.chuan.ahpmsdp.xxljobexecutor.service.IFileHandlerService; +import com.xxl.job.core.handler.annotation.XxlJob; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.ZoneId; + +/** + * @author: xiaowuler + * @createTime: 2022-04-07 10:02 + * @describe: 文件 任务处理类 + */ +@Component +public class FileJobHandler { + + private final IFileHandlerService fileHandlerService; + + public FileJobHandler(IFileHandlerService fileHandlerService) { + this.fileHandlerService = fileHandlerService; + } + + @XxlJob("deleteOut3DayFile") + public void deleteOut3DayFile() throws IOException { + fileHandlerService.deleteFile("C:\\SaveFile\\Source", LocalDateTime.now().minusDays(3).atZone(ZoneId.of("Asia/Shanghai")).toInstant().toEpochMilli()); + fileHandlerService.deleteFile("C:\\SaveFile\\Target", LocalDateTime.now().minusDays(3).atZone(ZoneId.of("Asia/Shanghai")).toInstant().toEpochMilli()); + } +} diff --git a/04.系统编码/01.xxl-job/xxl-job-executor/src/main/java/com/ping/chuan/ahpmsdp/xxljobexecutor/jobhandler/TianQingSCMOCJobHandler.java b/04.系统编码/01.xxl-job/xxl-job-executor/src/main/java/com/ping/chuan/ahpmsdp/xxljobexecutor/jobhandler/TianQingSCMOCJobHandler.java deleted file mode 100644 index 8e78546..0000000 --- a/04.系统编码/01.xxl-job/xxl-job-executor/src/main/java/com/ping/chuan/ahpmsdp/xxljobexecutor/jobhandler/TianQingSCMOCJobHandler.java +++ /dev/null @@ -1,164 +0,0 @@ -//package com.ping.chuan.ahpmsdp.xxljobexecutor.jobhandler; -// -//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -//import com.datastax.driver.core.Cluster; -//import com.datastax.driver.core.Session; -//import com.fasterxml.jackson.core.JsonProcessingException; -//import com.fasterxml.jackson.core.type.TypeReference; -//import com.fasterxml.jackson.databind.ObjectMapper; -//import com.ping.chuan.ahpmsdp.xxljobexecutor.model.constant.FileStateConstant; -//import com.ping.chuan.ahpmsdp.xxljobexecutor.model.constant.TimeConstant; -//import com.ping.chuan.ahpmsdp.xxljobexecutor.model.dao.BaseInfo; -//import com.ping.chuan.ahpmsdp.xxljobexecutor.model.dao.HandlerDetail; -//import com.ping.chuan.ahpmsdp.xxljobexecutor.model.domain.ApplicationCommon; -//import com.ping.chuan.ahpmsdp.xxljobexecutor.model.domain.Grb2Reader; -//import com.ping.chuan.ahpmsdp.xxljobexecutor.model.vo.ParamInfo; -//import com.ping.chuan.ahpmsdp.xxljobexecutor.model.vo.TianQingFileVO; -//import com.ping.chuan.ahpmsdp.xxljobexecutor.model.vo.TianQingResponse; -//import com.ping.chuan.ahpmsdp.xxljobexecutor.service.ITianQingSCMOCDataService; -//import com.ping.chuan.ahpmsdp.xxljobexecutor.service.impl.BaseInfoService; -//import com.ping.chuan.ahpmsdp.xxljobexecutor.util.FileUtil; -//import com.ping.chuan.ahpmsdp.xxljobexecutor.util.WebUtil; -//import com.xxl.job.core.context.XxlJobHelper; -//import com.xxl.job.core.handler.annotation.XxlJob; -//import org.springframework.stereotype.Component; -// -//import java.io.IOException; -//import java.time.LocalDateTime; -//import java.util.HashMap; -//import java.util.List; -//import java.util.Map; -//import java.util.Objects; -// -///** -// * @author xiaowuler -// * 模式数据处理 -// */ -//@Component -//public class TianQingSCMOCJobHandler { -// -// private final ObjectMapper objectMapper = new ObjectMapper(); -// private Map>> results = new HashMap<>(); -// -// private final ApplicationCommon applicationCommon; -// private final BaseInfoService baseInfoService; -// private final ITianQingSCMOCDataService tianQingSCMOCDataService; -// -// public TianQingSCMOCJobHandler(ApplicationCommon applicationCommon, BaseInfoService baseInfoService, ITianQingSCMOCDataService tianQingSCMOCDataService){ -// this.applicationCommon = applicationCommon; -// this.baseInfoService = baseInfoService; -// this.tianQingSCMOCDataService = tianQingSCMOCDataService; -// } -// -// @XxlJob("readSCMOC") -// public void readSCMOC() throws Exception { -// XxlJobHelper.log("read SCMOC job handler start"); -// String param = XxlJobHelper.getJobParam(); -// ParamInfo paramInfo = objectMapper.readValue(param, ParamInfo.class); -// Map params = applicationCommon.prepareParams("scmoc"); -// LocalDateTime startTime = LocalDateTime.now().minusHours(8).minusHours(paramInfo.getTimeLength()); -// LocalDateTime endTime = LocalDateTime.now().minusHours(8); -// -// TianQingResponse> tianQingResponse = request(String.format("[%s,%s]", startTime.format(TimeConstant.YYYYMMDDHHMM00), endTime.format(TimeConstant.YYYYMMDDHHMM00)), params); -// if (Objects.isNull(tianQingResponse)){ -// return; -// } -// -// Map results = download(tianQingResponse.getDs(), paramInfo.getElementCode()); -// List baseInfos = baseInfoService.list(new QueryWrapper().ge("file_time", startTime).le("file_time", endTime).eq("mode_code", "SCMOC").eq("element_code", paramInfo.getBaseName()).eq("state", FileStateConstant.SUCCESS)); -// convertFile(results, paramInfo.getVariable(), baseInfos, paramInfo.isWind()); -// -// XxlJobHelper.log("read SCMOC job end"); -// } -// -// public TianQingResponse> request(String timeRang, Map params) throws JsonProcessingException { -// synchronized (this){ -// if (results.containsKey(timeRang)){ -// return results.get(timeRang); -// } -// -// results.clear(); -// params.put("timeRange", timeRang); -// int index = 0; -// while (index < 3){ -// String result = WebUtil.get(applicationCommon.getUrl(), params); -// TianQingResponse> tianQingResponse = objectMapper.readValue(result, new TypeReference<>() {}); -// if (tianQingResponse.getReturnCode() == 0){ -// results.put(timeRang, tianQingResponse); -// return tianQingResponse; -// } -// -// index++; -// } -// -// return null; -// } -// } -// -// private void convertFile(Map results, String variable, List baseInfos, boolean isWind) throws IOException { -// for(Map.Entry entry : results.entrySet()){ -// String filepath = entry.getKey(); -// boolean result = entry.getValue(); -// if (!result){ -// continue; -// } -// -// if (baseInfos.stream().filter(b -> b.getSourceFilePath().equals(filepath)).count() > 0){ -// continue; -// } -// -// BaseInfo baseInfo = Grb2Reader.readCLDASInfo(filepath); -// if (isWind) { -// tianQingSCMOCDataService.readWindElement(baseInfo); -// } else { -// tianQingSCMOCDataService.readRoutineElement(baseInfo, variable); -// } -// } -// } -// -// private Map download(List tianQingFileVOs, String elementCode){ -// Map results = new HashMap<>(tianQingFileVOs.size()); -// for(TianQingFileVO tianQingFileVO: tianQingFileVOs){ -// if (!tianQingFileVO.getFileName().contains(String.format("-%s-", elementCode))){ -// continue; -// } -// -// String saveFilepath = String.format("%s\\%s", "C:\\SaveFile\\Source", tianQingFileVO.getFileName()); -// boolean result = FileUtil.downloadByNetwork(tianQingFileVO.getFileUrl(), saveFilepath); -// results.put(saveFilepath, result); -// XxlJobHelper.log("save file: [{}], result: {}", saveFilepath, result); -// } -// return results; -// } -// -// -// @XxlJob("insertNoSql") -// public void insertHandlerDetailToNoSql(){ -// Cluster cluster = null; -// Session session = null; -// HandlerDetail handlerDetail = new HandlerDetail(); -// handlerDetail.setWriteTime(LocalDateTime.now()); -// handlerDetail.setTargetFilePath("xxxxxxxxxxxxx"); -// handlerDetail.setTimeEffect(1); -// handlerDetail.setState(1); -// handlerDetail.setForecastTime(LocalDateTime.now()); -// handlerDetail.setResult("5555444"); -// -// try { -// cluster = Cluster.builder().addContactPoints("199.1.1.81").withCredentials("ahgfzx","ahgfzx@2020").build(); -// session = cluster.connect(); -// -// String createKeySpaceCQL = "create keyspace if not exists keyspace with replication = {'class':'SimpleStrategy', 'replication_factor':1}"; -// session.execute(createKeySpaceCQL); -// -// String createTableCQL = "create table if not exists keyspace.HandlerDetail(targetFilePath varchar primary key, forecastTime datetime, timeEffect int, writeTime datetime, state int, result varchar)"; -// session.execute(createTableCQL); -// -// }catch (Exception e) { -// e.printStackTrace(); -// } finally { -// cluster.close(); -// session.close(); -// } -// } -//} diff --git a/04.系统编码/01.xxl-job/xxl-job-executor/src/main/java/com/ping/chuan/ahpmsdp/xxljobexecutor/service/IFileHandlerService.java b/04.系统编码/01.xxl-job/xxl-job-executor/src/main/java/com/ping/chuan/ahpmsdp/xxljobexecutor/service/IFileHandlerService.java new file mode 100644 index 0000000..0a159ae --- /dev/null +++ b/04.系统编码/01.xxl-job/xxl-job-executor/src/main/java/com/ping/chuan/ahpmsdp/xxljobexecutor/service/IFileHandlerService.java @@ -0,0 +1,12 @@ +package com.ping.chuan.ahpmsdp.xxljobexecutor.service; + +import java.time.LocalDateTime; + +/** + * @author: xiaowuler + * @createTime: 2022-04-07 10:08 + * @describe: 文件 处理 接口 + */ +public interface IFileHandlerService { + void deleteFile(String filePath, long milliseconds); +} diff --git a/04.系统编码/01.xxl-job/xxl-job-executor/src/main/java/com/ping/chuan/ahpmsdp/xxljobexecutor/service/impl/FileHandlerService.java b/04.系统编码/01.xxl-job/xxl-job-executor/src/main/java/com/ping/chuan/ahpmsdp/xxljobexecutor/service/impl/FileHandlerService.java new file mode 100644 index 0000000..f08965a --- /dev/null +++ b/04.系统编码/01.xxl-job/xxl-job-executor/src/main/java/com/ping/chuan/ahpmsdp/xxljobexecutor/service/impl/FileHandlerService.java @@ -0,0 +1,34 @@ +package com.ping.chuan.ahpmsdp.xxljobexecutor.service.impl; + +import com.ping.chuan.ahpmsdp.xxljobexecutor.service.IFileHandlerService; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.time.LocalDateTime; + +/** + * @author: xiaowuler + * @createTime: 2022-04-07 10:09 + * @describe: 文件 处理 服务 + */ +@Component +public class FileHandlerService implements IFileHandlerService { + @Override + public void deleteFile(String filePath, long milliseconds) { + File file = new File(filePath); + if (file.isFile()) { + if (milliseconds > file.lastModified()) { + file.delete(); + } + return; + } + + for (File targetFile : file.listFiles()) { + deleteFile(targetFile.getAbsolutePath(), milliseconds); + } + + if (file.listFiles().length == 0) { + file.delete(); + } + } +} diff --git a/04.系统编码/01.xxl-job/xxl-job-executor/src/main/java/com/ping/chuan/ahpmsdp/xxljobexecutor/template/CacheTemplate.java b/04.系统编码/01.xxl-job/xxl-job-executor/src/main/java/com/ping/chuan/ahpmsdp/xxljobexecutor/template/CacheTemplate.java index c757ffd..5be7d57 100644 --- a/04.系统编码/01.xxl-job/xxl-job-executor/src/main/java/com/ping/chuan/ahpmsdp/xxljobexecutor/template/CacheTemplate.java +++ b/04.系统编码/01.xxl-job/xxl-job-executor/src/main/java/com/ping/chuan/ahpmsdp/xxljobexecutor/template/CacheTemplate.java @@ -32,7 +32,7 @@ public class CacheTemplate { this.metaInfoRepository = metaInfoRepository; } - @PostConstruct +// @PostConstruct public void init() { log.info("loading cache template"); List coordinates = coordinateRepository.findAll(); diff --git a/04.系统编码/01.xxl-job/xxl-job-executor/src/test/java/com/ping/chuan/ahpmsdp/xxljobexecutor/XxlJobExecutorApplicationTests.java b/04.系统编码/01.xxl-job/xxl-job-executor/src/test/java/com/ping/chuan/ahpmsdp/xxljobexecutor/XxlJobExecutorApplicationTests.java index 1090603..08c5e92 100644 --- a/04.系统编码/01.xxl-job/xxl-job-executor/src/test/java/com/ping/chuan/ahpmsdp/xxljobexecutor/XxlJobExecutorApplicationTests.java +++ b/04.系统编码/01.xxl-job/xxl-job-executor/src/test/java/com/ping/chuan/ahpmsdp/xxljobexecutor/XxlJobExecutorApplicationTests.java @@ -9,10 +9,7 @@ import com.ping.chuan.ahpmsdp.xxljobexecutor.model.dao.BaseInfo; import com.ping.chuan.ahpmsdp.xxljobexecutor.model.dao.DealInfo; import com.ping.chuan.ahpmsdp.xxljobexecutor.model.domain.ElementInfo; import com.ping.chuan.ahpmsdp.xxljobexecutor.model.domain.Grb2Reader; -import com.ping.chuan.ahpmsdp.xxljobexecutor.service.IDealInfoService; -import com.ping.chuan.ahpmsdp.xxljobexecutor.service.ISchemaService; -import com.ping.chuan.ahpmsdp.xxljobexecutor.service.ITianQingCLDASDataService; -import com.ping.chuan.ahpmsdp.xxljobexecutor.service.ITianQingSCMOCDataService; +import com.ping.chuan.ahpmsdp.xxljobexecutor.service.*; import com.ping.chuan.ahpmsdp.xxljobexecutor.service.impl.SchemaService; import com.ping.chuan.ahpmsdp.xxljobexecutor.template.CassandraTemplate; import com.ping.chuan.ahpmsdp.xxljobexecutor.util.FileUtil; @@ -106,7 +103,7 @@ class XxlJobExecutorApplicationTests { Insert builder = QueryBuilder.insertInto("data_config", "coordinates") .values(columnNames, values); cassandraTemplate.getSession().execute(builder); -// schemaRepository.prepareTable("data_config", "coordinates", partitionKey, columns); +// schemaRepository.prepareTable("data_config", "coordinates", 0, partitionKey, columns); } @Test @@ -127,7 +124,7 @@ class XxlJobExecutorApplicationTests { columns.put("lat_clip_count", DataType.cint()); columns.put("lon_clip_count", DataType.cint()); columns.put("full_name_escaped", DataType.varchar()); -// schemaRepository.prepareTable("data_config", "meta_infos", partitionKey, columns); +// schemaRepository.prepareTable("data_config", "meta_infos", 0, partitionKey, columns); List columnNames = new ArrayList<>(partitionKey.keySet()); columnNames.addAll(columns.keySet()); @@ -313,4 +310,11 @@ class XxlJobExecutorApplicationTests { schemaRepository.prepareTable("data_202204", "test", 10, partitionKey, columns); } + @Autowired + private IFileHandlerService fileHandlerService; + @Test + void deleteFile(){ + fileHandlerService.deleteFile("F:\\test\\ss", LocalDateTime.now().minusDays(3).atZone(ZoneId.of("Asia/Shanghai")).toInstant().toEpochMilli()); + } + } diff --git a/04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/config/SwaggerConfig.java b/04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/config/SwaggerConfig.java index 3c71c0c..0b6255b 100644 --- a/04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/config/SwaggerConfig.java +++ b/04.系统编码/02.api-service/src/main/java/com/ping/chuan/apiservice/config/SwaggerConfig.java @@ -27,7 +27,7 @@ public class SwaggerConfig { private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("安徽省公共气象服务基础数据平台") - .description("测试") + .description("数据接口测试") .version("5.2.1") .build(); } diff --git a/04.系统编码/interview-demo/.gitignore b/04.系统编码/interview-demo/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/04.系统编码/interview-demo/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/04.系统编码/interview-demo/.mvn/wrapper/maven-wrapper.jar b/04.系统编码/interview-demo/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000..c1dd12f Binary files /dev/null and b/04.系统编码/interview-demo/.mvn/wrapper/maven-wrapper.jar differ diff --git a/04.系统编码/interview-demo/.mvn/wrapper/maven-wrapper.properties b/04.系统编码/interview-demo/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..b7cb93e --- /dev/null +++ b/04.系统编码/interview-demo/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar diff --git a/04.系统编码/interview-demo/mvnw b/04.系统编码/interview-demo/mvnw new file mode 100644 index 0000000..8a8fb22 --- /dev/null +++ b/04.系统编码/interview-demo/mvnw @@ -0,0 +1,316 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/04.系统编码/interview-demo/mvnw.cmd b/04.系统编码/interview-demo/mvnw.cmd new file mode 100644 index 0000000..1d8ab01 --- /dev/null +++ b/04.系统编码/interview-demo/mvnw.cmd @@ -0,0 +1,188 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/04.系统编码/interview-demo/pom.xml b/04.系统编码/interview-demo/pom.xml new file mode 100644 index 0000000..c91e6c0 --- /dev/null +++ b/04.系统编码/interview-demo/pom.xml @@ -0,0 +1,62 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.6 + + + com.xiaowuler + interview-demo + 0.0.1-SNAPSHOT + interview-demo + interview-demo + + 1.8 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-json + 2.5.2 + compile + + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/InterviewDemoApplication.java b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/InterviewDemoApplication.java new file mode 100644 index 0000000..21c5558 --- /dev/null +++ b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/InterviewDemoApplication.java @@ -0,0 +1,13 @@ +package com.xiaowuler.interviewdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class InterviewDemoApplication { + + public static void main(String[] args) { + SpringApplication.run(InterviewDemoApplication.class, args); + } + +} diff --git a/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/CollectionTest.java b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/CollectionTest.java new file mode 100644 index 0000000..9229684 --- /dev/null +++ b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/CollectionTest.java @@ -0,0 +1,81 @@ +package com.xiaowuler.interviewdemo.test; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xiaowuler.interviewdemo.test.util.CollectorsUtils; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collector; +import java.util.stream.Collectors; + +/** + * @author: xiaowuler + * @createTime: 2022-05-06 13:44 + * @describe: 集合测试 + */ +public class CollectionTest { + public static void main(String[] args) throws JsonProcessingException { + testHashMap(); + testMapMerger(); + Float[] floats = new Float[555]; + Arrays.fill(floats, 0.0f); + Float[] target = new Float[801]; + Arrays.fill(target, Float.NaN); + System.arraycopy(floats, 0, target, 6, floats.length); + System.out.println(Arrays.toString(target)); + } + + private static void testHashMap() throws JsonProcessingException { + + String text = "{0=1427159046724165633, 1=1395908122255495169, 2=实时监控数据, 3=测试1, 4=0, 5=null, 6=启用}\n" + + "{0=1430091584367169537, 1=1395908122255495169, 2=测试1-2, 3=测试2, 4=1427159046724165633, 5=实时监控数据, 6=启用}\n" + + "{0=1430419967089250306, 1=1395908122255495169, 2=主机基本信息, 3=2, 4=0, 5=null, 6=启用}\n" + + "{0=1437341320002326529, 1=1395908122255495169, 2=用户相关, 3=Ttest1 descrption, 4=0, 5=null, 6=启用}\n" + + "{0=1437598497426366466, 1=-1, 2=Ttestdir1-1, 3=test dir 1-1, 4=1437598194912190466, 5=Ttestdir1, 6=启用}"; + + String text1 = "{0=1427159046724165633, 1=1395908122255495169, 2=实时监控数据, 3=测试1, 4=0, 5=null, 6=启用}"; + ObjectMapper mapper = new ObjectMapper(); + LinkedHashMap result = mapper.readValue(text1, new TypeReference>() {}); + System.out.println(""); + } + + private static void testMapMerger(){ + Map map1 = new HashMap(){{ + put("a", null); + put("b", new BigDecimal(2)); + put("c", new BigDecimal(3)); + }}; + + Map map2 = new HashMap(){{ + put("a", new BigDecimal(1)); + put("b", new BigDecimal(2)); + put("c", new BigDecimal(3)); + }}; + + List> target = new ArrayList<>(map1.entrySet()); + target.addAll(map2.entrySet()); + target.addAll(target); + + Map result = target.stream() + .collect( + Collectors.groupingBy( + Map.Entry :: getKey, + Collectors.mapping(entry -> Objects.isNull( entry.getValue()) ? BigDecimal.ZERO : entry.getValue(), Collectors.reducing(BigDecimal.ZERO, BigDecimal :: add)) + ) + ); + System.out.println(result); + } + + private T create(Class clazz){ + try { + return clazz.newInstance(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/ListTest.java b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/ListTest.java new file mode 100644 index 0000000..817fa12 --- /dev/null +++ b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/ListTest.java @@ -0,0 +1,40 @@ +package com.xiaowuler.interviewdemo.test; + +import java.io.PrintStream; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.stream.Collectors; + +/** + * @author: xiaowuler + * @createTime: 2022-04-07 14:46 + * @describe: 集合测试 + */ +public class ListTest { + public void handler(){ + List names = Collections.synchronizedList(new ArrayList<>(2)); + names.add("xiaowuler"); + names.add("xiaowuler"); + names.add("xiaowuler"); + + String name = "xiaowuler"; + + Map map = new HashMap<>(); + map.put(null, "xiaowuler"); + map.put(null, "xiaowuler11"); + System.out.println(""); + } + + public void createConcurrentHashMap(){ + Map map = new ConcurrentHashMap<>(); + map.put(null, "xiaowuler"); + map.put(null, "xiaowuler11"); + map.putIfAbsent(null, "xiaowuler22"); + } + + public static void main(String[] args) { + ListTest listTest = new ListTest(); + listTest.handler(); + } +} diff --git a/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/thread/CallableImpl.java b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/thread/CallableImpl.java new file mode 100644 index 0000000..0edc36e --- /dev/null +++ b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/thread/CallableImpl.java @@ -0,0 +1,15 @@ +package com.xiaowuler.interviewdemo.test.thread; + +import java.util.concurrent.Callable; + +/** + * @author: xiaowuler + * @createTime: 2022-04-12 09:58 + * @describe: 实现 callable 创建线程 + */ +public class CallableImpl implements Callable { + @Override + public String call() throws Exception { + return Thread.currentThread().getName(); + } +} diff --git a/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/thread/DirectByteBufferTest.java b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/thread/DirectByteBufferTest.java new file mode 100644 index 0000000..a845d65 --- /dev/null +++ b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/thread/DirectByteBufferTest.java @@ -0,0 +1,23 @@ +package com.xiaowuler.interviewdemo.test.thread; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * @author: xiaowuler + * @createTime: 2022-05-05 09:58 + * @describe: 直接内存 测试 + */ +public class DirectByteBufferTest { + public static void main(String[] args) { + //创建一个直接内存 +// ByteBuffer buffer = ByteBuffer.allocateDirect(1024); + + Float[] list = new Float[10]; + Arrays.fill(list, Float.NaN); //填充集合 + System.out.println(list); + } +} diff --git a/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/thread/RunnableImpl.java b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/thread/RunnableImpl.java new file mode 100644 index 0000000..6d6a940 --- /dev/null +++ b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/thread/RunnableImpl.java @@ -0,0 +1,13 @@ +package com.xiaowuler.interviewdemo.test.thread; + +/** + * @author: xiaowuler + * @createTime: 2022-04-12 09:56 + * @describe: 实现 Runnable 创建个线程 + */ +public class RunnableImpl implements Runnable { + @Override + public void run() { + System.out.println("线程名称:" + Thread.currentThread().getName() + ",线程ID:" + Thread.currentThread().getId()); + } +} diff --git a/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/thread/ThreadTest.java b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/thread/ThreadTest.java new file mode 100644 index 0000000..e696795 --- /dev/null +++ b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/thread/ThreadTest.java @@ -0,0 +1,36 @@ +package com.xiaowuler.interviewdemo.test.thread; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.FutureTask; + +/** + * @author: xiaowuler + * @createTime: 2022-04-12 09:53 + * @describe: 线程测试 + */ +public class ThreadTest { + public void createThread(){ + new Thread(new Runnable() { + @Override + public void run() { + System.out.println("线程名称:"+Thread.currentThread().getName()); + } + }).start(); + } + + public static void main(String[] args) throws ExecutionException, InterruptedException { + RunnableImpl runnable = new RunnableImpl(); + Thread thread = new Thread(runnable); + thread.start(); + + ThreadTest threadTest = new ThreadTest(); + threadTest.createThread(); + + CallableImpl callable = new CallableImpl(); + FutureTask futureTask = new FutureTask<>(callable); + futureTask.run(); + System.out.println(futureTask.isDone()); + + + } +} diff --git a/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/threadpool/ThreadPoolTest.java b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/threadpool/ThreadPoolTest.java new file mode 100644 index 0000000..cb990d5 --- /dev/null +++ b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/threadpool/ThreadPoolTest.java @@ -0,0 +1,72 @@ +package com.xiaowuler.interviewdemo.test.threadpool; + +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author: xiaowuler + * @createTime: 2022-04-12 10:30 + * @describe: 线程池测试 + */ +public class ThreadPoolTest { + public static void main(String[] args) { +// +// ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( +// 1, +// 5, +// 60L, +// TimeUnit.SECONDS, +// new LinkedBlockingQueue<>(10), +// new NamedThreadFactory("test"), +// new ThreadPoolExecutor.CallerRunsPolicy() +// ); +// +// for(int index = 0; index < 50; index++){ +// threadPoolExecutor.execute(() -> { +// System.out.println(Thread.currentThread().getName() + ": hello world"); +// }); +// } + + retry: + for(int index = 0; index < 50; index++){ + for(int i = 0; i < 10; i++){ + System.out.println(i + ": " + index); + break retry; + } + } + + synchronized (ThreadPoolTest.class) { + System.out.println("hello world"); + } + + Runnable thread = () -> { + System.out.println("hello world"); + }; + thread.run(); + + System.out.println("end"); + } + + static class NamedThreadFactory implements ThreadFactory { + + private final AtomicInteger poolNumber = new AtomicInteger(1); + private final ThreadGroup group; + private final AtomicInteger threadNumber = new AtomicInteger(1); + private final String namePrefix; + + NamedThreadFactory(String name) { + SecurityManager s = System.getSecurityManager(); + group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); + namePrefix = name + "-" + poolNumber.getAndIncrement() + "-thread-"; + } + + public Thread newThread(Runnable r) { + Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0); + if (t.isDaemon()) + t.setDaemon(false); + if (t.getPriority() != Thread.NORM_PRIORITY) + t.setPriority(Thread.NORM_PRIORITY); + return t; + } + } +} diff --git a/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/util/CollectorsUtils.java b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/util/CollectorsUtils.java new file mode 100644 index 0000000..d4601a2 --- /dev/null +++ b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/util/CollectorsUtils.java @@ -0,0 +1,95 @@ +package com.xiaowuler.interviewdemo.test.util; + +import java.math.BigDecimal; +import java.util.Collections; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collector; + +/** + * @author: xiaowuler + * @createTime: 2022-05-31 17:29 + * @describe: 集合工具类 + */ +public class CollectorsUtils { + static final Set CH_NOID = Collections.emptySet(); + + private CollectorsUtils() { + } + + @SuppressWarnings("unchecked") + private static Function castingIdentity() { + return i -> (R) i; + } + + /** + * Simple implementation class for {@code Collector}. + * + * @param + * the type of elements to be collected + * @param + * the type of the result + */ + static class CollectorImpl implements Collector { + private final Supplier supplier; + private final BiConsumer accumulator; + private final BinaryOperator combiner; + private final Function finisher; + private final Set characteristics; + + CollectorImpl(Supplier supplier, BiConsumer accumulator, BinaryOperator combiner, + Function finisher, Set characteristics) { + this.supplier = supplier; + this.accumulator = accumulator; + this.combiner = combiner; + this.finisher = finisher; + this.characteristics = characteristics; + } + + CollectorImpl(Supplier supplier, BiConsumer accumulator, BinaryOperator combiner, + Set characteristics) { + this(supplier, accumulator, combiner, castingIdentity(), characteristics); + } + + @Override + public BiConsumer accumulator() { + return accumulator; + } + + @Override + public Supplier supplier() { + return supplier; + } + + @Override + public BinaryOperator combiner() { + return combiner; + } + + @Override + public Function finisher() { + return finisher; + } + + @Override + public Set characteristics() { + return characteristics; + } + } + + public static Collector summingBigDecimal(ToBigDecimalFunction mapper) { + return new CollectorImpl<>(() -> new BigDecimal[1], (a, t) -> { + if (a[0] == null) { + a[0] = BigDecimal.ZERO; + } + a[0] = a[0].add(mapper.applyAsBigDecimal(t)); + }, (a, b) -> { + a[0] = a[0].add(b[0]); + return a; + }, a -> a[0], CH_NOID); + } + +} diff --git a/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/util/ToBigDecimalFunction.java b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/util/ToBigDecimalFunction.java new file mode 100644 index 0000000..1f055b1 --- /dev/null +++ b/04.系统编码/interview-demo/src/main/java/com/xiaowuler/interviewdemo/test/util/ToBigDecimalFunction.java @@ -0,0 +1,19 @@ +package com.xiaowuler.interviewdemo.test.util; + +import java.math.BigDecimal; + +/** + * @author: xiaowuler + * @createTime: 2022-05-31 17:32 + * @describe: bigDecimal 接口类 + */ +@FunctionalInterface +public interface ToBigDecimalFunction { + /** + * Applies this function to the given argument. + * + * @param value the function argument + * @return the function result + */ + BigDecimal applyAsBigDecimal(T value); +} diff --git a/04.系统编码/interview-demo/src/main/resources/application.properties b/04.系统编码/interview-demo/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/04.系统编码/interview-demo/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/04.系统编码/interview-demo/src/test/java/com/xiaowuler/interviewdemo/InterviewDemoApplicationTests.java b/04.系统编码/interview-demo/src/test/java/com/xiaowuler/interviewdemo/InterviewDemoApplicationTests.java new file mode 100644 index 0000000..05242d8 --- /dev/null +++ b/04.系统编码/interview-demo/src/test/java/com/xiaowuler/interviewdemo/InterviewDemoApplicationTests.java @@ -0,0 +1,13 @@ +package com.xiaowuler.interviewdemo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class InterviewDemoApplicationTests { + + @Test + void contextLoads() { + } + +}