diff --git a/.gitignore b/.gitignore index ffd1490..37385a1 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,5 @@ *.iws *.iml *.ipr + +*.json \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..f488b42 --- /dev/null +++ b/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + + com.htfp + weather + 0.0.1 + pom + + weather app + weather service prepublish + + + org.springframework.boot + spring-boot-starter-parent + 2.6.13 + + + + + UTF-8 + UTF-8 + 1.8 + + + + + tablestore-grid-master + weather-service + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + UTF-8 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + false + + + + + + \ No newline at end of file diff --git a/tablestore-grid-master/pom.xml b/tablestore-grid-master/pom.xml index 8963410..5517961 100644 --- a/tablestore-grid-master/pom.xml +++ b/tablestore-grid-master/pom.xml @@ -7,6 +7,20 @@ com.aliyun.tablestore tablestore-grid 1.1-SNAPSHOT + jar + + + com.htfp + weather + 0.0.1 + ../pom.xml + + + + UTF-8 + UTF-8 + 1.8 + @@ -113,10 +127,15 @@ org.apache.maven.plugins maven-compiler-plugin - 8 - 8 + 1.8 + 1.8 + + org.springframework.boot + spring-boot-maven-plugin + + \ No newline at end of file diff --git a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/common/ExampleConfig.java b/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/common/ExampleConfig.java deleted file mode 100644 index 6b5eb52..0000000 --- a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/common/ExampleConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.aliyun.tablestore.example.grid.common; - -import ucar.ma2.DataType; - - -public class ExampleConfig { - - /** - * 表名和index名 - */ - public static String GRID_DATA_TABLE_NAME = "GRID_DATA_TABLE_EXAMPLE1"; - public static String GRID_META_TABLE_NAME = "GRID_META_TABLE_EXAMPLE1"; - public static String GRID_META_INDEX_NAME = "GRID_META_INDEX"; - - - /** - * 数据属性:ID、本地数据文件名、目标变量名、变量维度大小、变量类型 - */ - public static String EXAMPLE_GRID_DATA_SET_ID = "test_echam_spectral_example"; - public static String EXAMPLE_GRID_DATA_SET_NC_FILE_PATH = "test_echam_spectral.nc"; - public static String EXAMPLE_GRID_DATA_VARIABLE = "tpot"; - public static int[] EXAMPLE_GRID_DATA_SHAPE = new int[]{8, 47, 96, 192}; - public static DataType EXAMPLE_GRID_DATA_TYPE = DataType.FLOAT; -} diff --git a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/common/TableStoreConf.java b/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/common/TableStoreConf.java deleted file mode 100644 index b98964c..0000000 --- a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/common/TableStoreConf.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.aliyun.tablestore.example.grid.common; - -import com.google.gson.Gson; -import org.apache.commons.io.IOUtils; - -import java.io.FileInputStream; -import java.io.InputStream; - - - -public class TableStoreConf { - - private String endpoint; - private String accessId; - private String accessKey; - private String instanceName; - - /** - * 从目标配置文件中读取 数据库instance相关信息 - */ - public static TableStoreConf newInstance(String path) { - try { - InputStream f = new FileInputStream(path); - Gson gson = new Gson(); - return gson.fromJson(IOUtils.toString(f), TableStoreConf.class); - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } - - public String getEndpoint() { - return endpoint; - } - - public void setEndpoint(String endpoint) { - this.endpoint = endpoint; - } - - public String getAccessId() { - return accessId; - } - - public void setAccessId(String accessId) { - this.accessId = accessId; - } - - public String getAccessKey() { - return accessKey; - } - - public void setAccessKey(String accessKey) { - this.accessKey = accessKey; - } - - public String getInstanceName() { - return instanceName; - } - - public void setInstanceName(String instanceName) { - this.instanceName = instanceName; - } -} diff --git a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/common/TableStoreGridExample.java b/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/common/TableStoreGridExample.java deleted file mode 100644 index cc03f78..0000000 --- a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/common/TableStoreGridExample.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.aliyun.tablestore.example.grid.common; - -import com.aliyun.tablestore.grid.TableStoreGrid; -import com.aliyun.tablestore.grid.TableStoreGridConfig; - -public abstract class TableStoreGridExample { - - protected TableStoreGrid tableStoreGrid; - // private String pathSeperator = "/"; - - public TableStoreGridExample(String dataTableName, String metaTableName) { - // String os = System.getProperty("os.name"); - // if (os.toLowerCase().startsWith("win")) { - // pathSeparator = "\\"; - // } - String pathSeparator = System.getProperty("file.separator"); - TableStoreConf conf = TableStoreConf.newInstance(System.getProperty("user.dir") + pathSeparator + "tablestoreConf.json"); - TableStoreGridConfig config = new TableStoreGridConfig(); - config.setTableStoreEndpoint(conf.getEndpoint()); - config.setAccessId(conf.getAccessId()); - config.setAccessKey(conf.getAccessKey()); - config.setTableStoreInstance(conf.getInstanceName()); - config.setDataTableName(dataTableName); - config.setMetaTableName(metaTableName); - tableStoreGrid = new TableStoreGrid(config); - } - - public void close() { - if (tableStoreGrid != null) { - tableStoreGrid.close(); - } - } -} diff --git a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/grid/consts/AttributionEnum.java b/tablestore-grid-master/src/main/java/com/aliyun/tablestore/grid/consts/AttributionEnum.java index 2e049d7..5add231 100644 --- a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/grid/consts/AttributionEnum.java +++ b/tablestore-grid-master/src/main/java/com/aliyun/tablestore/grid/consts/AttributionEnum.java @@ -1,5 +1,7 @@ package com.aliyun.tablestore.grid.consts; +import com.alicloud.openservices.tablestore.model.search.FieldType; + import java.util.function.Consumer; /** @@ -9,14 +11,14 @@ import java.util.function.Consumer; */ public enum AttributionEnum { // - STATUS("status", "导入状态"), - CREATE_TIME("create_time", "创建时间"), - REFERENCE_TIME("reference_time", "起报时间"), + STATUS("status", "导入状态", FieldType.KEYWORD), + CREATE_TIME("create_time", "创建时间", FieldType.LONG), + REFERENCE_TIME("reference_time", "起报时间", FieldType.LONG), ; public String name; public String info; - + public FieldType type; public String getName() { return name; } @@ -24,8 +26,13 @@ public enum AttributionEnum { public String getInfo() { return info; } - AttributionEnum(String name, String info) { + + public FieldType getType() { + return type; + } + AttributionEnum(String name, String info, FieldType type) { this.name = name; this.info = info; + this.type = type; } } diff --git a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/grid/core/TableStoreDataWriter.java b/tablestore-grid-master/src/main/java/com/aliyun/tablestore/grid/core/TableStoreDataWriter.java index b795a35..74bce73 100644 --- a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/grid/core/TableStoreDataWriter.java +++ b/tablestore-grid-master/src/main/java/com/aliyun/tablestore/grid/core/TableStoreDataWriter.java @@ -91,6 +91,7 @@ public class TableStoreDataWriter implements GridDataWriter { if (meta.getStoreOptions().getStoreType().equals(StoreOptions.StoreType.SLICE)) { List columns = splitDataToColumns(grid2D); writeToTableStore(variable, t, z, columns); + columns = null; } else { throw new IllegalArgumentException("unsupported store type"); } diff --git a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/grid/model/grid/Grid.java b/tablestore-grid-master/src/main/java/com/aliyun/tablestore/grid/model/grid/Grid.java index c4c79dd..0aeccdb 100644 --- a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/grid/model/grid/Grid.java +++ b/tablestore-grid-master/src/main/java/com/aliyun/tablestore/grid/model/grid/Grid.java @@ -52,7 +52,6 @@ public abstract class Grid { } public Array toArray() { - Array array = Array.factory(dataType, shape, buffer.duplicate()); - return array; + return Array.factory(dataType, shape, buffer.duplicate()); } } diff --git a/tablestore-grid-master/src/test/java/TestReadGrib2ByNC.java b/tablestore-grid-master/src/test/java/TestReadGrib2ByNC.java index 259bfea..6ae2ceb 100644 --- a/tablestore-grid-master/src/test/java/TestReadGrib2ByNC.java +++ b/tablestore-grid-master/src/test/java/TestReadGrib2ByNC.java @@ -1,4 +1,7 @@ +import com.aliyun.tablestore.grid.model.grid.Grid; +import com.aliyun.tablestore.grid.model.grid.Grid2D; import ucar.ma2.Array; +import ucar.ma2.DataType; import ucar.ma2.Index; import ucar.ma2.InvalidRangeException; import ucar.nc2.NetcdfFile; @@ -6,6 +9,7 @@ import ucar.nc2.NetcdfFiles; import ucar.nc2.Variable; import java.io.IOException; +import java.nio.ByteBuffer; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -13,7 +17,15 @@ import java.time.format.DateTimeFormatter; * Unit test for simple App. */ public class TestReadGrib2ByNC { - public static void main(String[] args){ + public static void main(String[] args) throws InterruptedException { + // while (true) { + // ByteBuffer allocate = ByteBuffer.allocate(500 * 500 * 4); + // Grid2D grid = new Grid2D(allocate, DataType.FLOAT, new int[]{0, 0}, new int[]{500,500}); + // allocate = null; grid=null; + // Thread.sleep(300); + // } + } + public static void main1(String[] args){ // String ncFile = "surface.nc"; String file = "C:\\Users\\shi_y\\Desktop\\java_learn\\data_download\\GFSData\\UTC-20230910\\BJT-20230911-0200.grib2"; try (NetcdfFile ncFile = NetcdfFiles.open(file)) { diff --git a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/CreateStoreExample.java b/tablestore-grid-master/src/test/java/com/aliyun/tablestore/example/grid/CreateStoreExample.java similarity index 96% rename from tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/CreateStoreExample.java rename to tablestore-grid-master/src/test/java/com/aliyun/tablestore/example/grid/CreateStoreExample.java index 7adcb37..8711734 100644 --- a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/CreateStoreExample.java +++ b/tablestore-grid-master/src/test/java/com/aliyun/tablestore/example/grid/CreateStoreExample.java @@ -42,7 +42,7 @@ public class CreateStoreExample extends TableStoreGridExample { this.tableStoreGrid.createMetaIndex(ExampleConfig.GRID_META_INDEX_NAME, indexSchema); } - public static void main(String[] args) throws Exception { + public static void test(String[] args) throws Exception { CreateStoreExample example = new CreateStoreExample(); try { example.createStore(); diff --git a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/DataFetchExample.java b/tablestore-grid-master/src/test/java/com/aliyun/tablestore/example/grid/DataFetchExample.java similarity index 97% rename from tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/DataFetchExample.java rename to tablestore-grid-master/src/test/java/com/aliyun/tablestore/example/grid/DataFetchExample.java index d897470..d09351f 100644 --- a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/DataFetchExample.java +++ b/tablestore-grid-master/src/test/java/com/aliyun/tablestore/example/grid/DataFetchExample.java @@ -6,7 +6,6 @@ import com.aliyun.tablestore.grid.GridDataFetcher; import com.aliyun.tablestore.grid.model.grid.Grid4D; import ucar.ma2.Array; -import java.util.Arrays; import java.util.Collections; public class DataFetchExample extends TableStoreGridExample { @@ -71,7 +70,7 @@ public class DataFetchExample extends TableStoreGridExample { fetch3(); } - public static void main(String[] args) throws Exception { + public static void test(String[] args) throws Exception { DataFetchExample example = new DataFetchExample(); try { example.run(); diff --git a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/DataImportExample.java b/tablestore-grid-master/src/test/java/com/aliyun/tablestore/example/grid/DataImportExample.java similarity index 97% rename from tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/DataImportExample.java rename to tablestore-grid-master/src/test/java/com/aliyun/tablestore/example/grid/DataImportExample.java index ab78057..2f42f68 100644 --- a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/DataImportExample.java +++ b/tablestore-grid-master/src/test/java/com/aliyun/tablestore/example/grid/DataImportExample.java @@ -12,7 +12,6 @@ import ucar.ma2.DataType; import ucar.nc2.NetcdfFile; import ucar.nc2.Variable; -import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -97,7 +96,7 @@ public class DataImportExample extends TableStoreGridExample { updateMeta(meta); } - public static void main(String[] args) throws Exception { + public static void test(String[] args) throws Exception { DataImportExample example = new DataImportExample(); try { log.info("导入数据"); diff --git a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/MetaDeleteExample.java b/tablestore-grid-master/src/test/java/com/aliyun/tablestore/example/grid/MetaDeleteExample.java similarity index 98% rename from tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/MetaDeleteExample.java rename to tablestore-grid-master/src/test/java/com/aliyun/tablestore/example/grid/MetaDeleteExample.java index 2bd5540..5652590 100644 --- a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/MetaDeleteExample.java +++ b/tablestore-grid-master/src/test/java/com/aliyun/tablestore/example/grid/MetaDeleteExample.java @@ -11,7 +11,6 @@ import com.aliyun.tablestore.grid.model.QueryGridDataSetResult; import com.aliyun.tablestore.grid.model.QueryParams; import lombok.extern.slf4j.Slf4j; -import java.util.Arrays; import java.util.Collections; import java.util.List; diff --git a/tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/MetaQueryExample.java b/tablestore-grid-master/src/test/java/com/aliyun/tablestore/example/grid/MetaQueryExample.java similarity index 100% rename from tablestore-grid-master/src/main/java/com/aliyun/tablestore/example/grid/MetaQueryExample.java rename to tablestore-grid-master/src/test/java/com/aliyun/tablestore/example/grid/MetaQueryExample.java diff --git a/weather-service/pom.xml b/weather-service/pom.xml index 33e9704..9fccfee 100644 --- a/weather-service/pom.xml +++ b/weather-service/pom.xml @@ -2,18 +2,27 @@ 4.0.0 - com.htfp.weather + com.htfp weather-service - 0.0.1-SNAPSHOT + 0.0.1 weather-service weather-service + jar + + + + com.htfp + weather + 0.0.1 + ../pom.xml + 1.8 UTF-8 UTF-8 2.6.13 - + unidata-all @@ -88,11 +97,10 @@ spring-boot-starter-test test - - org.springframework.boot - spring-boot-starter-thymeleaf - - + + + + com.squareup.okhttp3 okhttp @@ -128,48 +136,34 @@ - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - + - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - 1.8 - 1.8 - UTF-8 - - org.springframework.boot spring-boot-maven-plugin - ${spring-boot.version} - true - JAR + + com.htfp.weather.WeatherServiceApplication + ZIP - repackage + repackage + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + - diff --git a/weather-service/src/main/java/com/htfp/weather/download/DownLoadFileInfo.java b/weather-service/src/main/java/com/htfp/weather/download/DownLoadFileInfo.java index a5e5a31..6813782 100644 --- a/weather-service/src/main/java/com/htfp/weather/download/DownLoadFileInfo.java +++ b/weather-service/src/main/java/com/htfp/weather/download/DownLoadFileInfo.java @@ -26,6 +26,7 @@ public class DownLoadFileInfo { private String savePath; private boolean isDownloadSuccess; + private String errorMsg; public DownLoadFileInfo() { } diff --git a/weather-service/src/main/java/com/htfp/weather/download/gfs/GfsDataConfig.java b/weather-service/src/main/java/com/htfp/weather/download/gfs/GfsDataConfig.java index 2d21a20..d61a969 100644 --- a/weather-service/src/main/java/com/htfp/weather/download/gfs/GfsDataConfig.java +++ b/weather-service/src/main/java/com/htfp/weather/download/gfs/GfsDataConfig.java @@ -108,7 +108,7 @@ public class GfsDataConfig { } public void readConfig() { try (InputStream f = new FileInputStream(configPath)){ - GfsDataConfig gfsDataConfig = JSONUtils.json2pojo(IOUtils.toString(f), GfsDataConfig.class); + GfsDataConfig gfsDataConfig = JSONUtils.json2obj(IOUtils.toString(f), GfsDataConfig.class); this.duration = gfsDataConfig.getDuration(); this.minLon = gfsDataConfig.getMinLon(); this.maxLon = gfsDataConfig.getMaxLon(); diff --git a/weather-service/src/main/java/com/htfp/weather/download/gfs/GfsDownloader.java b/weather-service/src/main/java/com/htfp/weather/download/gfs/GfsDownloader.java index 077616b..7aa3dfc 100644 --- a/weather-service/src/main/java/com/htfp/weather/download/gfs/GfsDownloader.java +++ b/weather-service/src/main/java/com/htfp/weather/download/gfs/GfsDownloader.java @@ -75,8 +75,13 @@ public class GfsDownloader extends BaseDataDownloader { try { // DONE: 改用okhttp FIXME 2024/6/8: 如果连接是https,jar包启动下载会报错 javax.net.ssl.SSLException: Received fatal alert: internal_error HttpClientUtils.downloadFileByUrl(url, fileOut.getPath()); - log.info("[GFS Download] 文件下载成功: {}", fileOut); - downLoadFileInfo.setDownloadSuccess(fileValid(fileOut.getAbsolutePath())); + boolean fileIsValid = fileValid(fileOut.getAbsolutePath()); + downLoadFileInfo.setDownloadSuccess(fileIsValid); + if (fileIsValid) { + log.info("[GFS Download] 文件下载成功: {}", fileOut); + } else { + log.error("[GFS Download] 文件下载失败,文件打开错误: {}", fileOut); + } } catch (Exception e) { // DONE 2024/5/24: 文件服务器在外网不稳定,增加重试机制 downLoadFileInfo.setDownloadSuccess(false); @@ -85,7 +90,8 @@ public class GfsDownloader extends BaseDataDownloader { return download0(downLoadFileInfo, retryNum - 1); } else { e.printStackTrace(); - log.error("[GFS Download] 文件下载失败: {}", fileOut); + downLoadFileInfo.setErrorMsg(e.getMessage()); + log.error("[GFS Download] 文件{}下载失败: {}", fileOut, e.getMessage()); } } return downLoadFileInfo; @@ -97,6 +103,7 @@ public class GfsDownloader extends BaseDataDownloader { ncFile.getLocation(); return true; } catch (IOException e){ + log.error("GFS文件{}校验失败: {}", file, e.getMessage()); return false; } } diff --git a/weather-service/src/main/java/com/htfp/weather/griddata/common/TableConfig.java b/weather-service/src/main/java/com/htfp/weather/griddata/common/TableConfig.java index ca1b226..3751c22 100644 --- a/weather-service/src/main/java/com/htfp/weather/griddata/common/TableConfig.java +++ b/weather-service/src/main/java/com/htfp/weather/griddata/common/TableConfig.java @@ -81,7 +81,7 @@ public class TableConfig { // String pathSeparator = System.getProperty("file.separator"); try (InputStream f = new FileInputStream(configPath)){ String jsonStr = IOUtils.toString(f, StandardCharsets.UTF_8); - TableConfig tableConfig = JSONUtils.json2pojo(jsonStr, TableConfig.class); + TableConfig tableConfig = JSONUtils.json2obj(jsonStr, TableConfig.class); this.dataTableName = tableConfig.getDataTableName(); this.metaTableName = tableConfig.getMetaTableName(); this.dataIndexName = tableConfig.getDataIndexName(); diff --git a/weather-service/src/main/java/com/htfp/weather/griddata/common/TableStoreConf.java b/weather-service/src/main/java/com/htfp/weather/griddata/common/TableStoreConf.java index 49b4a4c..d6fe8f7 100644 --- a/weather-service/src/main/java/com/htfp/weather/griddata/common/TableStoreConf.java +++ b/weather-service/src/main/java/com/htfp/weather/griddata/common/TableStoreConf.java @@ -1,6 +1,5 @@ package com.htfp.weather.griddata.common; -import com.google.gson.Gson; import com.htfp.weather.utils.JSONUtils; import lombok.Data; import org.apache.commons.io.IOUtils; @@ -25,7 +24,7 @@ public class TableStoreConf { String path = System.getProperty("user.dir") + "./tablestoreConf.json"; InputStream f = new FileInputStream(path); String jsonStr = IOUtils.toString(f, StandardCharsets.UTF_8); - return JSONUtils.json2pojo(jsonStr, TableStoreConf.class); + return JSONUtils.json2obj(jsonStr, TableStoreConf.class); } catch (Exception ex) { throw new RuntimeException(ex); } diff --git a/weather-service/src/main/java/com/htfp/weather/griddata/operation/BaseTableOperation.java b/weather-service/src/main/java/com/htfp/weather/griddata/operation/BaseTableOperation.java index 21516b5..bb3a80a 100644 --- a/weather-service/src/main/java/com/htfp/weather/griddata/operation/BaseTableOperation.java +++ b/weather-service/src/main/java/com/htfp/weather/griddata/operation/BaseTableOperation.java @@ -19,10 +19,11 @@ public abstract class BaseTableOperation{ private TableConfig tableConfig; @Autowired private TableStoreConf tableStoreConf; + TableStoreGridConfig config; @PostConstruct public void init() { - TableStoreGridConfig config = new TableStoreGridConfig(); + config = new TableStoreGridConfig(); if (tableStoreConf == null){ tableStoreConf = TableStoreConf.init(); } @@ -36,12 +37,25 @@ public abstract class BaseTableOperation{ config.setTableStoreInstance(tableStoreConf.getInstanceName()); config.setDataTableName(tableConfig.getDataTableName()); config.setMetaTableName(tableConfig.getMetaTableName()); - tableStoreGrid = new TableStoreGrid(config); + connect(); } + /** + * 连接数据库 + */ + public void connect() { + if (tableStoreGrid == null) { + tableStoreGrid = new TableStoreGrid(config); + } + } + + /** 断开数据库 + * + */ public void close() { if (tableStoreGrid != null) { tableStoreGrid.close(); + tableStoreGrid = null; } } } diff --git a/weather-service/src/main/java/com/htfp/weather/griddata/operation/CreateTable.java b/weather-service/src/main/java/com/htfp/weather/griddata/operation/CreateTable.java index 93a10a5..6fb38fa 100644 --- a/weather-service/src/main/java/com/htfp/weather/griddata/operation/CreateTable.java +++ b/weather-service/src/main/java/com/htfp/weather/griddata/operation/CreateTable.java @@ -39,7 +39,7 @@ public class CreateTable extends BaseTableOperation { AttributionEnum[] values = AttributionEnum.values(); ArrayList fieldSchemas = new ArrayList<>(); for (AttributionEnum attributionEnum : values) { - fieldSchemas.add(new FieldSchema(attributionEnum.getName(), FieldType.KEYWORD).setIndex(true).setEnableSortAndAgg(true)); + fieldSchemas.add(new FieldSchema(attributionEnum.getName(), attributionEnum.getType()).setIndex(true).setEnableSortAndAgg(true)); } indexSchema.setFieldSchemas(fieldSchemas); this.tableStoreGrid.createMetaIndex(TableConfigStatic.META_INDEX_NAME, indexSchema); diff --git a/weather-service/src/main/java/com/htfp/weather/griddata/operation/GfsDataFetcher.java b/weather-service/src/main/java/com/htfp/weather/griddata/operation/GfsDataFetcher.java index 7112dd1..785c30e 100644 --- a/weather-service/src/main/java/com/htfp/weather/griddata/operation/GfsDataFetcher.java +++ b/weather-service/src/main/java/com/htfp/weather/griddata/operation/GfsDataFetcher.java @@ -20,6 +20,7 @@ import org.springframework.util.CollectionUtils; import ucar.ma2.Array; import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.annotation.Resource; import java.time.Duration; import java.time.Instant; @@ -43,7 +44,10 @@ public class GfsDataFetcher extends BaseTableOperation { @Resource QueryMeta queryMeta; GridDataSetMeta lastGridDataSetMeta; - + @PreDestroy + public void destroy() { + close(); + } public GridDataSetMeta getLastGridDataSetMeta() { if (lastGridDataSetMeta == null) { updateLastGridDataSetMeta(); diff --git a/weather-service/src/main/java/com/htfp/weather/griddata/operation/GfsDataImport.java b/weather-service/src/main/java/com/htfp/weather/griddata/operation/GfsDataImport.java index 1585511..e60827f 100644 --- a/weather-service/src/main/java/com/htfp/weather/griddata/operation/GfsDataImport.java +++ b/weather-service/src/main/java/com/htfp/weather/griddata/operation/GfsDataImport.java @@ -3,6 +3,7 @@ package com.htfp.weather.griddata.operation; import com.aliyun.tablestore.grid.GridDataWriter; import com.aliyun.tablestore.grid.model.GridDataSetMeta; import com.aliyun.tablestore.grid.model.StoreOptions; +import com.aliyun.tablestore.grid.model.grid.Grid; import com.aliyun.tablestore.grid.model.grid.Grid2D; import com.htfp.weather.download.gfs.GfsVariableHeightEnum; @@ -17,9 +18,9 @@ import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.context.annotation.DependsOn; -import org.springframework.context.annotation.Description; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; +import sun.nio.ch.DirectBuffer; import ucar.ma2.*; import ucar.nc2.NetcdfFile; import ucar.nc2.NetcdfFiles; @@ -27,8 +28,8 @@ import ucar.nc2.Variable; import javax.annotation.PreDestroy; import javax.annotation.Resource; -import javax.annotation.security.DenyAll; import java.io.File; +import java.nio.ByteBuffer; import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.util.*; @@ -50,7 +51,7 @@ public class GfsDataImport extends BaseTableOperation { @Getter boolean importing = false; private final ExecutorService executorService = Executors.newFixedThreadPool(5); - + GridDataWriter writer; /** * 表格元数据初始化 * @@ -91,6 +92,7 @@ public class GfsDataImport extends BaseTableOperation { /** 导入指定起报时间的所有文件*/ public synchronized List importData(OffsetDateTime refTime) throws Exception { importing = true; + connect(); try { long start = System.currentTimeMillis(); List fileList = getFiles(refTime); @@ -103,8 +105,9 @@ public class GfsDataImport extends BaseTableOperation { List fileVariables = getFileVariables(tableConfig.variableList); int[] shape = new int[]{tableConfig.timeSizeMax, tableConfig.levSize, tableConfig.latSize, tableConfig.lonSize}; GridDataSetMeta meta = initMeta(dataSetId, tableConfig.dataType, fileVariables, shape); - List forecastHours = new ArrayList<>(); // 所有有效预报时效坐标记录到数据库属性中 + writer = tableStoreGrid.getDataWriter(meta); + List forecastHours = new ArrayList<>(); // 所有有效预报时效坐标记录到数据库属性中 // todo 2024/5/13: 待优化,用于数据库的索引,必须连续,因此必须保证前一个时刻成功导入后才能导入下一个时刻,数据量大的时候导入时间较长 List finishedList; // List> futures = new ArrayList<>(); @@ -138,7 +141,7 @@ public class GfsDataImport extends BaseTableOperation { meta.addAttribute("status", "DONE"); } long end = System.currentTimeMillis(); - log.info("[tablestore] 数据导入完成, 耗时: {} s, forecastHours: {}", (end - start)/1000., forecastHours); + log.info("[tablestore] 数据导入完成, 耗时: {} s, forecastHours: {}", (end - start) / 1000., forecastHours); meta.setForecastHours(forecastHours); meta.addAttribute("reference_time", refTime.toInstant().toEpochMilli()); putMeta(meta); @@ -147,6 +150,7 @@ public class GfsDataImport extends BaseTableOperation { return finishedList; } finally { importing = false; + close(); } } @@ -159,8 +163,6 @@ public class GfsDataImport extends BaseTableOperation { */ public ImportFileInfo importFromNcFile(GridDataSetMeta meta, String file, int iTime, int forecastHour) { try (NetcdfFile ncFile = NetcdfFiles.open(file)) { - GridDataWriter writer = tableStoreGrid.getDataWriter(meta); - // 相对reftime的小时数,文件可能缺失,因此time可能是不连续的,但是iTime是连续的 if (forecastHour == -1) { forecastHour = (int) ncFile.findVariable("time").read().getDouble(0); @@ -182,36 +184,47 @@ public class GfsDataImport extends BaseTableOperation { int zSize = variable.getShape(1); for (int z = 0; z < zSize; z++) { // 注意高度索引是递增排序 - Array array = variable.read(new int[]{0, z, 0, 0}, new int[]{1, 1, xsize, ysize}); - transferUnit(variableName, array); - Grid2D grid2D = new Grid2D(array.getDataAsByteBuffer(), variable.getDataType(), + ByteBuffer dataBuffer = transferUnit( + variableName, variable.read(new int[]{0, z, 0, 0}, new int[]{1, 1, xsize, ysize}) + ).getDataAsByteBuffer(); + Grid2D grid2D = new Grid2D(dataBuffer, variable.getDataType(), new int[]{0, 0}, new int[]{xsize, ysize}); writer.writeGrid2D(variableName, iTime, z, grid2D); + dataBuffer=null; grid2D = null; } } else if (shapeLength == 3) { // DONE 2024/5/24: 导入不含高度坐标的数据,如降水量,阵风风速 - Array array = variable.read(new int[]{0, 0, 0}, new int[]{1,xsize, ysize}); - transferUnit(variableName, array); - Grid2D grid2D = new Grid2D(array.getDataAsByteBuffer(), variable.getDataType(), + ByteBuffer dataBuffer = transferUnit( + variableName, variable.read(new int[]{0, 0, 0}, new int[]{1,xsize, ysize})) + .getDataAsByteBuffer(); + Grid2D grid2D = new Grid2D(dataBuffer, variable.getDataType(), new int[]{0, 0}, new int[]{xsize, ysize}); writer.writeGrid2D(variableName, iTime, 0, grid2D); + dataBuffer= null; grid2D = null; } } else { log.warn("[tablestore] 数据文件 {} 中没有变量 {}", ncFile.getLocation(), variableName); } + } // 导入风速风向 - importWind(writer, meta, ncFile, iTime); + importWind(meta, ncFile, iTime); } catch (Exception e) { log.error("[tablestore] 导入文件数据失败,_t={}: {}", forecastHour, file, e); return new ImportFileInfo(false, file, forecastHour, iTime); + } finally { + System.gc(); } log.info("[tablestore] 导入文件数据成功,_t={}: {}", forecastHour, file); return new ImportFileInfo(true, file, forecastHour, iTime); } - /**单位转换*/ - private void transferUnit(String variableName, Array array) { + /** + * 单位转换 + * + * @return + */ + private Array transferUnit(String variableName, Array array) { if (GfsVariableIsobaricEnum.TEMP.getNameInFile().equals(variableName)) { MeteoUtils.kelvin2Celsius(array); } @@ -221,10 +234,11 @@ public class GfsDataImport extends BaseTableOperation { if (GfsVariableHeightEnum.PRECIP.getNameInFile().equals(variableName)) { MeteoUtils.precipRate2mmPerHour(array); } + return array; } /** 计算风速风向,包括地面坐标和气压坐标,并导入数据库*/ - private void importWind(GridDataWriter writer, GridDataSetMeta meta, NetcdfFile ncFile, int iTime) throws Exception { + private void importWind( GridDataSetMeta meta, NetcdfFile ncFile, int iTime) throws Exception { // TODO 2024/5/8: 风速风向最好单独保存为一个文件,如果后续需要二维可视化,可以直接本地读取出图,减少网络请求 for (String suffix : new String[]{"_isobaric", "_height_above_ground"}) { Variable uwnd = ncFile.findVariable("u-component_of_wind" + suffix); @@ -248,6 +262,9 @@ public class GfsDataImport extends BaseTableOperation { Grid2D dirGrid2D = new Grid2D(dirArray.getDataAsByteBuffer(), dirArray.getDataType(), new int[]{0, 0}, new int[]{xsize, ysize}); writer.writeGrid2D("Wind_direction" + suffix, iTime, z, dirGrid2D); + + uwndArray = null; vwndArray = null; speedArray = null; dirArray = null; + speedGrid2D = null; dirGrid2D = null; } } } diff --git a/weather-service/src/main/java/com/htfp/weather/griddata/operation/QueryMeta.java b/weather-service/src/main/java/com/htfp/weather/griddata/operation/QueryMeta.java index 350354b..8bbbac1 100644 --- a/weather-service/src/main/java/com/htfp/weather/griddata/operation/QueryMeta.java +++ b/weather-service/src/main/java/com/htfp/weather/griddata/operation/QueryMeta.java @@ -3,6 +3,7 @@ package com.htfp.weather.griddata.operation; import com.alicloud.openservices.tablestore.model.search.sort.FieldSort; import com.alicloud.openservices.tablestore.model.search.sort.Sort; import com.alicloud.openservices.tablestore.model.search.sort.SortOrder; +import com.aliyun.tablestore.grid.consts.AttributionEnum; import com.aliyun.tablestore.grid.core.QueryBuilder; import com.aliyun.tablestore.grid.model.GridDataSetMeta; import com.aliyun.tablestore.grid.model.QueryGridDataSetResult; @@ -11,7 +12,10 @@ import com.htfp.weather.griddata.common.TableConfig; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.annotation.Resource; +import javax.crypto.interfaces.PBEKey; import java.util.Collections; import java.util.List; @@ -24,6 +28,11 @@ import java.util.List; public class QueryMeta extends BaseTableOperation { @Resource TableConfig tableConfig; + + @PreDestroy + public void destroy() { + close(); + } /** * 查询最新的数据集信息 * @@ -37,7 +46,8 @@ public class QueryMeta extends BaseTableOperation { QueryBuilder.and() .equal("status", "DONE") .build(), - new QueryParams(0, 10, new Sort(Collections.singletonList(new FieldSort("reference_time", SortOrder.DESC))))); + new QueryParams(0, 10, new Sort(Collections.singletonList(new FieldSort(AttributionEnum.REFERENCE_TIME.getName(), SortOrder.DESC)))) + ); List gridDataSetMetas = result.getGridDataSetMetas(); if (CollectionUtils.isEmpty(gridDataSetMetas)) { throw new RuntimeException("meta table为空"); diff --git a/weather-service/src/main/java/com/htfp/weather/schedule/GridDataProcessor.java b/weather-service/src/main/java/com/htfp/weather/schedule/GridDataProcessor.java index 3dfea7e..08028cf 100644 --- a/weather-service/src/main/java/com/htfp/weather/schedule/GridDataProcessor.java +++ b/weather-service/src/main/java/com/htfp/weather/schedule/GridDataProcessor.java @@ -50,8 +50,8 @@ public class GridDataProcessor { private final ExecutorService executorService = Executors.newFixedThreadPool(3); boolean test = false; - /**每日北京时0,8,12,18点执行*/ - @Scheduled(cron = "0 0 0,8,12,18 * * ?") + /**每日北京时0,8,12,18点 30分执行*/ + @Scheduled(cron = "0 30 0,8,12,18 * * ?") public void dailyDataProcess() { if (download()) { importToTableStore(); diff --git a/weather-service/src/main/java/com/htfp/weather/utils/HttpClientUtils.java b/weather-service/src/main/java/com/htfp/weather/utils/HttpClientUtils.java index 060cf82..b54d497 100644 --- a/weather-service/src/main/java/com/htfp/weather/utils/HttpClientUtils.java +++ b/weather-service/src/main/java/com/htfp/weather/utils/HttpClientUtils.java @@ -53,7 +53,7 @@ public class HttpClientUtils { // } public static T sendGet(String url, Map params, Class responseClass) throws Exception { String jsonStr = sendGet(url, params); - return JSONUtils.json2pojo(jsonStr, responseClass); + return JSONUtils.json2obj(jsonStr, responseClass); } public static String sendGet(String url, Map params) throws IOException { StringBuilder stringBuilder = new StringBuilder(); @@ -92,7 +92,7 @@ public class HttpClientUtils { } - public static boolean downloadFileByUrl(String sourceUrl, String localPath) { + public static void downloadFileByUrl(String sourceUrl, String localPath) throws IOException { File file = new File(localPath); Request request = new Request.Builder() .url(sourceUrl) @@ -100,15 +100,15 @@ public class HttpClientUtils { try (Response response = DONLOAD_OKHTTP_CLIENT.newCall(request).execute()) { if (response.code() == 200) { + assert response.body() != null; InputStream stream = response.body().byteStream(); - Files.copy(stream, file.toPath(), StandardCopyOption.REPLACE_EXISTING); + long dataBytes = Files.copy(stream, file.toPath(), StandardCopyOption.REPLACE_EXISTING); + log.debug("文件{}下载完成,文件大小: {} bytes", localPath, dataBytes); } else { - return false; + throw new RuntimeException("文件下载失败,Response:" + response); } - } catch (IOException e) { - return false; } - return true; + } } diff --git a/weather-service/src/main/java/com/htfp/weather/utils/JSONUtils.java b/weather-service/src/main/java/com/htfp/weather/utils/JSONUtils.java index da0fd75..c36db87 100644 --- a/weather-service/src/main/java/com/htfp/weather/utils/JSONUtils.java +++ b/weather-service/src/main/java/com/htfp/weather/utils/JSONUtils.java @@ -1,13 +1,13 @@ package com.htfp.weather.utils; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,67 +20,58 @@ public class JSONUtils { } public static ObjectMapper getInstance() { - return objectMapper; } /** * javaBean,list,array convert to json string */ - public static String obj2json(Object obj) throws Exception { + public static String obj2json(Object obj) throws JsonProcessingException { return objectMapper.writeValueAsString(obj); } /** * json string convert to javaBean */ - public static T json2pojo(String jsonStr, Class clazz) - throws Exception { + public static T json2obj(String jsonStr, Class clazz) throws IOException { return objectMapper.readValue(jsonStr, clazz); } - + /** + * 通用静态方法:将JSON字符串转换为带泛型的类, T嵌套了其他泛型 + */ + public static T json2obj(String json, TypeReference typeReference) throws IOException { + return objectMapper.readValue(json, typeReference); + } /** * json string convert to map */ - public static Map json2map(String jsonStr) - throws Exception { - return objectMapper.readValue(jsonStr, Map.class); + public static Map json2map(String jsonStr) throws IOException { + return objectMapper.readValue(jsonStr, new TypeReference>() {}); } /** - * json string convert to map with javaBean + * JSON string convert to map with specific javaBean */ - public static Map json2map(String jsonStr, Class clazz) - throws Exception { - Map> map = (Map>) objectMapper.readValue(jsonStr, - new TypeReference>() { - }); - Map result = new HashMap(); - for (Map.Entry> entry : map.entrySet()) { - result.put(entry.getKey(), map2pojo(entry.getValue(), clazz)); - } - return result; + public static Map json2map(String jsonStr, Class clazz) throws IOException { + JavaType type = objectMapper.getTypeFactory().constructMapType(Map.class, String.class, clazz); + return objectMapper.readValue(jsonStr, type); } /** - * json array string convert to list with javaBean + * json array string convert to list with specific javaBean */ public static List json2list(String jsonArrayStr, Class clazz) - throws Exception { - List> list = (List>) objectMapper.readValue(jsonArrayStr, - new TypeReference>() { - }); - List result = new ArrayList(); - for (Map map : list) { - result.add(map2pojo(map, clazz)); - } - return result; + throws IOException { + return objectMapper.readValue( + jsonArrayStr, + objectMapper.getTypeFactory().constructCollectionType(List.class, clazz) + ); } /** * map convert to javaBean */ - public static T map2pojo(Map map, Class clazz) { + public static T map2obj(Map map, Class clazz) { return objectMapper.convertValue(map, clazz); } @@ -89,4 +80,7 @@ public class JSONUtils { objectMapper.enable(SerializationFeature.INDENT_OUTPUT); objectMapper.writeValue(new File(filePath), obj); } + public static void main(String[] args) throws Exception { + + } } \ No newline at end of file diff --git a/weather-service/src/main/java/com/htfp/weather/web/config/aspect/ControllerLogAspect.java b/weather-service/src/main/java/com/htfp/weather/web/config/aspect/ControllerLogAspect.java index dbe889a..90007f7 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/config/aspect/ControllerLogAspect.java +++ b/weather-service/src/main/java/com/htfp/weather/web/config/aspect/ControllerLogAspect.java @@ -1,6 +1,6 @@ package com.htfp.weather.web.config.aspect; -import com.htfp.weather.web.pojo.response.Result; +import com.htfp.weather.web.param.response.Result; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.JoinPoint; diff --git a/weather-service/src/main/java/com/htfp/weather/web/config/interceptor/InterfaceInterceptor.java b/weather-service/src/main/java/com/htfp/weather/web/config/interceptor/InterfaceInterceptor.java index 8a694d7..e79b388 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/config/interceptor/InterfaceInterceptor.java +++ b/weather-service/src/main/java/com/htfp/weather/web/config/interceptor/InterfaceInterceptor.java @@ -1,17 +1,22 @@ package com.htfp.weather.web.config.interceptor; +import com.htfp.weather.utils.JSONUtils; +import com.htfp.weather.web.exception.ErrorCode; +import com.htfp.weather.web.param.response.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import javax.crypto.Mac; -import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; +import java.util.Arrays; import java.util.Formatter; +import java.util.List; /** * @Author : shiyi @@ -27,10 +32,12 @@ public class InterfaceInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String servletPath = request.getServletPath(); // log.info("InterfaceInterceptor.preHandle >> 进入拦截, {}, {}", servletPath, handler.getClass().getName()); + // ip 校验 if (checkIp(request)) { return true; } + // 签名校验 final String signature = request.getHeader("signature"); final String timestamp = String.valueOf(request.getHeader("timestamp")); @@ -38,6 +45,7 @@ public class InterfaceInterceptor implements HandlerInterceptor { String checkSignature = createSignature(timestamp, requestURI); if (!checkSignature.equalsIgnoreCase(signature)) { + failedResponse(response); return false; } @@ -45,25 +53,25 @@ public class InterfaceInterceptor implements HandlerInterceptor { long nowTime = System.currentTimeMillis(); long reqTime = Long.parseLong(timestamp); if (Math.abs(nowTime - reqTime) > SECONDS) { + failedResponse(response); return false; } return true; } - + private void failedResponse(HttpServletResponse response) throws IOException { + response.getWriter().write(JSONUtils.obj2json(Result.error(ErrorCode.API_VALIDATE_ERROR))); + } private boolean checkIp(HttpServletRequest request) { String remoteAddr = request.getRemoteAddr(); - if ("127.0.0.1".equals(remoteAddr) || "0:0:0:0:0:0:0:1".equals(remoteAddr)) { + List whiteNameList = Arrays.asList("127.0.0.1", "182.92.130.23", "123.57.5.1", "0:0:0:0:0:0:0:1"); + if (whiteNameList.contains(remoteAddr)) { return true; } if (remoteAddr.startsWith("172.10.0.")) { // 局域网测试 return true; } - if ("182.92.130.23".equals(remoteAddr)) { - // 本地服务 - return true; - } return false; } diff --git a/weather-service/src/main/java/com/htfp/weather/web/controller/ConfigController.java b/weather-service/src/main/java/com/htfp/weather/web/controller/ConfigController.java index f23bfce..8613db5 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/controller/ConfigController.java +++ b/weather-service/src/main/java/com/htfp/weather/web/controller/ConfigController.java @@ -11,13 +11,13 @@ import com.htfp.weather.web.config.Config; import com.htfp.weather.web.config.aspect.ControllerLog; import com.htfp.weather.web.exception.AppException; import com.htfp.weather.web.exception.ErrorCode; -import com.htfp.weather.web.pojo.request.GfsConfigUpdate; -import com.htfp.weather.web.pojo.request.TableConfigUpdate; -import com.htfp.weather.web.pojo.response.DownloadResult; -import com.htfp.weather.web.pojo.response.ImportResult; -import com.htfp.weather.web.pojo.response.Result; +import com.htfp.weather.web.param.request.GfsConfigUpdate; +import com.htfp.weather.web.param.request.TableConfigUpdate; +import com.htfp.weather.web.param.response.DownloadResult; +import com.htfp.weather.web.param.response.ImportResult; +import com.htfp.weather.web.param.response.Result; import com.htfp.weather.web.service.FileService; -import com.htfp.weather.web.service.GfsDataServiceImpl; +import com.htfp.weather.web.service.GfsUpperDataServiceImpl; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.springframework.util.CollectionUtils; @@ -52,7 +52,7 @@ public class ConfigController { @Resource FileService fileService; @Resource - GfsDataServiceImpl gfsDataService; + GfsUpperDataServiceImpl gfsDataService; @Resource SurfaceWeatherController surfaceWeatherController; @@ -229,7 +229,7 @@ public class ConfigController { File dataDir = new File(gfsDataConfig.getSaveRoot(), timeStr); // 查找目录下的文件 - List fileList = fileService.getFileList(dataDir); + List fileList = fileService.getFileList(dataDir); return Result.success(fileList); } diff --git a/weather-service/src/main/java/com/htfp/weather/web/controller/ControllerExceptionAdvice.java b/weather-service/src/main/java/com/htfp/weather/web/controller/ControllerExceptionAdvice.java index 95b3f15..4edde1e 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/controller/ControllerExceptionAdvice.java +++ b/weather-service/src/main/java/com/htfp/weather/web/controller/ControllerExceptionAdvice.java @@ -2,7 +2,7 @@ package com.htfp.weather.web.controller; import com.htfp.weather.web.exception.AppException; import com.htfp.weather.web.exception.ErrorCode; -import com.htfp.weather.web.pojo.response.Result; +import com.htfp.weather.web.param.response.Result; import org.springframework.validation.BindException; import org.springframework.validation.ObjectError; import org.springframework.web.bind.annotation.ExceptionHandler; diff --git a/weather-service/src/main/java/com/htfp/weather/web/controller/SurfaceWeatherController.java b/weather-service/src/main/java/com/htfp/weather/web/controller/SurfaceWeatherController.java index 9a1ebef..e596e0b 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/controller/SurfaceWeatherController.java +++ b/weather-service/src/main/java/com/htfp/weather/web/controller/SurfaceWeatherController.java @@ -2,12 +2,13 @@ package com.htfp.weather.web.controller; import com.htfp.weather.web.config.aspect.ControllerLog; import com.htfp.weather.web.exception.ErrorCode; -import com.htfp.weather.web.pojo.request.Position2D; -import com.htfp.weather.web.pojo.response.NowWeatherStatus; -import com.htfp.weather.web.pojo.response.Result; -import com.htfp.weather.web.pojo.response.SurfaceWeatherWarning; -import com.htfp.weather.web.pojo.response.TimeSeriesDataset; -import com.htfp.weather.web.service.GfsDataServiceImpl; +import com.htfp.weather.web.param.cma.CmaWarning; +import com.htfp.weather.web.param.request.Position2D; +import com.htfp.weather.web.param.response.NowWeatherStatus; +import com.htfp.weather.web.param.response.Result; +import com.htfp.weather.web.param.response.SurfaceWeatherWarning; +import com.htfp.weather.web.param.response.TimeSeriesDataset; +import com.htfp.weather.web.service.GfsUpperDataServiceImpl; import com.htfp.weather.web.service.surfaceapi.CaiYunServiceImpl; import com.htfp.weather.web.service.surfaceapi.CmaServiceImpl; import com.htfp.weather.web.service.surfaceapi.HeFengServiceImpl; @@ -28,7 +29,7 @@ import java.util.List; @CrossOrigin @RestController @Slf4j -@RequestMapping("/htfp/weather/surface/") +@RequestMapping("/htfp/weather/v1/surface/") public class SurfaceWeatherController { @Resource CmaServiceImpl cmaService; @@ -37,7 +38,7 @@ public class SurfaceWeatherController { @Resource CaiYunServiceImpl caiYunService; @Resource - GfsDataServiceImpl gfsDataService; + GfsUpperDataServiceImpl gfsDataService; ISurfaceDataService service; @PostConstruct public void init() { @@ -94,4 +95,12 @@ public class SurfaceWeatherController { return Result.success(warning); } + @PostMapping("/queryAllWeatherWarning") + @ControllerLog(info = "全国地面气象预警信息查询") + public Result queryWeatherWarning() throws Exception { + // List warning = surfaceDataService.getSurfaceWarning(lat, lon); + List cmaWarningList = cmaService.getSurfaceWeatherWarnings(null); + cmaService.updateCmaWarningCache(cmaWarningList); + return Result.success(cmaWarningList); + } } diff --git a/weather-service/src/main/java/com/htfp/weather/web/controller/UpperWeatherController.java b/weather-service/src/main/java/com/htfp/weather/web/controller/UpperWeatherController.java index 8577279..4849003 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/controller/UpperWeatherController.java +++ b/weather-service/src/main/java/com/htfp/weather/web/controller/UpperWeatherController.java @@ -4,10 +4,11 @@ import com.htfp.weather.utils.DateTimeUtils; import com.htfp.weather.web.config.aspect.ControllerLog; import com.htfp.weather.web.exception.AppException; import com.htfp.weather.web.exception.ErrorCode; -import com.htfp.weather.web.pojo.request.*; -import com.htfp.weather.web.pojo.response.*; -import com.htfp.weather.web.service.GfsDataServiceImpl; +import com.htfp.weather.web.param.request.*; +import com.htfp.weather.web.param.response.*; +import com.htfp.weather.web.service.GfsUpperDataServiceImpl; import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -24,11 +25,11 @@ import java.util.List; @CrossOrigin @RestController @Slf4j -@RequestMapping("/htfp/weather/upper/") +@RequestMapping("/htfp/weather/v1/upper/") public class UpperWeatherController { @Resource(name = "tablestore-gfs") - GfsDataServiceImpl gfsDataService; + GfsUpperDataServiceImpl gfsDataService; @PostMapping("/queryUpperNowWeather") @ControllerLog(info = "高空实时气象信息查询") @@ -43,20 +44,13 @@ public class UpperWeatherController { @PostMapping("/queryUpperNowWeatherInMultiPoints") @ControllerLog(info = "高空航点实时气象信息查询") public Result queryUpperNowWeatherInMultiPoints(@Validated @RequestBody MultiPointsRequest multiPointsRequest) { - List latitudeList = new ArrayList<>(); - List longitudeList = new ArrayList<>(); - for (Position2D position : multiPointsRequest.getPointList()) { - Double latitude = position.getLatitude(); - Double longitude = position.getLongitude(); - if (latitude != null && longitude != null) { - latitudeList.add(latitude); - longitudeList.add(longitude); - } else { - throw new AppException(ErrorCode.MULTI_INDEX_ERROR); - } - } - int level = multiPointsRequest.getLevel().intValue(); - List nowWeatherByMultiPoint = gfsDataService.getNowWeatherByMultiPoint(level, latitudeList, longitudeList); + List pointList = multiPointsRequest.getPointList(); + int size = pointList.size(); + List latitudeList = new ArrayList<>(size); + List longitudeList = new ArrayList<>(size); + checkLatitudeLongitude(latitudeList, longitudeList, pointList); + int level = multiPointsRequest.getLevel(); + List nowWeatherByMultiPoint = gfsDataService.getNowWeatherByMultiPoint(latitudeList, longitudeList, level); return Result.success(nowWeatherByMultiPoint); } @@ -73,19 +67,12 @@ public class UpperWeatherController { @PostMapping("/queryUpperForecastInMultiPoints") @ControllerLog(info = "高空航点24小时预报结果查询") public Result queryUpperForecastInMultiPoints(@Validated @RequestBody MultiPointsRequest multiPointsRequest) { - List latitudeList = new ArrayList<>(); - List longitudeList = new ArrayList<>(); - for (Position2D position : multiPointsRequest.getPointList()) { - Double latitude = position.getLatitude(); - Double longitude = position.getLongitude(); - if (latitude != null && longitude != null) { - latitudeList.add(latitude); - longitudeList.add(longitude); - } else { - throw new AppException(ErrorCode.MULTI_INDEX_ERROR); - } - } - int level = multiPointsRequest.getLevel().intValue(); + List pointList = multiPointsRequest.getPointList(); + int size = pointList.size(); + List latitudeList = new ArrayList<>(size); + List longitudeList = new ArrayList<>(size); + checkLatitudeLongitude(latitudeList, longitudeList, pointList); + int level = multiPointsRequest.getLevel(); List nowWeatherByMultiPoint = gfsDataService.getForecastSeriesByMultiPoint(latitudeList, longitudeList, level); return Result.success(nowWeatherByMultiPoint); } @@ -171,4 +158,22 @@ public class UpperWeatherController { return Result.success(forecastSeries); } + + private void checkLatitudeLongitude(List latitudeList, List longitudeList, List pointList) { + if (CollectionUtils.isEmpty(pointList)) { + throw new AppException(ErrorCode.EMPTY_INDEX_ERROR, "航点列表为空"); + } + int size = pointList.size(); + + for (Position2D position : pointList) { + Double latitude = position.getLatitude(); + Double longitude = position.getLongitude(); + if (latitude != null && longitude != null) { + latitudeList.add(latitude); + longitudeList.add(longitude); + } else { + throw new AppException(ErrorCode.MULTI_INDEX_ERROR, "经纬度不允许为空"); + } + } + } } diff --git a/weather-service/src/main/java/com/htfp/weather/web/exception/ErrorCode.java b/weather-service/src/main/java/com/htfp/weather/web/exception/ErrorCode.java index 2a12966..35b7872 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/exception/ErrorCode.java +++ b/weather-service/src/main/java/com/htfp/weather/web/exception/ErrorCode.java @@ -1,5 +1,7 @@ package com.htfp.weather.web.exception; +import org.checkerframework.checker.units.qual.A; + /** * @Author : shiyi * @Date : 2024/3/14 16:30 @@ -8,7 +10,7 @@ package com.htfp.weather.web.exception; public enum ErrorCode { // - OTHER_ERROR(-1, "其他错误"), + API_VALIDATE_ERROR(-1, "接口校验错误"), VALIDATE_ERROR(1001, "参数校验错误 "), CONFIG_ERROR(1002, "配置相关错误 "), SECRET_ERROR(1003, "无权限访问"), @@ -39,6 +41,7 @@ public enum ErrorCode { NO_SUCH_VARIABLE(6006, "找不到变量名映射"), TABLESTORE_QUERY_ERROR(6007, "数据库查询错误"), RESPONSE_DATA_BUILD_ERROR(6008, "查询数据结果构建错误"), + EMPTY_INDEX_ERROR(6009, "坐标索引为空"), ; private final int code; private final String msg; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/caiyun/CaiYunBaseResponse.java b/weather-service/src/main/java/com/htfp/weather/web/param/caiyun/CaiYunBaseResponse.java similarity index 84% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/caiyun/CaiYunBaseResponse.java rename to weather-service/src/main/java/com/htfp/weather/web/param/caiyun/CaiYunBaseResponse.java index fe249e1..8c97c1c 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/caiyun/CaiYunBaseResponse.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/caiyun/CaiYunBaseResponse.java @@ -1,9 +1,7 @@ -package com.htfp.weather.web.pojo.caiyun; +package com.htfp.weather.web.param.caiyun; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; -import lombok.EqualsAndHashCode; import java.util.List; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/caiyun/CaiYunForecastResponse.java b/weather-service/src/main/java/com/htfp/weather/web/param/caiyun/CaiYunForecastResponse.java similarity index 95% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/caiyun/CaiYunForecastResponse.java rename to weather-service/src/main/java/com/htfp/weather/web/param/caiyun/CaiYunForecastResponse.java index 986a00f..2fbcb96 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/caiyun/CaiYunForecastResponse.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/caiyun/CaiYunForecastResponse.java @@ -1,9 +1,8 @@ -package com.htfp.weather.web.pojo.caiyun; +package com.htfp.weather.web.param.caiyun; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; -import lombok.EqualsAndHashCode; import java.util.List; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/caiyun/CaiYunNowResponse.java b/weather-service/src/main/java/com/htfp/weather/web/param/caiyun/CaiYunNowResponse.java similarity index 95% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/caiyun/CaiYunNowResponse.java rename to weather-service/src/main/java/com/htfp/weather/web/param/caiyun/CaiYunNowResponse.java index eb102c1..5c03e2d 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/caiyun/CaiYunNowResponse.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/caiyun/CaiYunNowResponse.java @@ -1,9 +1,8 @@ -package com.htfp.weather.web.pojo.caiyun; +package com.htfp.weather.web.param.caiyun; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; -import lombok.EqualsAndHashCode; /** * @Author : shiyi diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/caiyun/CaiYunWarningResponse.java b/weather-service/src/main/java/com/htfp/weather/web/param/caiyun/CaiYunWarningResponse.java similarity index 97% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/caiyun/CaiYunWarningResponse.java rename to weather-service/src/main/java/com/htfp/weather/web/param/caiyun/CaiYunWarningResponse.java index 22405cd..8ac69ad 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/caiyun/CaiYunWarningResponse.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/caiyun/CaiYunWarningResponse.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.caiyun; +package com.htfp.weather.web.param.caiyun; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/cma/AntiGeoCodeResponse.java b/weather-service/src/main/java/com/htfp/weather/web/param/cma/AntiGeoCodeResponse.java similarity index 97% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/cma/AntiGeoCodeResponse.java rename to weather-service/src/main/java/com/htfp/weather/web/param/cma/AntiGeoCodeResponse.java index 2393764..0bcf18a 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/cma/AntiGeoCodeResponse.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/cma/AntiGeoCodeResponse.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.cma; +package com.htfp.weather.web.param.cma; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/cma/CmaWarning.java b/weather-service/src/main/java/com/htfp/weather/web/param/cma/CmaWarning.java similarity index 96% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/cma/CmaWarning.java rename to weather-service/src/main/java/com/htfp/weather/web/param/cma/CmaWarning.java index 1be30a3..64d93c9 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/cma/CmaWarning.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/cma/CmaWarning.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.cma; +package com.htfp.weather.web.param.cma; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/hefeng/BaseHeFengData.java b/weather-service/src/main/java/com/htfp/weather/web/param/hefeng/BaseHeFengData.java similarity index 94% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/hefeng/BaseHeFengData.java rename to weather-service/src/main/java/com/htfp/weather/web/param/hefeng/BaseHeFengData.java index 741ab70..9b8b040 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/hefeng/BaseHeFengData.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/hefeng/BaseHeFengData.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.hefeng; +package com.htfp.weather.web.param.hefeng; import lombok.Data; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/hefeng/HeFengBaseResponse.java b/weather-service/src/main/java/com/htfp/weather/web/param/hefeng/HeFengBaseResponse.java similarity index 80% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/hefeng/HeFengBaseResponse.java rename to weather-service/src/main/java/com/htfp/weather/web/param/hefeng/HeFengBaseResponse.java index 74f0e37..527c19a 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/hefeng/HeFengBaseResponse.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/hefeng/HeFengBaseResponse.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.hefeng; +package com.htfp.weather.web.param.hefeng; import lombok.Data; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/hefeng/HeFengForecastResponse.java b/weather-service/src/main/java/com/htfp/weather/web/param/hefeng/HeFengForecastResponse.java similarity index 88% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/hefeng/HeFengForecastResponse.java rename to weather-service/src/main/java/com/htfp/weather/web/param/hefeng/HeFengForecastResponse.java index ac897d0..7a70e81 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/hefeng/HeFengForecastResponse.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/hefeng/HeFengForecastResponse.java @@ -1,9 +1,8 @@ -package com.htfp.weather.web.pojo.hefeng; +package com.htfp.weather.web.param.hefeng; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; import lombok.EqualsAndHashCode; -import org.jetbrains.annotations.NotNull; import java.util.List; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/hefeng/HeFengNowResponse.java b/weather-service/src/main/java/com/htfp/weather/web/param/hefeng/HeFengNowResponse.java similarity index 92% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/hefeng/HeFengNowResponse.java rename to weather-service/src/main/java/com/htfp/weather/web/param/hefeng/HeFengNowResponse.java index a1950d2..0f8ecc0 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/hefeng/HeFengNowResponse.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/hefeng/HeFengNowResponse.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.hefeng; +package com.htfp.weather.web.param.hefeng; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/hefeng/HeFengWarningResponse.java b/weather-service/src/main/java/com/htfp/weather/web/param/hefeng/HeFengWarningResponse.java similarity index 95% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/hefeng/HeFengWarningResponse.java rename to weather-service/src/main/java/com/htfp/weather/web/param/hefeng/HeFengWarningResponse.java index f0ee5eb..5252c13 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/hefeng/HeFengWarningResponse.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/hefeng/HeFengWarningResponse.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.hefeng; +package com.htfp.weather.web.param.hefeng; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/request/ForecastRequest.java b/weather-service/src/main/java/com/htfp/weather/web/param/request/ForecastRequest.java similarity index 95% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/request/ForecastRequest.java rename to weather-service/src/main/java/com/htfp/weather/web/param/request/ForecastRequest.java index 2098621..2e47d3f 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/request/ForecastRequest.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/request/ForecastRequest.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.request; +package com.htfp.weather.web.param.request; import lombok.Data; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/request/GfsConfigUpdate.java b/weather-service/src/main/java/com/htfp/weather/web/param/request/GfsConfigUpdate.java similarity index 83% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/request/GfsConfigUpdate.java rename to weather-service/src/main/java/com/htfp/weather/web/param/request/GfsConfigUpdate.java index bdb3c84..56560b3 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/request/GfsConfigUpdate.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/request/GfsConfigUpdate.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.request; +package com.htfp.weather.web.param.request; import com.htfp.weather.download.gfs.GfsDataConfig; import lombok.Data; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/request/MultiPointsRequest.java b/weather-service/src/main/java/com/htfp/weather/web/param/request/MultiPointsRequest.java similarity index 72% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/request/MultiPointsRequest.java rename to weather-service/src/main/java/com/htfp/weather/web/param/request/MultiPointsRequest.java index b99a4e9..c7c448f 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/request/MultiPointsRequest.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/request/MultiPointsRequest.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.request; +package com.htfp.weather.web.param.request; import com.htfp.weather.download.gfs.GfsLevelsEnum; import com.htfp.weather.web.valid.EnumValid; @@ -14,8 +14,10 @@ import java.util.List; */ @Data public class MultiPointsRequest { + @NotNull List pointList; + @NotNull(message = "高度层次 (level) 不能为空") - @EnumValid(message = "高度层次 (level) 不存在", enumClass = GfsLevelsEnum.class) + @EnumValid(message = "高度层次 (level) 数值错误", enumClass = GfsLevelsEnum.class) Integer level; } diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/request/PlaneRequest.java b/weather-service/src/main/java/com/htfp/weather/web/param/request/PlaneRequest.java similarity index 98% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/request/PlaneRequest.java rename to weather-service/src/main/java/com/htfp/weather/web/param/request/PlaneRequest.java index 570e65e..7a2faf4 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/request/PlaneRequest.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/request/PlaneRequest.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.request; +package com.htfp.weather.web.param.request; import com.htfp.weather.download.gfs.GfsVariableIsobaricEnum; import com.htfp.weather.download.gfs.GfsLevelsEnum; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/request/Position2D.java b/weather-service/src/main/java/com/htfp/weather/web/param/request/Position2D.java similarity index 94% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/request/Position2D.java rename to weather-service/src/main/java/com/htfp/weather/web/param/request/Position2D.java index a011833..3663244 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/request/Position2D.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/request/Position2D.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.request; +package com.htfp.weather.web.param.request; import lombok.Data; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/request/Position3D.java b/weather-service/src/main/java/com/htfp/weather/web/param/request/Position3D.java similarity index 67% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/request/Position3D.java rename to weather-service/src/main/java/com/htfp/weather/web/param/request/Position3D.java index f559326..bb5095f 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/request/Position3D.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/request/Position3D.java @@ -1,7 +1,5 @@ -package com.htfp.weather.web.pojo.request; +package com.htfp.weather.web.param.request; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import com.htfp.weather.download.gfs.GfsLevelsEnum; @@ -18,6 +16,6 @@ import lombok.EqualsAndHashCode; @Data public class Position3D extends Position2D { @NotNull(message = "高度层次 (level) 不能为空") - @EnumValid(message = "高度层次 (level) 不存在", enumClass = GfsLevelsEnum.class) + @EnumValid(message = "高度层次 (level) 数值错误", enumClass = GfsLevelsEnum.class, usedField = "getCode") Integer level; } diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/request/ProfileRequest.java b/weather-service/src/main/java/com/htfp/weather/web/param/request/ProfileRequest.java similarity index 93% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/request/ProfileRequest.java rename to weather-service/src/main/java/com/htfp/weather/web/param/request/ProfileRequest.java index 49a61a6..2e3b8a9 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/request/ProfileRequest.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/request/ProfileRequest.java @@ -1,7 +1,6 @@ -package com.htfp.weather.web.pojo.request; +package com.htfp.weather.web.param.request; import com.htfp.weather.download.gfs.GfsVariableIsobaricEnum; -import com.htfp.weather.info.Constant; import com.htfp.weather.web.valid.DateTimeStr; import com.htfp.weather.web.valid.EnumValid; import lombok.Data; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/request/TableConfigUpdate.java b/weather-service/src/main/java/com/htfp/weather/web/param/request/TableConfigUpdate.java similarity index 90% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/request/TableConfigUpdate.java rename to weather-service/src/main/java/com/htfp/weather/web/param/request/TableConfigUpdate.java index 34ff61d..d776fc3 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/request/TableConfigUpdate.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/request/TableConfigUpdate.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.request; +package com.htfp.weather.web.param.request; import com.htfp.weather.griddata.common.TableConfig; import lombok.Data; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/DownloadResult.java b/weather-service/src/main/java/com/htfp/weather/web/param/response/DownloadResult.java similarity index 86% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/response/DownloadResult.java rename to weather-service/src/main/java/com/htfp/weather/web/param/response/DownloadResult.java index 34989da..c8cd34a 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/DownloadResult.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/response/DownloadResult.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.response; +package com.htfp.weather.web.param.response; import com.htfp.weather.download.DownLoadFileInfo; import lombok.Data; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/FileInfo.java b/weather-service/src/main/java/com/htfp/weather/web/param/response/FileInfo.java similarity index 83% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/response/FileInfo.java rename to weather-service/src/main/java/com/htfp/weather/web/param/response/FileInfo.java index 19d4c63..dbc71ef 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/FileInfo.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/response/FileInfo.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.response; +package com.htfp.weather.web.param.response; import lombok.Data; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/ImportResult.java b/weather-service/src/main/java/com/htfp/weather/web/param/response/ImportResult.java similarity index 74% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/response/ImportResult.java rename to weather-service/src/main/java/com/htfp/weather/web/param/response/ImportResult.java index 6a8533e..b27553c 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/ImportResult.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/response/ImportResult.java @@ -1,6 +1,5 @@ -package com.htfp.weather.web.pojo.response; +package com.htfp.weather.web.param.response; -import com.htfp.weather.griddata.operation.GfsDataImport; import com.htfp.weather.griddata.operation.GfsDataImport.ImportFileInfo; import lombok.Data; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/NowWeatherStatus.java b/weather-service/src/main/java/com/htfp/weather/web/param/response/NowWeatherStatus.java similarity index 94% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/response/NowWeatherStatus.java rename to weather-service/src/main/java/com/htfp/weather/web/param/response/NowWeatherStatus.java index e92b4d2..84d0a12 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/NowWeatherStatus.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/response/NowWeatherStatus.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.response; +package com.htfp.weather.web.param.response; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/PlaneResponse.java b/weather-service/src/main/java/com/htfp/weather/web/param/response/PlaneResponse.java similarity index 82% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/response/PlaneResponse.java rename to weather-service/src/main/java/com/htfp/weather/web/param/response/PlaneResponse.java index d531edd..b272f74 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/PlaneResponse.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/response/PlaneResponse.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.response; +package com.htfp.weather.web.param.response; import lombok.Data; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/ProfileDataset.java b/weather-service/src/main/java/com/htfp/weather/web/param/response/ProfileDataset.java similarity index 86% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/response/ProfileDataset.java rename to weather-service/src/main/java/com/htfp/weather/web/param/response/ProfileDataset.java index fec8755..4477287 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/ProfileDataset.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/response/ProfileDataset.java @@ -1,11 +1,8 @@ -package com.htfp.weather.web.pojo.response; +package com.htfp.weather.web.param.response; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; -import java.util.ArrayList; - /** * @Author : shiyi * @Date : 2024/5/8 15:19 diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/ProfileResponse.java b/weather-service/src/main/java/com/htfp/weather/web/param/response/ProfileResponse.java similarity index 84% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/response/ProfileResponse.java rename to weather-service/src/main/java/com/htfp/weather/web/param/response/ProfileResponse.java index c889ac2..4dc2535 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/ProfileResponse.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/response/ProfileResponse.java @@ -1,8 +1,7 @@ -package com.htfp.weather.web.pojo.response; +package com.htfp.weather.web.param.response; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; -import lombok.Getter; /** * @Author : shiyi diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/Result.java b/weather-service/src/main/java/com/htfp/weather/web/param/response/Result.java similarity index 96% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/response/Result.java rename to weather-service/src/main/java/com/htfp/weather/web/param/response/Result.java index 83f5ded..cb27280 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/Result.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/response/Result.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.response; +package com.htfp.weather.web.param.response; import com.htfp.weather.web.exception.ErrorCode; import lombok.Data; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/SurfaceWeatherWarning.java b/weather-service/src/main/java/com/htfp/weather/web/param/response/SurfaceWeatherWarning.java similarity index 91% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/response/SurfaceWeatherWarning.java rename to weather-service/src/main/java/com/htfp/weather/web/param/response/SurfaceWeatherWarning.java index ae11a4c..9d4219e 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/SurfaceWeatherWarning.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/response/SurfaceWeatherWarning.java @@ -1,4 +1,4 @@ -package com.htfp.weather.web.pojo.response; +package com.htfp.weather.web.param.response; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/TimeSeriesDataset.java b/weather-service/src/main/java/com/htfp/weather/web/param/response/TimeSeriesDataset.java similarity index 93% rename from weather-service/src/main/java/com/htfp/weather/web/pojo/response/TimeSeriesDataset.java rename to weather-service/src/main/java/com/htfp/weather/web/param/response/TimeSeriesDataset.java index c4b6577..eae4b55 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/pojo/response/TimeSeriesDataset.java +++ b/weather-service/src/main/java/com/htfp/weather/web/param/response/TimeSeriesDataset.java @@ -1,9 +1,8 @@ -package com.htfp.weather.web.pojo.response; +package com.htfp.weather.web.param.response; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; -import java.sql.Time; import java.util.ArrayList; import java.util.List; diff --git a/weather-service/src/main/java/com/htfp/weather/web/service/FileService.java b/weather-service/src/main/java/com/htfp/weather/web/service/FileService.java index fbf0ca8..e0fdec9 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/service/FileService.java +++ b/weather-service/src/main/java/com/htfp/weather/web/service/FileService.java @@ -2,7 +2,7 @@ package com.htfp.weather.web.service; import com.htfp.weather.web.exception.AppException; import com.htfp.weather.web.exception.ErrorCode; -import com.htfp.weather.web.pojo.response.FileInfo; +import com.htfp.weather.web.param.response.FileInfo; import org.apache.commons.io.FileUtils; import org.springframework.stereotype.Component; diff --git a/weather-service/src/main/java/com/htfp/weather/web/service/GfsDataServiceImpl.java b/weather-service/src/main/java/com/htfp/weather/web/service/GfsUpperDataServiceImpl.java similarity index 98% rename from weather-service/src/main/java/com/htfp/weather/web/service/GfsDataServiceImpl.java rename to weather-service/src/main/java/com/htfp/weather/web/service/GfsUpperDataServiceImpl.java index ff599fb..4de2c27 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/service/GfsDataServiceImpl.java +++ b/weather-service/src/main/java/com/htfp/weather/web/service/GfsUpperDataServiceImpl.java @@ -18,10 +18,9 @@ import com.htfp.weather.utils.DateTimeUtils; import com.htfp.weather.utils.MeteoUtils; import com.htfp.weather.web.exception.AppException; import com.htfp.weather.web.exception.ErrorCode; -import com.htfp.weather.web.pojo.response.*; +import com.htfp.weather.web.param.response.*; import com.htfp.weather.web.service.surfaceapi.ISurfaceDataService; import lombok.extern.slf4j.Slf4j; -import org.checkerframework.checker.units.qual.A; import org.springframework.stereotype.Service; import ucar.ma2.Array; import ucar.ma2.Index4D; @@ -43,7 +42,7 @@ import java.util.stream.Collectors; */ @Service("tablestore-gfs") @Slf4j -public class GfsDataServiceImpl implements IDataService, ISurfaceDataService { +public class GfsUpperDataServiceImpl implements IUpperDataService, ISurfaceDataService { @Resource GfsDataFetcher gfsDataFetcher; @Resource @@ -100,7 +99,7 @@ public class GfsDataServiceImpl implements IDataService, ISurfaceDataService { if (downloadResult.isDownloadSuccess()) { return downloadResult; } else { - throw new AppException(ErrorCode.DOWNLOAD_ERROR); + throw new AppException(ErrorCode.DOWNLOAD_ERROR, downloadResult.getErrorMsg()); } } } @@ -131,6 +130,7 @@ public class GfsDataServiceImpl implements IDataService, ISurfaceDataService { * @param level 高度:9999代表地面,其他代表指定气压高度 * @return @{@link NowWeatherStatus} */ + @Override public NowWeatherStatus getNowWeather(int level, double latitude, double longitude) { OffsetDateTime nowTime = OffsetDateTime.now(); ValueRange timeRange = new ValueRange<>(Collections.singletonList(nowTime)); @@ -162,7 +162,8 @@ public class GfsDataServiceImpl implements IDataService, ISurfaceDataService { * @param level * @return */ - public List getNowWeatherByMultiPoint(int level, List latitude, List longitude) { + @Override + public List getNowWeatherByMultiPoint(List latitude, List longitude, int level) { if (latitude.size() != longitude.size()) { throw new AppException(ErrorCode.INDEX_SIZE_ERROR, ": 经纬度数组大小不一致"); } @@ -202,6 +203,7 @@ public class GfsDataServiceImpl implements IDataService, ISurfaceDataService { * @param level 高度:9999代表地面,其他代表指定气压高度 * @return @{@link TimeSeriesDataset} */ + @Override public TimeSeriesDataset getForecastSeries(int level, double latitude, double longitude) { List variableNames = getVariableNamesInDatabase(level); OffsetDateTime nowTime = OffsetDateTime.now(); @@ -230,6 +232,7 @@ public class GfsDataServiceImpl implements IDataService, ISurfaceDataService { * @param level * @return */ + @Override public List getForecastSeriesByMultiPoint(List latitudeList, List longitudeList, int level) { if (latitudeList.size() != longitudeList.size()) { throw new AppException(ErrorCode.INDEX_SIZE_ERROR, ": 经纬度数组大小不一致"); @@ -291,6 +294,7 @@ public class GfsDataServiceImpl implements IDataService, ISurfaceDataService { } /** 获取全部变量随气压变化的廓线 (推荐) */ + @Override public ProfileDataset getProfileByPressure(OffsetDateTime targetTime, double latitude, double longitude) { try { GfsLevelsEnum levelFlag = GfsLevelsEnum.UPPER; @@ -362,6 +366,7 @@ public class GfsDataServiceImpl implements IDataService, ISurfaceDataService { * @param maxLon 最大经度 * @return @{@link PlaneResponse} */ + @Override public PlaneResponse getPlane(OffsetDateTime targetTime, String variableName, int level, double minLat, double maxLat, double minLon, double maxLon) { String targetVariable; if (GfsLevelsEnum.SURFACE.equals(GfsLevelsEnum.getByCode(level))) { diff --git a/weather-service/src/main/java/com/htfp/weather/web/service/IDataService.java b/weather-service/src/main/java/com/htfp/weather/web/service/IDataService.java deleted file mode 100644 index 50e1122..0000000 --- a/weather-service/src/main/java/com/htfp/weather/web/service/IDataService.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.htfp.weather.web.service; - -/** - * @Author : shiyi - * @Date : 2024/3/15 10:51 - * @Description : 数据调用接口 - */ -public interface IDataService { -} diff --git a/weather-service/src/main/java/com/htfp/weather/web/service/IUpperDataService.java b/weather-service/src/main/java/com/htfp/weather/web/service/IUpperDataService.java new file mode 100644 index 0000000..d25c062 --- /dev/null +++ b/weather-service/src/main/java/com/htfp/weather/web/service/IUpperDataService.java @@ -0,0 +1,28 @@ +package com.htfp.weather.web.service; + +import com.htfp.weather.web.param.response.NowWeatherStatus; +import com.htfp.weather.web.param.response.PlaneResponse; +import com.htfp.weather.web.param.response.ProfileDataset; +import com.htfp.weather.web.param.response.TimeSeriesDataset; + +import java.time.OffsetDateTime; +import java.util.List; + +/** + * @Author : shiyi + * @Date : 2024/3/15 10:51 + * @Description : 高空数据接口 + */ +public interface IUpperDataService { + NowWeatherStatus getNowWeather(int level, double latitude, double longitude); + + List getNowWeatherByMultiPoint(List latitude, List longitude, int level); + + TimeSeriesDataset getForecastSeries(int level, double latitude, double longitude); + + List getForecastSeriesByMultiPoint(List latitudeList, List longitudeList, int level); + + ProfileDataset getProfileByPressure(OffsetDateTime targetTime, double latitude, double longitude); + + PlaneResponse getPlane(OffsetDateTime targetTime, String variableName, int level, double minLat, double maxLat, double minLon, double maxLon); +} diff --git a/weather-service/src/main/java/com/htfp/weather/web/service/surfaceapi/CaiYunServiceImpl.java b/weather-service/src/main/java/com/htfp/weather/web/service/surfaceapi/CaiYunServiceImpl.java index 5be0bba..e367321 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/service/surfaceapi/CaiYunServiceImpl.java +++ b/weather-service/src/main/java/com/htfp/weather/web/service/surfaceapi/CaiYunServiceImpl.java @@ -5,13 +5,13 @@ import com.htfp.weather.utils.DateTimeUtils; import com.htfp.weather.utils.MeteoUtils; import com.htfp.weather.web.exception.AppException; import com.htfp.weather.web.exception.ErrorCode; -import com.htfp.weather.web.pojo.caiyun.*; -import com.htfp.weather.web.pojo.caiyun.CaiYunNowResponse.NowResult.RealTime; -import com.htfp.weather.web.pojo.caiyun.CaiYunForecastResponse.HourlyResult.Hourly; -import com.htfp.weather.web.pojo.caiyun.CaiYunWarningResponse.AlertResult.Alert.AlertContent; -import com.htfp.weather.web.pojo.response.NowWeatherStatus; -import com.htfp.weather.web.pojo.response.SurfaceWeatherWarning; -import com.htfp.weather.web.pojo.response.TimeSeriesDataset; +import com.htfp.weather.web.param.caiyun.*; +import com.htfp.weather.web.param.caiyun.CaiYunNowResponse.NowResult.RealTime; +import com.htfp.weather.web.param.caiyun.CaiYunForecastResponse.HourlyResult.Hourly; +import com.htfp.weather.web.param.caiyun.CaiYunWarningResponse.AlertResult.Alert.AlertContent; +import com.htfp.weather.web.param.response.NowWeatherStatus; +import com.htfp.weather.web.param.response.SurfaceWeatherWarning; +import com.htfp.weather.web.param.response.TimeSeriesDataset; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; diff --git a/weather-service/src/main/java/com/htfp/weather/web/service/surfaceapi/CmaServiceImpl.java b/weather-service/src/main/java/com/htfp/weather/web/service/surfaceapi/CmaServiceImpl.java index 21d7e76..33ce2fa 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/service/surfaceapi/CmaServiceImpl.java +++ b/weather-service/src/main/java/com/htfp/weather/web/service/surfaceapi/CmaServiceImpl.java @@ -5,12 +5,12 @@ import com.htfp.weather.utils.DateTimeUtils; import com.htfp.weather.utils.JSONUtils; import com.htfp.weather.web.exception.AppException; import com.htfp.weather.web.exception.ErrorCode; -import com.htfp.weather.web.pojo.cma.AntiGeoCodeResponse; -import com.htfp.weather.web.pojo.cma.AntiGeoCodeResponse.Result.AddressComponent; -import com.htfp.weather.web.pojo.cma.CmaWarning; -import com.htfp.weather.web.pojo.response.NowWeatherStatus; -import com.htfp.weather.web.pojo.response.SurfaceWeatherWarning; -import com.htfp.weather.web.pojo.response.TimeSeriesDataset; +import com.htfp.weather.web.param.cma.AntiGeoCodeResponse; +import com.htfp.weather.web.param.cma.AntiGeoCodeResponse.Result.AddressComponent; +import com.htfp.weather.web.param.cma.CmaWarning; +import com.htfp.weather.web.param.response.NowWeatherStatus; +import com.htfp.weather.web.param.response.SurfaceWeatherWarning; +import com.htfp.weather.web.param.response.TimeSeriesDataset; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -26,6 +26,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import static com.htfp.weather.utils.HttpClientUtils.sendGet; @@ -42,6 +45,7 @@ public class CmaServiceImpl implements ISurfaceDataService{ @Value("${tianditu.key}") @Setter private String keyOfTianDiTu; private Map> warningCache = new ConcurrentHashMap<>(); + private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); @Override public String getDataSource() { return dataSource; @@ -103,12 +107,21 @@ public class CmaServiceImpl implements ISurfaceDataService{ @Scheduled(cron = "0 20,50 * * * ?") @PostConstruct public void updateCmaWarning() { - updateCmaWarning(null); // 更新全国预警数据 + List cmaWarningList = null;// 更新全国预警数据 + try { + cmaWarningList = getSurfaceWeatherWarnings(null); + } catch (Exception e) { + // 3分钟后重新执行此函数 + scheduler.schedule(this::updateCmaWarning, 5, TimeUnit.MINUTES); + log.warn("获取全国预警数据失败,3分钟后重新更新"); + return; + } + updateCmaWarningCache(cmaWarningList); } /**更新某县区所在省的全部预警数据 * @param countyCode 县级行政区代码*/ - public void updateCmaWarning(String countyCode) { + public List getSurfaceWeatherWarnings(String countyCode) { String url = "https://data.cma.cn/dataGis/disasterWarning/getWarningDataByCnty"; // 6小时前,12小时后 OffsetDateTime startTime = DateTimeUtils.offsetDateTimeToSystemZone(OffsetDateTime.now()).minusHours(6); @@ -118,31 +131,39 @@ public class CmaServiceImpl implements ISurfaceDataService{ params.put("startTime", startTime.format(formatter)); params.put("endTime", endTime.format(formatter)); params.put("provinceCode", countyCode); - log.info("更新预警数据: {}", params); + log.info("获取预警数据: {}", params); try { - if (params.get("provinceCode") == null) { - warningCache.clear(); - } String jsonStr = sendGet(url, params); List cmaWarningList = JSONUtils.json2list(jsonStr, CmaWarning.class); - for (CmaWarning cmaWarning : cmaWarningList) { - String countyId = cmaWarning.getAreaId(); - String dataid = cmaWarning.getDataid(); - SurfaceWeatherWarning surfaceWeatherWarning = buildSurfaceWeatherWarning(cmaWarning); - if (! warningCache.containsKey(countyId)) { - warningCache.put(countyId, new ArrayList<>()); - } - List countyCacheList = warningCache.get(countyId); - if (countyCacheList.stream().noneMatch(w -> dataid.equals(w.getDataid()))) { - // 该数据未缓存过 - warningCache.get(countyId).add(surfaceWeatherWarning); - } - } + return cmaWarningList; } catch (Exception e) { log.error("[中央气象台] 预警信息请求结果处理错误, 预警数据更新失败, {}", e.getMessage()); + throw new AppException(ErrorCode.CMA_REQUEST_ERROR, e.getMessage()); } } + /** + * 更新本地预警数据缓存 + * @param cmaWarningList + */ + public void updateCmaWarningCache(List cmaWarningList) { + log.info("更新预警数据, 区域数量: {}", cmaWarningList.size()); + warningCache.clear(); + for (CmaWarning cmaWarning : cmaWarningList) { + String countyId = cmaWarning.getAreaId(); + String dataid = cmaWarning.getDataid(); + SurfaceWeatherWarning surfaceWeatherWarning = buildSurfaceWeatherWarning(cmaWarning); + if (! warningCache.containsKey(countyId)) { + warningCache.put(countyId, new ArrayList<>()); + } + List countyCacheList = warningCache.get(countyId); + if (countyCacheList.stream().noneMatch(w -> dataid.equals(w.getDataid()))) { + // 该数据未缓存过 + warningCache.get(countyId).add(surfaceWeatherWarning); + } + } + + } private SurfaceWeatherWarning buildSurfaceWeatherWarning(CmaWarning cmaWarning) { SurfaceWeatherWarning surfaceWeatherWarning = new SurfaceWeatherWarning(); surfaceWeatherWarning.setSource(cmaWarning.getSender()); diff --git a/weather-service/src/main/java/com/htfp/weather/web/service/surfaceapi/HeFengServiceImpl.java b/weather-service/src/main/java/com/htfp/weather/web/service/surfaceapi/HeFengServiceImpl.java index f7ecafd..5bc5006 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/service/surfaceapi/HeFengServiceImpl.java +++ b/weather-service/src/main/java/com/htfp/weather/web/service/surfaceapi/HeFengServiceImpl.java @@ -5,13 +5,13 @@ import com.htfp.weather.utils.DateTimeUtils; import com.htfp.weather.utils.MeteoUtils; import com.htfp.weather.web.exception.AppException; import com.htfp.weather.web.exception.ErrorCode; -import com.htfp.weather.web.pojo.response.SurfaceWeatherWarning; -import com.htfp.weather.web.pojo.response.TimeSeriesDataset; -import com.htfp.weather.web.pojo.response.NowWeatherStatus; -import com.htfp.weather.web.pojo.hefeng.*; -import com.htfp.weather.web.pojo.hefeng.HeFengNowResponse.HeFengNow; -import com.htfp.weather.web.pojo.hefeng.HeFengForecastResponse.HeFengForecastHour; -import com.htfp.weather.web.pojo.hefeng.HeFengWarningResponse.HeFengWarning; +import com.htfp.weather.web.param.response.SurfaceWeatherWarning; +import com.htfp.weather.web.param.response.TimeSeriesDataset; +import com.htfp.weather.web.param.response.NowWeatherStatus; +import com.htfp.weather.web.param.hefeng.*; +import com.htfp.weather.web.param.hefeng.HeFengNowResponse.HeFengNow; +import com.htfp.weather.web.param.hefeng.HeFengForecastResponse.HeFengForecastHour; +import com.htfp.weather.web.param.hefeng.HeFengWarningResponse.HeFengWarning; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; diff --git a/weather-service/src/main/java/com/htfp/weather/web/service/surfaceapi/ISurfaceDataService.java b/weather-service/src/main/java/com/htfp/weather/web/service/surfaceapi/ISurfaceDataService.java index 7859b29..46a812c 100644 --- a/weather-service/src/main/java/com/htfp/weather/web/service/surfaceapi/ISurfaceDataService.java +++ b/weather-service/src/main/java/com/htfp/weather/web/service/surfaceapi/ISurfaceDataService.java @@ -1,15 +1,15 @@ package com.htfp.weather.web.service.surfaceapi; -import com.htfp.weather.web.pojo.response.NowWeatherStatus; -import com.htfp.weather.web.pojo.response.SurfaceWeatherWarning; -import com.htfp.weather.web.pojo.response.TimeSeriesDataset; +import com.htfp.weather.web.param.response.NowWeatherStatus; +import com.htfp.weather.web.param.response.SurfaceWeatherWarning; +import com.htfp.weather.web.param.response.TimeSeriesDataset; import java.util.List; /** * @Author : shiyi * @Date : 2024/4/30 10:02 - * @Description : + * @Description : 地面数据接口 */ public interface ISurfaceDataService { String getDataSource(); diff --git a/weather-service/src/main/resources/application.yml b/weather-service/src/main/resources/application.yml index 00d98d0..266878a 100644 --- a/weather-service/src/main/resources/application.yml +++ b/weather-service/src/main/resources/application.yml @@ -1,5 +1,5 @@ server: - port: 10324 + port: 10323 spring: profiles: include: weather @@ -13,10 +13,14 @@ spring: host: smtp.exmail.qq.com username: shiyi@htsdfp.com password: weatherHTFP123 + port: 465 # 阿里云ECS为管控垃圾邮件,屏蔽了默认的25端口号的服务 + protocol: smtps + default-encoding: utf-8 properties.mail.smtp: auth: true enable: true required: true + task: scheduling: pool: diff --git a/weather-service/src/test/java/com/htfp/weather/schedule/GridDataProcessorTest.java b/weather-service/src/test/java/com/htfp/weather/schedule/GridDataProcessorTest.java index 51d438c..d488f01 100644 --- a/weather-service/src/test/java/com/htfp/weather/schedule/GridDataProcessorTest.java +++ b/weather-service/src/test/java/com/htfp/weather/schedule/GridDataProcessorTest.java @@ -24,6 +24,5 @@ class GridDataProcessorTest { @Test void download() { - gridDataProcessor.download(); } } \ No newline at end of file diff --git a/weather-service/src/test/java/com/htfp/weather/utils/HttpClientUtilsTest.java b/weather-service/src/test/java/com/htfp/weather/utils/HttpClientUtilsTest.java index ed740a7..4a72bb6 100644 --- a/weather-service/src/test/java/com/htfp/weather/utils/HttpClientUtilsTest.java +++ b/weather-service/src/test/java/com/htfp/weather/utils/HttpClientUtilsTest.java @@ -1,14 +1,12 @@ package com.htfp.weather.utils; -import com.htfp.weather.web.pojo.hefeng.HeFengForecastResponse; -import com.htfp.weather.web.pojo.hefeng.HeFengNowResponse; +import com.htfp.weather.web.param.hefeng.HeFengForecastResponse; +import com.htfp.weather.web.param.hefeng.HeFengNowResponse; import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.io.IOException; import java.util.HashMap; -import java.util.LinkedHashMap; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -77,7 +75,7 @@ class HttpClientUtilsTest { params.put("location", location); params.put("key", key); String jsonStr = HttpClientUtils.sendGet(url, params); - System.out.println(JSONUtils.json2pojo(jsonStr, HeFengNowResponse.class)); + System.out.println(JSONUtils.json2obj(jsonStr, HeFengNowResponse.class)); // assertThrows(IOException.class, ()->{HttpClientUtils.sendGet(url, params);}); } diff --git a/weather-service/src/test/java/com/htfp/weather/web/service/FileServiceTest.java b/weather-service/src/test/java/com/htfp/weather/web/service/FileServiceTest.java index 8ff3a22..3e199ce 100644 --- a/weather-service/src/test/java/com/htfp/weather/web/service/FileServiceTest.java +++ b/weather-service/src/test/java/com/htfp/weather/web/service/FileServiceTest.java @@ -1,13 +1,11 @@ package com.htfp.weather.web.service; -import com.htfp.weather.web.pojo.response.FileInfo; +import com.htfp.weather.web.param.response.FileInfo; import org.junit.jupiter.api.Test; import java.io.File; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; - /** * @Author : shiyi * @Date : 2024/6/12 11:52 diff --git a/weather-service/src/test/java/com/htfp/weather/web/service/surfaceapi/HeFengServiceImplTest.java b/weather-service/src/test/java/com/htfp/weather/web/service/surfaceapi/HeFengServiceImplTest.java index 1ffc504..3f196dd 100644 --- a/weather-service/src/test/java/com/htfp/weather/web/service/surfaceapi/HeFengServiceImplTest.java +++ b/weather-service/src/test/java/com/htfp/weather/web/service/surfaceapi/HeFengServiceImplTest.java @@ -1,8 +1,8 @@ package com.htfp.weather.web.service.surfaceapi; -import com.htfp.weather.web.pojo.hefeng.HeFengNowResponse; -import com.htfp.weather.web.pojo.response.NowWeatherStatus; -import com.htfp.weather.web.pojo.response.TimeSeriesDataset; +import com.htfp.weather.web.param.hefeng.HeFengNowResponse; +import com.htfp.weather.web.param.response.NowWeatherStatus; +import com.htfp.weather.web.param.response.TimeSeriesDataset; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value;