Browse Source

application server socket,websocket 분리 작업

feature/auth
노승철 2 years ago
parent
commit
502231707b
  1. 11
      pom.xml
  2. 7
      src/main/java/com/palnet/Application.java
  3. 74
      src/main/java/com/palnet/biz/config/MessageConfig.java
  4. 34
      src/main/java/com/palnet/biz/message/consumer/MessageConsumer.java
  5. 30
      src/main/java/com/palnet/biz/message/model/MessageDataShareContext.java
  6. 10
      src/main/java/com/palnet/biz/message/service/MessageService.java
  7. 87
      src/main/java/com/palnet/biz/message/service/impl/MessageServiceImpl.java
  8. 4
      src/main/java/com/palnet/server/SocketServer.java
  9. 4
      src/main/java/com/palnet/server/WebServer.java
  10. 15
      src/main/resources/application.yml

11
pom.xml

@ -137,6 +137,17 @@
<artifactId>json-simple</artifactId> <artifactId>json-simple</artifactId>
<version>1.1.1</version> <version>1.1.1</version>
</dependency> </dependency>
<!-- Spring AMQP -->
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>

7
src/main/java/com/palnet/Application.java

@ -1,7 +1,9 @@
package com.palnet; package com.palnet;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication @SpringBootApplication
@ -12,4 +14,9 @@ public class Application {
SpringApplication.run(Application.class, args); SpringApplication.run(Application.class, args);
} }
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper();
}
} }

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

@ -0,0 +1,74 @@
package com.palnet.biz.config;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
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
public class MessageConfig {
private final Environment env;
public MessageConfig(Environment env) {
this.env = env;
}
// @Bean
// public CachingConnectionFactory cachingConnectionFactory() {
// return new CachingConnectionFactory();
// }
@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;
}
}

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

@ -0,0 +1,34 @@
package com.palnet.biz.message.consumer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.palnet.biz.message.service.MessageService;
import com.palnet.comn.model.GPDatabaseModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.core.env.Environment;
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, ObjectMapper objectMapper) {
this.messageService = messageService;
this.objectMapper = objectMapper;
}
@RabbitHandler
@RabbitListener(queues = {"app.drone.queue"})
public void receivedDroneMessage(final GPDatabaseModel model) {
messageService.insert(model);
}
}

30
src/main/java/com/palnet/biz/message/model/MessageDataShareContext.java

@ -0,0 +1,30 @@
package com.palnet.biz.message.model;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component
public class MessageDataShareContext {
private Map<String, String> idntfKey;
public MessageDataShareContext() {
this.idntfKey = new ConcurrentHashMap<>();
}
public void putIdntfKey(String key, String value) {
idntfKey.put(key, value);
}
public void removeIdntfKey(String key) {
idntfKey.remove(key);
}
public String getIndtfKey(String key) {
return idntfKey.get(key);
}
}

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

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

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

@ -0,0 +1,87 @@
package com.palnet.biz.message.service.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.palnet.biz.jpa.entity.CtrCntrlHstry;
import com.palnet.biz.jpa.repository.pty.PtyDronQueryRepository;
import com.palnet.biz.jpa.service.ctr.CtrCntrlJpaService;
import com.palnet.biz.message.model.MessageDataShareContext;
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 lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Objects;
import java.util.UUID;
@Service
@RequiredArgsConstructor
@Slf4j
public class MessageServiceImpl implements MessageService {
private final CtrCntrlJpaService ctrCntrlJpaService;
private final PtyDronQueryRepository ptyDronQueryRepository;
private final MessageDataShareContext shareContext;
private final RabbitTemplate rabbitTemplate;
private final Environment env;
private final ObjectMapper objectMapper;
@Override
@Transactional
public void insert(GPDatabaseModel model) {
if(!model.getMessageType().equals("OPENSKY")) {
if(shareContext.getIndtfKey(model.getObjectId()) == null) {
String controlID = UUID.randomUUID().toString();
model.setControlId(controlID);
model.setTypeCd("01");
model.setAreaTrnsYn("N");
model.setControlStartDt(DateUtils.getCurrentTime());
shareContext.putIdntfKey(model.getObjectId(), controlID);
} else {
model.setControlId(shareContext.getIndtfKey(model.getObjectId()));
model.setTypeCd("02");
model.setAreaTrnsYn("E");
}
/* 메세지 서버에게 위임 */
this.sendToWebsocket(model);
// if(model.getTypeCd().equals("01")) {
// //마스터 정보에저장
// //식별번호로 제작번호 알아오기
// String prodNumber = ptyDronQueryRepository.findIdntfNumByProdNumber(model.getObjectId());
// model.setProdNumber(prodNumber);
//
// ctrCntrlJpaService.insertCtrCntrlBas(model);
// }
// if(model.getTypeCd().equals("99")) {
// //마스터 정보에 종료 처리 저장
// model.setEndTypeCd("01");
// ctrCntrlJpaService.updateCtrCntrlBas(model);
// }
//
// CtrCntrlHstry ctrCntrlHstry = ctrCntrlJpaService.insertCtrCntrlHstry(model);
//
// if(model.getTypeCd().equals("01") || model.getTypeCd().equals("99")) {
// ctrCntrlJpaService.insertCtrCntrlHstryArea(model, ctrCntrlHstry.getHstrySno());
// }
}
}
public void sendToWebsocket(GPDatabaseModel model) {
/* Websocket 서버로 전달 할 드론 데이터 */
rabbitTemplate.convertAndSend(
Objects.requireNonNull(env.getProperty("message.websocket.queue-name")),
model
);
}
}

4
src/main/java/com/palnet/server/SocketServer.java

@ -47,14 +47,14 @@ public class SocketServer {
@PostConstruct @PostConstruct
public void postConstruct(){ public void postConstruct(){
start(); // start();
} }
@PreDestroy @PreDestroy
public void preDestroy(){ public void preDestroy(){
stop(); // stop();
} }
public void start(){ public void start(){

4
src/main/java/com/palnet/server/WebServer.java

@ -50,14 +50,14 @@ public class WebServer {
@PostConstruct @PostConstruct
public void postConstruct(){ public void postConstruct(){
start(); // start();
} }
@PreDestroy @PreDestroy
public void preDestroy(){ public void preDestroy(){
stop(); // stop();
} }
public void start(){ public void start(){

15
src/main/resources/application.yml

@ -45,6 +45,11 @@ spring:
show_sql: false show_sql: false
# format_sql: true # format_sql: true
format_sql: false format_sql: false
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
server: server:
port: 8080 port: 8080
@ -65,6 +70,16 @@ netty:
thread: thread:
boss: 1 boss: 1
worker: 1 worker: 1
message:
app:
queue-name: app.drone.queue
exchange-name: app.drone.exchange
routing-key: app.drone.routing.#
websocket:
queue-name: websocket.drone.queue
exchange-name: websocket.drone.exchange
routing-key: websocket.drone.routing.#
--- ---
spring: spring:

Loading…
Cancel
Save