diff --git a/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/SocketReciverController.java b/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/SocketReceiverController.java similarity index 66% rename from src/main/java/com/palnet/biz/api/ctr/cntrl/controller/SocketReciverController.java rename to src/main/java/com/palnet/biz/api/ctr/cntrl/controller/SocketReceiverController.java index 04dc0a7..4b20bf9 100644 --- a/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/SocketReciverController.java +++ b/src/main/java/com/palnet/biz/api/ctr/cntrl/controller/SocketReceiverController.java @@ -1,6 +1,7 @@ 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 lombok.RequiredArgsConstructor; 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.RestController; +import java.util.concurrent.Callable; + /** * packageName : com.palnet.biz.api.ctr.cntrl.controller * fileName : SocketReciverController @@ -25,14 +28,22 @@ import org.springframework.web.bind.annotation.RestController; @RequiredArgsConstructor @RestController @RequestMapping("/api/server") -public class SocketReciverController { +public class SocketReceiverController { - private final SocketReciverService socketReciverService; + private final SocketReceiverService socketReceiverService; @PostMapping("/receiver") public ResponseEntity receiver(@RequestBody GPModel model) { System.out.println("socket message : " + model); - log.info("socket message : {}", model); - socketReciverService.insert(model); + socketReceiverService.insert(model); return ResponseEntity.ok().build(); } + + @PostMapping("/receiver/async") + public Callable asyncReceiver(@RequestBody GPModel model) { + return () -> { +// log.info("websocket message : {}", model); + socketReceiverService.insert(model); + return "OK"; + }; + } } diff --git a/src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReciverService.java b/src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReceiverService.java similarity index 94% rename from src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReciverService.java rename to src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReceiverService.java index 9414ce1..cfe7f40 100644 --- a/src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReciverService.java +++ b/src/main/java/com/palnet/biz/api/ctr/cntrl/service/SocketReceiverService.java @@ -1,11 +1,8 @@ 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.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.FltPlanCtrCntrlRelRepository; import com.palnet.biz.jpa.repository.flt.FltPlanQueryRepository; import com.palnet.biz.jpa.repository.pty.PtyDronQueryRepository; @@ -34,7 +31,7 @@ import java.util.List; @Slf4j @RequiredArgsConstructor @Service -public class SocketReciverService { +public class SocketReceiverService { private final CtrCntrlJpaService ctrCntrlJpaService; private final PtyDronQueryRepository ptyDronQueryRepository; diff --git a/src/main/java/com/palnet/biz/config/MessageConfig.java b/src/main/java/com/palnet/biz/config/MessageConfig.java deleted file mode 100644 index 8b0179c..0000000 --- a/src/main/java/com/palnet/biz/config/MessageConfig.java +++ /dev/null @@ -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; -// } -// -//} diff --git a/src/main/java/com/palnet/biz/message/Receiver.java b/src/main/java/com/palnet/biz/message/Receiver.java deleted file mode 100644 index 2fc119f..0000000 --- a/src/main/java/com/palnet/biz/message/Receiver.java +++ /dev/null @@ -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; -// } -//} diff --git a/src/main/java/com/palnet/biz/message/consumer/MessageConsumer.java b/src/main/java/com/palnet/biz/message/consumer/MessageConsumer.java deleted file mode 100644 index c8ce341..0000000 --- a/src/main/java/com/palnet/biz/message/consumer/MessageConsumer.java +++ /dev/null @@ -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); -// } -// } -// -//} diff --git a/src/main/java/com/palnet/biz/message/service/MessageService.java b/src/main/java/com/palnet/biz/message/service/MessageService.java deleted file mode 100644 index a705843..0000000 --- a/src/main/java/com/palnet/biz/message/service/MessageService.java +++ /dev/null @@ -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); -// -//} diff --git a/src/main/java/com/palnet/biz/message/service/impl/MessageServiceImpl.java b/src/main/java/com/palnet/biz/message/service/impl/MessageServiceImpl.java deleted file mode 100644 index f56799b..0000000 --- a/src/main/java/com/palnet/biz/message/service/impl/MessageServiceImpl.java +++ /dev/null @@ -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 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 -// ); -// } -//}