AsyncTask.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. package com.fd.thread;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.fd.constant.Command;
  5. import com.fd.constant.MsgCode;
  6. import com.fd.constant.TypeCode;
  7. import com.fd.dto.MyQueue;
  8. import com.fd.entity.OutputFileEntity;
  9. import com.fd.server.ModelServer;
  10. import com.fd.server.RasterServer;
  11. import com.fd.server.VectorServer;
  12. import com.fd.util.FileUtils;
  13. import lombok.extern.log4j.Log4j2;
  14. import org.apache.commons.lang3.StringUtils;
  15. import org.springframework.scheduling.annotation.Async;
  16. import org.springframework.stereotype.Component;
  17. import java.io.File;
  18. import java.util.Date;
  19. import java.util.concurrent.BlockingQueue;
  20. import java.util.concurrent.TimeUnit;
  21. /**
  22. * Created by Owen on 2019/12/11 0011 10:49
  23. */
  24. @Log4j2
  25. @Component
  26. public class AsyncTask {
  27. @Async("taskExecutor")
  28. public void modelDelete(Long id, ModelServer modelServer){
  29. log.info("run modelDelete");
  30. modelServer.deleteById(id);
  31. log.info("end modelDelete id: {}", id);
  32. }
  33. @Async("taskExecutor")
  34. public void rasterDelete(Long fileId, RasterServer rasterServer) {
  35. log.info("run RasterDeleteThread");
  36. rasterServer.deleteById(fileId);
  37. log.info("end RasterDeleteThread: {}", fileId);
  38. }
  39. @Async("taskExecutor")
  40. public void vectorDelete(Long fileId, VectorServer vectorServer){
  41. log.info("run vectorDelete");
  42. vectorServer.deleteById(fileId);
  43. log.info("end vectorDelete id : {}", fileId);
  44. }
  45. @Async("taskExecutor")
  46. public void modelSlice(BlockingQueue<MyQueue> queue, ModelServer modelServer){
  47. try {
  48. MyQueue data = queue.poll(2, TimeUnit.SECONDS);
  49. if (data != null) {
  50. log.warn("run ModelSliceConsumerThread");
  51. log.info("cmd: {}", data.getStr());
  52. Integer integer = modelServer.cmdSlice(data.getStr());
  53. OutputFileEntity entity = data.getOutputFile();
  54. if (integer != 0) {
  55. log.info("error command sliceThread");
  56. // 如果命令运行失败,删除刚才创建的实体类
  57. // o:代表切片失败
  58. entity.setStatus(0);
  59. entity.setUpdateTime(new Date());
  60. modelServer.save(entity);
  61. return;
  62. }
  63. entity.setStatus(5);
  64. entity.setUpdateTime(new Date());
  65. modelServer.save(entity);
  66. log.warn("end ModelSliceConsumerThread id {}", entity.getId());
  67. }
  68. } catch (Exception e) {
  69. Thread.currentThread().interrupt();
  70. e.printStackTrace();
  71. }
  72. }
  73. @Async("taskExecutor")
  74. public void rasterSliceThread(BlockingQueue<MyQueue> queue, RasterServer rasterServer) {
  75. try {
  76. MyQueue data = queue.poll(2, TimeUnit.SECONDS);
  77. if (data != null) {
  78. log.warn("run rasterSliceThread");
  79. OutputFileEntity entity = data.getOutputFile();
  80. log.info("raster cmd: {}", data.getStr());
  81. Integer integer = rasterServer.cmdSlice(data.getStr(), entity);
  82. if (integer != 0) {
  83. log.info("error command exeCmdRasterSlice");
  84. // 如果命令运行失败,状态改为0
  85. entity.setStatus(0);
  86. entity.setUpdateTime(new Date());
  87. rasterServer.save(entity);
  88. return;
  89. }
  90. // 切片完成,修改完成状态
  91. entity.setStatus(5);
  92. entity.setUpdateTime(new Date());
  93. rasterServer.save(entity);
  94. log.warn("end rasterSliceThread id: {}", entity.getId());
  95. }
  96. } catch (Exception e) {
  97. Thread.currentThread().interrupt();
  98. e.printStackTrace();
  99. }
  100. }
  101. @Async("taskExecutor")
  102. public void vectorSliceThread(BlockingQueue<MyQueue> queue, VectorServer vectorServer){
  103. try {
  104. MyQueue data = queue.poll(4, TimeUnit.SECONDS);
  105. if (data != null) {
  106. log.warn("run vectorSliceThread");
  107. OutputFileEntity entity = data.getOutputFile();
  108. log.info("slice cmd: {}", data.getStr());
  109. Integer integer = vectorServer.cmdSlice(data.getStr(), entity);
  110. if (integer != 0) {
  111. log.info("error command exeCmdVectorSlice");
  112. // 如果命令运行失败,状态改为0
  113. entity.setStatus(0);
  114. entity.setUpdateTime(new Date());
  115. vectorServer.save(entity);
  116. return;
  117. }
  118. // 切片完成,修改完成状态
  119. entity.setStatus(5);
  120. entity.setUpdateTime(new Date());
  121. vectorServer.save(entity);
  122. log.warn("end vectorSliceThread id: {}", entity.getId());
  123. }
  124. } catch (Exception e) {
  125. Thread.currentThread().interrupt();
  126. log.error("error consume queue vector SliceConsumerThread: {}", e);
  127. e.printStackTrace();
  128. }
  129. }
  130. @Async("taskExecutor")
  131. public void rasterJudgeCoordConsumerThread(BlockingQueue<MyQueue> queue, RasterServer rasterServer, String baseOutputPath){
  132. MyQueue data = null;
  133. try {
  134. data = queue.poll(3, TimeUnit.SECONDS);
  135. if (data != null) {
  136. log.warn("run rasterJudgeCoordConsumerThread");
  137. // 先让它等一秒
  138. log.info("start time: {}", new Date());
  139. Thread.sleep(2000);
  140. log.info("end time: {}", new Date());
  141. OutputFileEntity entity = data.getOutputFile();
  142. log.info("CoordType: {}", entity.getCoordType());
  143. if (TypeCode.COORD_XIAN_1980.equals(entity.getCoordType())){
  144. log.info("need to transform");
  145. // 严格坐标转换
  146. entity = cmdTansformGdalwarpStrict(entity, rasterServer, baseOutputPath);
  147. } else if (TypeCode.COORD_WGS84.equals(entity.getCoordType())){
  148. log.info("not to transform");
  149. // 4:未切片
  150. entity.setStatus(4);
  151. // 不需要转,就把上传文件路径复制到严格坐标路径上
  152. entity.setCoordStrictPath(entity.getUploadPath());
  153. entity.setUpdateTime(new Date());
  154. entity = rasterServer.save(entity);
  155. log.info("coord Consumer update time: {}", entity.getUpdateTime());
  156. log.info("JudgeCoordConsumerThread update entity: {}", entity);
  157. } else {
  158. log.info("error exeCmd");
  159. entity.setStatus(0);
  160. entity.setUpdateTime(new Date());
  161. rasterServer.save(entity);
  162. }
  163. log.warn("end rasterJudgeCoordConsumerThread id: {}", entity.getId());
  164. }
  165. } catch (Exception e) {
  166. Thread.currentThread().interrupt();
  167. e.printStackTrace();
  168. }
  169. }
  170. /**
  171. * 坐标判断消费队列
  172. * 矢量数据转坐标只转一次就成功了。
  173. * 所以转换的成功的路径都放到strictCoordTransform 路径
  174. * 文件都放transform 目录
  175. */
  176. @Async("taskExecutor")
  177. public void vectorConvertCoordThread (BlockingQueue<MyQueue> queue, VectorServer vectorServer, String baseOutputPath){
  178. try {
  179. MyQueue data = queue.poll(2, TimeUnit.SECONDS);
  180. if (data != null) {
  181. log.info("run convertCoordThread 出队");
  182. Thread.sleep(2000);
  183. OutputFileEntity entity = data.getOutputFile();
  184. // 坐标处理
  185. String coord = entity.getCoord();
  186. log.info("convert coord: {}", coord);
  187. JSONArray arrayCoord = JSON.parseArray(coord);
  188. // 转换坐标 普通坐标转换
  189. if (TypeCode.COORD_SYSTEM_2000.equals(entity.getCoordType())) {
  190. // 普通坐标转换
  191. log.info("need to general transform");
  192. if (arrayCoord.size() == 0) {
  193. // 没有坐标参数,执行普通坐标转换(ogrinfo)
  194. log.info("run generalCoordTransform");
  195. entity = generalCoordTransform(entity, Command.VECTOR_TRANSFORM_GENERAL, vectorServer, baseOutputPath);
  196. } else {
  197. // 有坐标参数,执行严格坐标转换(CGCS2000转wgs80)
  198. log.info("run strictCoordTransform");
  199. entity = strictCoordTransform(entity, Command.VECTOR_TRANSFORM_STRICT_WGS80, vectorServer, baseOutputPath);
  200. }
  201. } else if (TypeCode.COORD_XIAN_1980.equals(entity.getCoordType())) {
  202. // 严格坐标转换 (西安80转wgs84),需要参数
  203. log.info("need to strict transform, CoordType: {}", entity.getCoordType());
  204. if (arrayCoord.size() == 0) {
  205. log.info("error: {}", MsgCode.E50009);
  206. entity.setStatus(7);
  207. entity.setUpdateTime(new Date());
  208. vectorServer.save(entity);
  209. } else {
  210. log.info("run strictCoordTransform");
  211. entity = strictCoordTransform(entity, Command.VECTOR_TRANSFORM_STRICT_WGS84, vectorServer, baseOutputPath);
  212. }
  213. } else if (TypeCode.COORD_WGS84.equals(entity.getCoordType())) {
  214. // 不转换坐标 把文件信息移动到CoordStrictPath 这路径下
  215. log.info("not to transform");
  216. entity.setCoordStrictPath(entity.getUploadPath());
  217. entity.setUpdateTime(new Date());
  218. entity.setStatus(3);
  219. entity.setCoordType(TypeCode.COORD_WGS84);
  220. vectorServer.save(entity);
  221. } else {
  222. log.info("error exeCmd");
  223. entity.setStatus(7);
  224. entity.setUpdateTime(new Date());
  225. vectorServer.save(entity);
  226. }
  227. log.info("end convertCoordThread id: {}", entity.getId());
  228. }
  229. } catch (Exception e) {
  230. Thread.currentThread().interrupt();
  231. log.error("error vector consume queue VectorJudgeCoordConsumerThread: {}", e);
  232. throw new RuntimeException(e);
  233. }
  234. }
  235. /**
  236. * raster 严格坐标转换
  237. */
  238. private OutputFileEntity cmdTansformGdalwarpStrict(OutputFileEntity entity, RasterServer rasterServer, String baseOutputPath){
  239. log.info("run cmdTansformGdalwarpStrict");
  240. String OUTPUT_FILE_PATH = baseOutputPath;
  241. String fileName = StringUtils.substringBeforeLast(entity.getFileName(), ".");
  242. String outFileStep1 = OUTPUT_FILE_PATH + "transform";
  243. FileUtils.createDir(outFileStep1);
  244. outFileStep1 = outFileStep1 + File.separator + entity.getFileName();
  245. // 坐标处理
  246. String coord = entity.getCoord();
  247. log.info("convert coord: {}", coord);
  248. JSONArray array = JSON.parseArray(coord);
  249. String step_1 = Command.RASTER_TRANSFORM_GDALWARP_STRICT_1;
  250. step_1 = step_1.replace("@inputFile", entity.getUploadPath());
  251. step_1 = step_1.replace("@outputFile", outFileStep1);
  252. // 3位数坐标
  253. if (array.size() == 3) {
  254. step_1 = step_1.replace("@x", array.getString(0));
  255. step_1 = step_1.replace("@y", array.getString(1));
  256. step_1 = step_1.replace("@z", array.getString(2));
  257. step_1 = step_1.replace("@rx","0");
  258. step_1 = step_1.replace("@ry","0");
  259. step_1 = step_1.replace("@rz","0");
  260. // 坐标为空时
  261. } else if (array.size() == 0) {
  262. step_1 = step_1.replace("@x","0");
  263. step_1 = step_1.replace("@y","0");
  264. step_1 = step_1.replace("@z","0");
  265. step_1 = step_1.replace("@rx","0");
  266. step_1 = step_1.replace("@ry","0");
  267. step_1 = step_1.replace("@rz","0");
  268. // 6位数坐标
  269. }else {
  270. step_1 = step_1.replace("@x", array.getString(0));
  271. step_1 = step_1.replace("@y", array.getString(1));
  272. step_1 = step_1.replace("@z", array.getString(2));
  273. step_1 = step_1.replace("@rx",array.getString(3));
  274. step_1 = step_1.replace("@ry",array.getString(4));
  275. step_1 = step_1.replace("@rz",array.getString(5));
  276. }
  277. String step_2 = Command.RASTER_TRANSFORM_GDALWARP_STRICT_2;
  278. String outFileStep2 = OUTPUT_FILE_PATH + "transform_strict";
  279. FileUtils.createDir(outFileStep2);
  280. outFileStep2 = outFileStep2 + File.separator + entity.getFileName();
  281. step_2 = step_2.replace("@inputFile", outFileStep1);
  282. step_2 = step_2.replace("@outputFile", outFileStep2);
  283. log.info("cmd1: {}", step_1);
  284. log.info("cmd2: {}", step_2);
  285. Integer integer = rasterServer.exeCmd(step_1, step_2);
  286. if (integer != 0) {
  287. log.info("error command transform");
  288. return null;
  289. }
  290. entity.setStatus(4);
  291. entity.setUpdateTime(new Date());
  292. entity.setCoordGeneralPath(outFileStep1);
  293. entity.setCoordStrictPath(outFileStep2);
  294. entity = rasterServer.save(entity);
  295. return entity;
  296. }
  297. /**
  298. * 普通坐标转换
  299. */
  300. private OutputFileEntity generalCoordTransform(OutputFileEntity entity, String cmd, VectorServer vectorServer, String baseOutputPath) {
  301. String directory = createDirectory(entity, baseOutputPath);
  302. directory = directory + File.separator + entity.getFileName();
  303. cmd = cmd.replace("@inputFile", entity.getUploadPath());
  304. cmd = cmd.replace("@outputFile", directory);
  305. log.info("cmd: {}", cmd);
  306. return runCmd(cmd, entity, null, directory, vectorServer);
  307. }
  308. // 严格坐标转换
  309. private OutputFileEntity strictCoordTransform(OutputFileEntity entity, String cmd, VectorServer vectorServer, String baseOutputPath) {
  310. String directory = createDirectory(entity, baseOutputPath);
  311. directory = directory + File.separator + entity.getFileName();
  312. String coord = entity.getCoord();
  313. coord = coord.replace("[", "");
  314. coord = coord.replace("]", "");
  315. // 去空格
  316. coord = StringUtils.deleteWhitespace(coord);
  317. cmd = cmd.replace("@coord", coord);
  318. cmd = cmd.replace("@inputFile", entity.getUploadPath());
  319. cmd = cmd.replace("@outputFile", directory);
  320. log.info("cmd: {}", cmd);
  321. return runCmd(cmd, entity, null, directory, vectorServer);
  322. }
  323. // 创建目录
  324. private String createDirectory(OutputFileEntity entity, String baseOutputPath) {
  325. String OUTPUT_FILE_PATH = baseOutputPath;
  326. String directory = OUTPUT_FILE_PATH + "transform" + File.separator + entity.getDirectory();
  327. FileUtils.createDir(directory);
  328. return directory;
  329. }
  330. // 执行命令,创建对象, 坐标转换使用
  331. private OutputFileEntity runCmd(String cmd, OutputFileEntity entity, String generalPath, String strictPath, VectorServer vectorServer) {
  332. Integer integer = vectorServer.exeCmd(cmd);
  333. // 转换坐标失败, 修改状态
  334. if (integer != 0) {
  335. entity.setUpdateTime(new Date());
  336. entity.setStatus(7);
  337. entity = vectorServer.save(entity);
  338. return null;
  339. }
  340. entity.setFileName(entity.getFileName());
  341. entity.setCoordGeneralPath(generalPath);
  342. entity.setCoordStrictPath(strictPath);
  343. entity.setUpdateTime(new Date());
  344. entity.setStatus(3);
  345. entity = vectorServer.save(entity);
  346. return entity;
  347. }
  348. }