Browse Source

async apply socket, websocket, server

feature/remove-rabbit
지대한 1 year ago
parent
commit
13ae901633
  1. 21
      src/main/java/com/palnet/biz/api/ctr/cntrl/controller/SocketReceiverController.java
  2. 5
      src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReceiverService.java
  3. 86
      src/main/java/com/palnet/biz/config/MessageConfig.java
  4. 22
      src/main/java/com/palnet/biz/message/Receiver.java
  5. 53
      src/main/java/com/palnet/biz/message/consumer/MessageConsumer.java
  6. 13
      src/main/java/com/palnet/biz/message/service/MessageService.java
  7. 203
      src/main/java/com/palnet/biz/message/service/impl/MessageServiceImpl.java

21
src/main/java/com/palnet/biz/api/ctr/cntrl/controller/SocketReciverController.java → src/main/java/com/palnet/biz/api/ctr/cntrl/controller/SocketReceiverController.java

@ -1,6 +1,7 @@
package com.palnet.biz.api.ctr.cntrl.controller; package com.palnet.biz.api.ctr.cntrl.controller;
import com.palnet.biz.api.ctr.cntrl.service.SocketReciverService; import com.palnet.biz.api.ctr.cntrl.model.CtrCntrlModel;
import com.palnet.biz.api.ctr.cntrl.service.SocketReceiverService;
import com.palnet.comn.model.GPModel; import com.palnet.comn.model.GPModel;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -10,6 +11,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.Callable;
/** /**
* packageName : com.palnet.biz.api.ctr.cntrl.controller * packageName : com.palnet.biz.api.ctr.cntrl.controller
* fileName : SocketReciverController * fileName : SocketReciverController
@ -25,14 +28,22 @@ import org.springframework.web.bind.annotation.RestController;
@RequiredArgsConstructor @RequiredArgsConstructor
@RestController @RestController
@RequestMapping("/api/server") @RequestMapping("/api/server")
public class SocketReciverController { public class SocketReceiverController {
private final SocketReciverService socketReciverService; private final SocketReceiverService socketReceiverService;
@PostMapping("/receiver") @PostMapping("/receiver")
public ResponseEntity<?> receiver(@RequestBody GPModel model) { public ResponseEntity<?> receiver(@RequestBody GPModel model) {
System.out.println("socket message : " + model); System.out.println("socket message : " + model);
log.info("socket message : {}", model); socketReceiverService.insert(model);
socketReciverService.insert(model);
return ResponseEntity.ok().build(); return ResponseEntity.ok().build();
} }
@PostMapping("/receiver/async")
public Callable<String> asyncReceiver(@RequestBody GPModel model) {
return () -> {
// log.info("websocket message : {}", model);
socketReceiverService.insert(model);
return "OK";
};
}
} }

5
src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReciverService.java → src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReceiverService.java

@ -1,11 +1,8 @@
package com.palnet.biz.api.ctr.cntrl.service; package com.palnet.biz.api.ctr.cntrl.service;
import com.palnet.biz.api.comn.model.ControlGpsDataContext;
import com.palnet.biz.jpa.entity.*; import com.palnet.biz.jpa.entity.*;
import com.palnet.biz.jpa.repository.com.ComArcrftBasRepository; import com.palnet.biz.jpa.repository.com.ComArcrftBasRepository;
import com.palnet.biz.jpa.repository.com.ComIdntBasRepository; import com.palnet.biz.jpa.repository.com.ComIdntBasRepository;
import com.palnet.biz.jpa.repository.ctr.CtrCntrlBasRepository;
import com.palnet.biz.jpa.repository.ctr.CtrCntrlHstryRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanCtrCntrlRelRepository; import com.palnet.biz.jpa.repository.flt.FltPlanCtrCntrlRelRepository;
import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository; import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository;
import com.palnet.biz.jpa.repository.pty.PtyDronQueryRepository; import com.palnet.biz.jpa.repository.pty.PtyDronQueryRepository;
@ -34,7 +31,7 @@ import java.util.List;
@Slf4j @Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
@Service @Service
public class SocketReciverService { public class SocketReceiverService {
private final CtrCntrlJpaService ctrCntrlJpaService; private final CtrCntrlJpaService ctrCntrlJpaService;
private final PtyDronQueryRepository ptyDronQueryRepository; private final PtyDronQueryRepository ptyDronQueryRepository;

86
src/main/java/com/palnet/biz/config/MessageConfig.java

@ -1,86 +0,0 @@
//package com.palnet.biz.config;
//
//import com.rabbitmq.client.ShutdownSignalException;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.amqp.core.*;
//import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
//import org.springframework.amqp.rabbit.connection.Connection;
//import org.springframework.amqp.rabbit.connection.ConnectionFactory;
//import org.springframework.amqp.rabbit.connection.ConnectionListener;
//import org.springframework.amqp.rabbit.core.RabbitTemplate;
//import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.core.env.Environment;
//
//@Configuration
//@Slf4j
//public class MessageConfig {
// private final Environment env;
//
// public MessageConfig(Environment env) {
// this.env = env;
// }
//
//// @Bean
//// public CachingConnectionFactory cachingConnectionFactory() {
//// CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
////
//// connectionFactory.setHost(env.getProperty("spring.rabbitmq.host"));
//// connectionFactory.setPort(Integer.parseInt(env.getProperty("spring.rabbitmq.port")));
//// connectionFactory.setUsername(env.getProperty("spring.rabbitmq.username"));
//// connectionFactory.setPassword(env.getProperty("spring.rabbitmq.password"));
////
//// return connectionFactory;
//// }
//
// @Bean
// public Jackson2JsonMessageConverter converter() {
// return new Jackson2JsonMessageConverter();
// }
//
//// @Bean
//// public DirectExchange appDroneExchange() {
//// return new DirectExchange(env.getProperty("message.app.exchange-name"));
//// }
////
//// @Bean
//// public DirectExchange websocketDroneExchange() {
//// return new DirectExchange(env.getProperty("message.websocket.exchange-name"));
//// }
////
//// @Bean
//// public Queue appDroneQueue() {
//// return new Queue(env.getProperty("message.app.queue-name"), false);
//// }
////
//// @Bean
//// public Queue websocketDroneQueue() {
//// return new Queue(env.getProperty("message.websocket.queue-name"), false);
//// }
////
//// @Bean
//// public Binding appDroneBinding(Queue appDroneQueue, DirectExchange appDroneExchange) {
//// return BindingBuilder.bind(appDroneQueue)
//// .to(appDroneExchange)
//// .with(env.getProperty("message.app.routing-key"));
//// }
////
//// @Bean
//// public Binding websocketDroneBinding(Queue websocketDroneQueue, DirectExchange websocketDroneExchange) {
//// return BindingBuilder.bind(websocketDroneQueue)
//// .to(websocketDroneExchange)
//// .with(env.getProperty("message.websocket.routing-key"));
//// }
//
// @Bean
// public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, Jackson2JsonMessageConverter converter) {
// RabbitTemplate rabbitTemplate = new RabbitTemplate();
//
// rabbitTemplate.setConnectionFactory(connectionFactory);
// rabbitTemplate.setMessageConverter(converter);
//
// return rabbitTemplate;
// }
//
//}

22
src/main/java/com/palnet/biz/message/Receiver.java

@ -1,22 +0,0 @@
//package com.palnet.biz.message;
//
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//
//import java.util.concurrent.CountDownLatch;
//
//@Component
//@Slf4j
//public class Receiver {
//
// private CountDownLatch latch = new CountDownLatch(1);
//
// public void receiveMessage(String message) {
// log.info("Received <" + message);
// latch.countDown();
// }
//
// public CountDownLatch getLatch() {
// return latch;
// }
//}

53
src/main/java/com/palnet/biz/message/consumer/MessageConsumer.java

@ -1,53 +0,0 @@
//package com.palnet.biz.message.consumer;
//
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.palnet.biz.message.service.MessageService;
//import com.palnet.comn.model.GPModel;
//import com.palnet.comn.utils.JsonUtils;
//import com.rabbitmq.client.Channel;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.amqp.rabbit.annotation.RabbitHandler;
//import org.springframework.amqp.rabbit.annotation.RabbitListener;
//import org.springframework.amqp.support.AmqpHeaders;
//import org.springframework.messaging.handler.annotation.Header;
//import org.springframework.stereotype.Component;
//
//import java.io.IOException;
//
//@Component
//@Slf4j
//public class MessageConsumer {
//
// private final MessageService messageService;
// private final ObjectMapper objectMapper;
//
// public MessageConsumer(MessageService messageService) {
// this.messageService = messageService;
// this.objectMapper = JsonUtils.getObjectMapper();
// }
//
// @RabbitHandler
// @RabbitListener(queues = {"app.drone.queue"})
// public void receivedDroneMessage(final String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException {
// try {
// GPModel model = objectMapper.readValue(message, GPModel.class);
//
// messageService.insert(model); // GPS 정보 DB 동기화 처리
//
///* channel.queueDeclare(message, true, false, false, null); rabbitMQ 서버 강제 종료 등 Queue가 유실되는 것을 방지하기 위해 disk에 Queue를 적재 ( Queue 영속성 )
// -> 이 옵션 설정시 Queue의 유실은 방지할 수 있으나 Consumer Ack의 응답률이 절반으로 떨어지게 되고 , Unacked -> Ready로 되돌아가는 Queue가 생김 */
//// channel.basicConsume(message, true, null);
//
// channel.basicAck(tag, true); // channel 유지를 위해 Consumer -> Producer로 수신 확인 신호를 자동으로 전송
//
//// channel.exchangeDeclare(message, "direct", true); Queue Exchange 방식 지정(binding 안되어있으면 설정)
//
//
//
//
// } catch (RuntimeException e) {
// channel.basicReject(tag, false);
// }
// }
//
//}

13
src/main/java/com/palnet/biz/message/service/MessageService.java

@ -1,13 +0,0 @@
//package com.palnet.biz.message.service;
//
//import com.palnet.comn.model.GPModel;
//
//public interface MessageService {
//
// GPModel mapper(GPModel model);
//
// void insert(GPModel model);
//
// void sendToMessage(GPModel model);
//
//}

203
src/main/java/com/palnet/biz/message/service/impl/MessageServiceImpl.java

@ -1,203 +0,0 @@
//package com.palnet.biz.message.service.impl;
//
//import com.fasterxml.jackson.core.JsonProcessingException;
//import com.fasterxml.jackson.databind.ObjectMapper;
//
//import com.palnet.biz.api.bas.flight.model.BasFlightPlanArcrftModel;
//import com.palnet.biz.api.bas.flight.model.BasFlightPlanModel;
//import com.palnet.biz.jpa.entity.*;
//import com.palnet.biz.jpa.repository.com.ComArcrftBasRepository;
//import com.palnet.biz.jpa.repository.com.ComIdntBasRepository;
//import com.palnet.biz.jpa.repository.ctr.CtrCntrlBasRepository;
//import com.palnet.biz.jpa.repository.ctr.CtrCntrlHstryRepository;
//import com.palnet.biz.jpa.repository.flt.FltPlanArcrftRepository;
//import com.palnet.biz.jpa.repository.flt.FltPlanBasRepository;
//import com.palnet.biz.jpa.repository.flt.FltPlanCtrCntrlRelRepository;
//import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository;
//import com.palnet.biz.jpa.repository.pty.PtyDronQueryRepository;
//import com.palnet.biz.jpa.service.ctr.CtrCntrlJpaService;
//import com.palnet.biz.api.comn.model.ControlGpsDataContext;
//import com.palnet.biz.message.service.MessageService;
//import com.palnet.comn.model.GPDatabaseModel;
//import com.palnet.comn.model.GPModel;
//import com.palnet.comn.utils.DateUtils;
//import com.palnet.comn.utils.JsonUtils;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.amqp.rabbit.core.RabbitTemplate;
//import org.springframework.beans.BeanUtils;
//import org.springframework.core.env.Environment;
//import org.springframework.scheduling.annotation.Async;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import java.util.*;
//
//@Service
//@Slf4j
//public class MessageServiceImpl implements MessageService {
//
// private final CtrCntrlJpaService ctrCntrlJpaService;
// private final CtrCntrlBasRepository ctrCntrlBasRepository;
// private final CtrCntrlHstryRepository ctrCntrlHstryRepository;
// private final PtyDronQueryRepository ptyDronQueryRepository;
// private final ComArcrftBasRepository arcrftBasRepository;
// private final ComIdntBasRepository idntBasRepository;
// private final FltPlanQueryRepository fltPlanQueryRepository;
// private final FltPlanCtrCntrlRelRepository ctrCntrlRelRepository;
// private final ControlGpsDataContext shareContext;
// private final RabbitTemplate rabbitTemplate;
// private final Environment env;
// private final ObjectMapper objectMapper;
//
// public MessageServiceImpl(CtrCntrlJpaService ctrCntrlJpaService,
// CtrCntrlBasRepository ctrCntrlBasRepository,
// CtrCntrlHstryRepository ctrCntrlHstryRepository,
// PtyDronQueryRepository ptyDronQueryRepository,
// ComArcrftBasRepository arcrftBasRepository,
// ComIdntBasRepository idntBasRepository,
// FltPlanQueryRepository fltPlanQueryRepository,
// FltPlanCtrCntrlRelRepository ctrCntrlRelRepository,
// ControlGpsDataContext shareContext,
// RabbitTemplate rabbitTemplate,
// Environment env
// ) {
// this.ctrCntrlJpaService = ctrCntrlJpaService;
// this.ctrCntrlBasRepository = ctrCntrlBasRepository;
// this.ctrCntrlHstryRepository = ctrCntrlHstryRepository;
// this.ptyDronQueryRepository = ptyDronQueryRepository;
// this.arcrftBasRepository = arcrftBasRepository;
// this.idntBasRepository = idntBasRepository;
// this.fltPlanQueryRepository = fltPlanQueryRepository;
// this.ctrCntrlRelRepository = ctrCntrlRelRepository;
// this.shareContext = shareContext;
// this.rabbitTemplate = rabbitTemplate;
// this.env = env;
// this.objectMapper = JsonUtils.getObjectMapper();
// }
//
// /**
// * TODO Control-Id Mapping
// *
// * @param model
// * @return
// */
// @Override
// @Transactional(readOnly = true)
// public GPModel mapper(GPModel model) {
// /* 식별번호의 가장 최근 이력 불러오기 */
// CtrCntrlBas latestControl = ctrCntrlBasRepository.findFirstByIdntfNumOrderByCreateDtDesc(model.getObjectId()).orElse(null);
//
// boolean isControl = false;
// if(latestControl != null) {
// CtrCntrlHstry latestHistory = ctrCntrlHstryRepository.findFirstByCntrlIdOrderBySrvrRcvDtDesc(latestControl.getCntrlId()).orElse(null);
// long diffMinute = DateUtils.diffMinute(latestHistory.getSrvrRcvDt(), new Date());
// log.info("DIFF MINUTE : {}", diffMinute);
//
// if("01".equals(latestControl.getEndTypeCd()) || diffMinute > 5) {
// isControl = false;
// }
// if(!"01".equals(latestControl.getEndTypeCd()) && diffMinute < 5) {
// isControl = true;
// }
// } else {
// isControl = false;
// }
//
// if(isControl) {
// model.setControlId(latestControl.getCntrlId());
// model.setTypeCd("02");
// model.setAreaTrnsYn("E");
// } else {
// String controlID = UUID.randomUUID().toString();
//
// model.setControlId(controlID);
// model.setTypeCd("01");
// model.setAreaTrnsYn("N");
// model.setControlStartDt(DateUtils.getCurrentTime());
// }
//
// // 기체 식별번호의 관제 ID 저장
// shareContext.putIdntfKey(model.getObjectId(), model.getControlId());
//
// return model;
// }
//
// /**
// * TODO 비행 이력 생성
// *
// * @param model
// */
// @Override
// @Transactional
// public void insert(GPModel model) {
// GPDatabaseModel dbModel = new GPDatabaseModel();
// BeanUtils.copyProperties(model, dbModel);
//
// if(model.getTypeCd().equals("01")) {
// String prodNumber = ptyDronQueryRepository.findIdntfNumByProdNumber(model.getObjectId());
// dbModel.setProdNumber(prodNumber);
//
// // 비행 이력 생성
// CtrCntrlBas ctrCntrlBas = ctrCntrlJpaService.insertCtrCntrlBas(dbModel);
//
// // 비행 이력, 비행 계획서 mapping
// if ("PA".equals(model.getObjectId().substring(0,2))) {
// FltPlanCtrCntrlRel fltPlanCtrCntrlRel = new FltPlanCtrCntrlRel();
//
// // 1. 식별 번호의 소유자 정보 저장.
// ComIdntfBas idntfBas = idntBasRepository.findById(model.getObjectId()).orElse(null);
//
// // 1-1. 식별 번호의 모델 정보 조회
// ComArcrftBas arcrftBas = arcrftBasRepository.findById(idntfBas.getArcrftSno()).orElse(null);
//
// if (idntfBas != null && arcrftBas != null) {
// fltPlanCtrCntrlRel.setCntrlId(ctrCntrlBas.getCntrlId());
// fltPlanCtrCntrlRel.setIdntfNum(ctrCntrlBas.getIdntfNum());
// fltPlanCtrCntrlRel.setIdntfCstmrSno(idntfBas.getCstmrSno());
// fltPlanCtrCntrlRel.setGroupId(arcrftBas.getGroupId());
// }
//
// // 2. 해당 되는 비행계획서 정보 저장.
// List<FltPlanBas> planArcrft =
// fltPlanQueryRepository.findByFlightPlanArcrft(ctrCntrlBas.getIdntfNum(), dbModel.getServerRcvDt());
//
// if (!planArcrft.isEmpty()) {
// for (FltPlanBas plan : planArcrft) {
// fltPlanCtrCntrlRel.setPlanSno(plan.getPlanSno());
// }
// }
//
// // 3. mapping 정보 주입.
// if (!fltPlanCtrCntrlRel.getCntrlId().isEmpty()) {
// ctrCntrlRelRepository.save(fltPlanCtrCntrlRel);
// }
// }
// }
//
// // Drone인 경우에만 history 생성
// CtrCntrlHstry ctrCntrlHstry = ctrCntrlJpaService.insertCtrCntrlHstry(dbModel);
//
// if(model.getTypeCd().equals("01") || model.getTypeCd().equals("99")) {
// ctrCntrlJpaService.insertCtrCntrlHstryArea(dbModel, ctrCntrlHstry.getHstrySno());
// }
//
// }
//
// @Override
// public void sendToMessage(GPModel model) {
// String json ="";
//
// try {
// json = objectMapper.writeValueAsString(model);
// } catch (JsonProcessingException e) {
// e.printStackTrace();
// }
//
// /* Websocket 서버로 전달 할 드론 데이터 */
// rabbitTemplate.convertAndSend(
// Objects.requireNonNull(env.getProperty("message.websocket.exchange-name")),
// Objects.requireNonNull(env.getProperty("message.websocket.routing-key")),
// json
// );
// }
//}
Loading…
Cancel
Save