Bladeren bron

dev
raster 模块修改好

wuweihao 5 jaren geleden
bovenliggende
commit
e78ca9fa68

+ 15 - 11
src/main/java/com/fd/controller/RasterController.java

@@ -136,7 +136,9 @@ public class RasterController {
         cmd = cmd.replace("@inputFile", entity.getUploadPath());
         log.info("cmd: {}", cmd);
 
-        Integer isJudge = cmdServer.exeCmdRasterJudgeCoord(cmd);
+//        Integer isJudge = cmdServer.exeCmdRasterJudgeCoord(cmd);
+
+        Integer isJudge = rasterServer.cmdJudgeCoord(cmd);
 
 
         if (1000 == isJudge){
@@ -208,7 +210,7 @@ public class RasterController {
         log.info("run cmdJudgeCoord: {}", fileId);
 
         RasterServer rasterServer = SpringContext.getBean(RasterServerImpl.class);
-        CmdServer cmdServer = SpringContext.getBean(CmdServerImpl.class);
+//        CmdServer cmdServer = SpringContext.getBean(CmdServerImpl.class);
 
         OutputFileEntity entity = rasterServer.findById(fileId);
 
@@ -240,7 +242,7 @@ public class RasterController {
             log.info("coord entity: {}",entity);
             log.info("coord producer update time: {}", entity.getUpdateTime());
 
-            judgeCoordConsumerThread(coordQueue, rasterServer, cmdServer);
+            judgeCoordConsumerThread(coordQueue, rasterServer);
 
             return new R(200, entity);
         }
@@ -248,7 +250,7 @@ public class RasterController {
     }
 
     @Async("taskExecutor")
-    public void judgeCoordConsumerThread(BlockingQueue<MyQueue> queue, RasterServer rasterServer, CmdServer cmdServer){
+    public void judgeCoordConsumerThread(BlockingQueue<MyQueue> queue, RasterServer rasterServer){
         MyQueue data = null;
         try {
             data = queue.poll(3, TimeUnit.SECONDS);
@@ -268,7 +270,7 @@ public class RasterController {
                 if (TypeCode.COORD_XIAN_1980.equals(entity.getCoordType())){
                     log.info("need to transform");
                     // 严格坐标转换
-                    entity = cmdTansformGdalwarpStrict(entity, rasterServer, cmdServer);
+                    entity = cmdTansformGdalwarpStrict(entity, rasterServer);
                 } else if (TypeCode.COORD_WGS84.equals(entity.getCoordType())){
                     log.info("not to transform");
                     // 4:未切片
@@ -309,7 +311,7 @@ public class RasterController {
             return new R(50010, MsgCode.E50010) ;
         }
         RasterServer rasterServer = SpringContext.getBean(RasterServerImpl.class);
-        CmdServer cmdServer = SpringContext.getBean(CmdServerImpl.class);
+//        CmdServer cmdServer = SpringContext.getBean(CmdServerImpl.class);
 
         OutputFileEntity entity = rasterServer.findById(fileId);
 
@@ -352,7 +354,7 @@ public class RasterController {
 
             entity = rasterServer.save(entity);
 
-            sliceThread(sliceQueue, rasterServer, cmdServer);
+            sliceThread(sliceQueue, rasterServer);
 
             return new R(200, entity) ;
         }
@@ -360,14 +362,15 @@ public class RasterController {
     }
 
     @Async("taskExecutor")
-    public void sliceThread(BlockingQueue<MyQueue> queue, RasterServer rasterServer, CmdServer cmdServer) {
+    public void sliceThread(BlockingQueue<MyQueue> queue, RasterServer rasterServer) {
         try {
             MyQueue data = queue.poll(2, TimeUnit.SECONDS);
             if (data != null) {
                 log.warn("run SliceConsumerThread");
                 OutputFileEntity  entity = data.getOutputFile();
                 log.info("raster cmd: {}", data.getStr());
-                Integer integer = cmdServer.exeCmdRasterSlice(data.getStr(), entity);
+//                Integer integer = cmdServer.exeCmdRasterSlice(data.getStr(), entity);
+                Integer integer = rasterServer.cmdSlice(data.getStr(), entity);
                 if (integer != 0) {
                     log.info("error command exeCmdRasterSlice");
                     // 如果命令运行失败,状态改为0
@@ -415,7 +418,7 @@ public class RasterController {
     /**
      * 严格坐标转换
      */
-    private OutputFileEntity cmdTansformGdalwarpStrict(OutputFileEntity entity, RasterServer rasterServer, CmdServer cmdServer){
+    private OutputFileEntity cmdTansformGdalwarpStrict(OutputFileEntity entity, RasterServer rasterServer){
         log.info("run cmdTansformGdalwarpStrict");
 
 
@@ -476,7 +479,8 @@ public class RasterController {
         log.info("cmd1: {}", step_1);
         log.info("cmd2: {}", step_2);
 
-        Integer integer = cmdServer.exeCmd(step_1, step_2);
+//        Integer integer = cmdServer.exeCmd(step_1, step_2);
+        Integer integer = rasterServer.exeCmd(step_1, step_2);
 
         if (integer != 0) {
             log.info("error command transform");

+ 6 - 0
src/main/java/com/fd/server/RasterServer.java

@@ -33,4 +33,10 @@ public interface RasterServer {
     FileEntity findByInputFileId(Long fileId);
 
     FileEntity saveInputFile(FileEntity fileEntity);
+
+    Integer cmdJudgeCoord(String cmd);
+
+    Integer exeCmd(String step_1, String step_2);
+
+    Integer cmdSlice(String str, OutputFileEntity entity);
 }

+ 210 - 7
src/main/java/com/fd/server/impl/RasterServerImpl.java

@@ -30,8 +30,10 @@ import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.util.Date;
 import java.util.List;
 import java.util.Optional;
@@ -301,12 +303,6 @@ public class RasterServerImpl implements RasterServer {
         return new R(200, outputFile);
     }
 
-//    @Override
-//    public R findByType(String fileTypeRaster, PageDto pageDto) {
-//        Page<OutputFileEntity> page = outputFileRepository.findByType(fileTypeRaster, PageRequest.of(pageDto.getPageNum(), pageDto.getPageSize(), Sort.by("createTime").descending()));
-//        return new R(200, page);
-//    }
-
 
     @Override
     public R findByType(String fileTypeRaster, PageDto pageDto) {
@@ -327,7 +323,6 @@ public class RasterServerImpl implements RasterServer {
     @Override
     public List<FileEntity> findByFileName(String fileName) {
 
-//        return fileRepository.findByFileNameAndType(fileName, TypeCode.FILE_TYPE_RASTER);
         return fileRepository.findByFileNameAndTypeAndResStatus(fileName, TypeCode.FILE_TYPE_RASTER, 0);
     }
 
@@ -353,6 +348,203 @@ public class RasterServerImpl implements RasterServer {
         return fileRepository.save(fileEntity);
     }
 
+    @Override
+    public Integer cmdJudgeCoord(String commandStr) {
+        // 命令运行结果 1:失败, 0:成功
+        Integer isCmd = null;
+
+        StringBuffer sb = new StringBuffer();
+        StringBuffer errorStr = new StringBuffer();
+        try {
+            String[] cmd = new String[]{"/bin/sh", "-c", commandStr};
+            Process ps = Runtime.getRuntime().exec(cmd);
+
+            BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
+            BufferedReader errorBuf = new BufferedReader(new InputStreamReader(ps.getErrorStream()));
+
+            // error : 坑, 控制台信息是从errorBuf这里出来的
+            String errorLine;
+            while ((errorLine = errorBuf.readLine()) != null) {
+                errorStr.append(errorLine).append("\n");
+            }
+            if (StringUtils.isNotEmpty(errorStr)){
+                log.info("error result: {}", errorStr.toString());
+            }
+
+            // success ,没有获取到信息
+            String line;
+            while ((line = br.readLine()) != null) {
+//                log.info("=====  br.readLine: ======== {}", br.readLine());
+                //执行结果加上回车
+                sb.append(line).append("\n");
+            }
+            log.info("result: {}", sb.toString());
+
+            // 结束命令行
+            isCmd = ps.waitFor();
+
+            // 关闭流
+            br.close();
+            errorBuf.close();
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+
+        if (isCmd == 0) {
+            log.info("end exeCmd : {}", isCmd);
+            // 判断坐标
+            if (sb.toString().contains("+proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000")) {
+                // 需要坐标转换
+                // 1000: 需要转换
+                isCmd = 1000;
+            }
+            if (sb.toString().contains("+proj=longlat +datum=WGS84")) {
+                // 不需要坐标转换
+                isCmd = 0;
+            }
+        } else {
+            log.info("error cmd wsitFore: {}", isCmd);
+        }
+        return isCmd;
+    }
+
+    @Override
+    public Integer exeCmd(String cmd1, String cmd2) {
+
+        exeCmdSingle(cmd1);
+        Integer isCmd = exeCmdSingle(cmd2);
+        return isCmd;
+    }
+
+    @Override
+    public Integer cmdSlice(String commandStr, OutputFileEntity entity) {
+        log.warn("run cmdSlice");
+        Integer isCmd = null; // 命令运行结果 1:失败, 0:成功
+        try {
+            String[] cmd = new String[]{"/bin/sh", "-c", commandStr};
+            Process ps = Runtime.getRuntime().exec(cmd);
+
+            BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
+            BufferedReader errorBuf = new BufferedReader(new InputStreamReader(ps.getErrorStream()));
+
+            StringBuffer sb = new StringBuffer();
+            // 进度
+            int pre = 0;
+            int num;
+            String str;
+            while ((num = br.read()) != -1) {
+                str = String.valueOf((char) num);
+
+                // 判断数字
+                if (numRegex(str)) {
+                    if (!str.equals("0")) {
+                        // 非0开头的
+                        sb.append(",").append(str);
+                    } else {
+                        // 以0开头的
+                        sb.append(str);
+                    }
+                    // 截取进度数字
+                    str = StringUtils.substringAfterLast(sb.toString(), ",");
+
+                    // 100,1000都会当一次
+                    if (str.length() == 2) {
+                        pre = pre + 5;
+                        log.warn("pre: {}", pre);
+                        // 能被2整除的存一下db
+                        if (pre % 2 == 0) {
+                            entity.setProgress(pre);
+                            entity.setUpdateTime(new Date());
+                            outputFileRepository.save(entity);
+                        }
+                    }
+                }
+            }
+
+            log.info("cmd console: {}", sb.toString());
+
+            StringBuffer errorStr = new StringBuffer();
+            String errorLine;
+            while ((errorLine = errorBuf.readLine()) != null) {
+                errorStr.append(errorLine).append("\n");
+            }
+            if (StringUtils.isNotEmpty(errorStr)){
+                log.info("error result: {}", errorStr.toString());
+            }
+
+            // 结束命令行
+            isCmd = ps.waitFor();
+
+            // 关闭流
+            br.close();
+            errorBuf.close();
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        if (isCmd == 0) {
+            log.info("end exeCmd : {}", isCmd);
+        } else {
+            log.info("wsitFore cmd run error : {}", isCmd);
+        }
+        log.warn("end exeCmdRasterSlice");
+        return isCmd;
+    }
+
+    private Integer exeCmdSingle(String commandStr) {
+
+        // 命令运行结果 1:失败, 0:成功
+        Integer isCmd = null;
+        try {
+            String[] cmd = new String[]{"/bin/sh", "-c", commandStr};
+            Process ps = Runtime.getRuntime().exec(cmd);
+
+            BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
+            BufferedReader errorBuf = new BufferedReader(new InputStreamReader(ps.getErrorStream()));
+
+            StringBuffer sb = new StringBuffer();
+            StringBuffer errorStr = new StringBuffer();
+
+            // error : 坑, 控制台信息是从errorBuf这里出来的
+            String errorLine;
+            while ((errorLine = errorBuf.readLine()) != null) {
+                errorStr.append(errorLine).append("\n");
+            }
+            if (StringUtils.isNotEmpty(errorStr)){
+                log.info("error result: {}", errorStr.toString());
+            }
+
+            // success ,没有获取到信息
+            String line;
+            while ((line = br.readLine()) != null) {
+                //执行结果加上回车
+                sb.append(line).append("\n");
+            }
+            log.info("result: {}", sb.toString());
+
+            // 结束命令行
+            isCmd = ps.waitFor();
+
+            // 关闭流
+            br.close();
+            errorBuf.close();
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        if (isCmd == 0) {
+            log.info("end exeCmd : {}", isCmd);
+        } else {
+            log.info("wsitFore cmd run error : {}", isCmd);
+        }
+        return isCmd;
+    }
+
+
     private void writeJsonFile(ConfigJsonDto param, String lastName, OutputFileEntity entity) {
         String s = FileUtils.readFile(CONFIG_JSON_PATH);
 
@@ -405,4 +597,15 @@ public class RasterServerImpl implements RasterServer {
             e.printStackTrace();
         }
     }
+
+
+    // 匹配数字
+    private boolean numRegex(String str) {
+        String reg = "\\d";
+        if (StringUtils.isEmpty(str)) {
+            return false;
+        }
+        return str.matches(reg);
+    }
+
 }

+ 67 - 0
src/main/java/com/fd/util/SpringContext.java

@@ -0,0 +1,67 @@
+package com.fd.util;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+@Component
+@Lazy(false)
+public class SpringContext implements ApplicationContextAware {
+
+    /**
+     * 上下文对象实例
+     */
+    private static ApplicationContext applicationContext;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        this.applicationContext = applicationContext;
+    }
+
+
+    /**
+     * 获取applicationContext
+     *
+     * @return
+     */
+    public static ApplicationContext getApplicationContext() {
+        return applicationContext;
+    }
+
+    /**
+     * 通过name获取 Bean.
+     *
+     * @param name
+     * @return
+     */
+    public static Object getBean(String name) {
+        return getApplicationContext().getBean(name);
+    }
+
+
+    /**
+     * 通过class获取Bean.
+     *
+     * @param clazz
+     * @param <T>
+     * @return
+     */
+    public static <T> T getBean(Class<T> clazz) {
+        return getApplicationContext().getBean(clazz);
+    }
+
+
+    /**
+     * 通过name,以及Clazz返回指定的Bean
+     *
+     * @param name
+     * @param clazz
+     * @param <T>
+     * @return
+     */
+    public static <T> T getBean(String name, Class<T> clazz) {
+        return getApplicationContext().getBean(name, clazz);
+    }
+}