BisAgipService.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package com.its.bis.service;
  2. import com.its.app.utils.Elapsed;
  3. import com.its.bis.api.dto.AgipObeLoc;
  4. import com.its.bis.config.ServerConfig;
  5. import com.its.bis.config.ThreadPoolInitializer;
  6. import com.its.bis.dto.Location;
  7. import com.its.bis.dto.NearNodeDto;
  8. import com.its.bis.dto.TbLinkDto;
  9. import com.its.bis.dto.TbNodeDto;
  10. import com.its.bis.process.DbmsDataProcess;
  11. import lombok.RequiredArgsConstructor;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.slf4j.MDC;
  14. import org.springframework.stereotype.Service;
  15. import org.springframework.transaction.annotation.Transactional;
  16. import javax.annotation.PostConstruct;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19. import java.util.Map;
  20. @Slf4j
  21. @Service
  22. @RequiredArgsConstructor
  23. @Transactional(rollbackFor = {Exception.class})
  24. public class BisAgipService {
  25. private final AppRepositoryService repoService;
  26. private final ServerConfig config;
  27. private final DbmsDataProcess dbmsDataProcess;
  28. private final ThreadPoolInitializer threadPoolInitializer;
  29. private final List<Thread> threadList = new ArrayList<Thread>();
  30. private final List<BisAgipWorker> workerList = new ArrayList<BisAgipWorker>();
  31. private final ThreadGroup workerGroup = new ThreadGroup("BisAgipService");
  32. private int workers;
  33. @PostConstruct
  34. private void init() {
  35. log.info("BisAgipService.init: Start.");
  36. this.workers = this.threadPoolInitializer.getDbms();
  37. if (this.workers <= 0) this.workers = 10;
  38. int qSize = 100;
  39. for (int ii = 0; ii < this.workers; ii++) {
  40. BisAgipWorker packetWorker = new BisAgipWorker(ii, qSize, this.config, this.repoService, this.dbmsDataProcess);
  41. this.workerList.add(packetWorker);
  42. Thread worker = new Thread(workerGroup, packetWorker);
  43. worker.setName(String.format("BisAgipService-%02d.%02d", this.workers, ii+1));
  44. worker.setDaemon(true);
  45. this.threadList.add(worker);
  46. }
  47. for (Thread worker : this.threadList) {
  48. worker.start();
  49. }
  50. log.info("BisAgipService.init: ..End.");
  51. }
  52. /**
  53. * REST API 로 수신한 위치정보를 작업큐에 입력
  54. * @param obeLoc
  55. * @return
  56. */
  57. public boolean add(AgipObeLoc obeLoc) {
  58. boolean offer = false;
  59. String deviceId = obeLoc.getDeviceId();
  60. if (deviceId == null || deviceId.equals("")) {
  61. deviceId = "xxx";
  62. obeLoc.setDeviceId(deviceId);
  63. }
  64. try {
  65. int idx = Math.abs(deviceId.hashCode() % this.workers);
  66. offer = this.workerList.get(idx).add(obeLoc);
  67. }
  68. catch (Exception e) {
  69. MDC.put("id", deviceId);
  70. log.error("QUEUE_DATA.add: Exception: {}, {}, {}", deviceId, obeLoc, e.getMessage());
  71. MDC.clear();
  72. }
  73. return offer;
  74. }
  75. public void report() {
  76. for (BisAgipWorker worker : this.workerList) {
  77. worker.report();
  78. }
  79. }
  80. public double getDistance(double lat1, double lon1, double lat2, double lon2) {
  81. double EARTH_RADIUS = 6371.0;
  82. double dLat = Math.toRadians(lat2 - lat1);
  83. double dLon = Math.toRadians(lon2 - lon1);
  84. double a = Math.sin(dLat/2)* Math.sin(dLat/2)+ Math.cos(Math.toRadians(lat1))* Math.cos(Math.toRadians(lat2))* Math.sin(dLon/2)* Math.sin(dLon/2);
  85. double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  86. return (EARTH_RADIUS * c * 1000); // Distance in m
  87. }
  88. public NearNodeDto getNearNode(Location loc) {
  89. Elapsed elapsed = new Elapsed();
  90. log.info("getNearNode: {}", loc);
  91. //Location(mDistance=0.0, mInitialBearing=0.0, mFinalBearing=0.0, mLatitude=128.73881251, mLongitude=36.56128759)
  92. double maxDistance = 40;
  93. NearNodeDto node = NearNodeDto.builder().nodeId(0L).distance(maxDistance).build();
  94. for (Map.Entry<Long, TbNodeDto> e : this.repoService.getEntrySetNode()) {
  95. TbNodeDto obj = e.getValue();
  96. double fDistance = (float) getDistance(loc.getMLatitude(), loc.getMLongitude(), obj.getXCrdn(), obj.getYCrdn());
  97. if (fDistance < maxDistance) {
  98. maxDistance = fDistance;
  99. node.setNodeId(obj.getNodeId());
  100. node.setDistance(fDistance);
  101. }
  102. }
  103. log.info("getNearNode: {} ms. {} m, {}", elapsed.milliSeconds(), maxDistance, node);
  104. return node;
  105. }
  106. public TbLinkDto getSectInfo(Long fNodeId, Long tNodeId) {
  107. return this.repoService.getSectMap(fNodeId, tNodeId);
  108. }
  109. }