From a59715d4b7e5f931db232b805819c9c242c5c5f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Wed, 30 Aug 2023 17:13:47 +0900 Subject: [PATCH] =?UTF-8?q?async=20apply=20socket,=20websocket,=20server?= =?UTF-8?q?=20-=20pending=20=EC=9D=B4=EC=8A=88=20=EC=9E=88=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 ++ .../palnet/server/command/SocketCommand.java | 17 ++++--- .../server/service/TaskServerService.java | 50 +++++++++++++++++-- .../server/task/wb/service/TaskWbService.java | 50 +++++++++++++++++-- src/main/resources/application.yml | 8 +-- 5 files changed, 113 insertions(+), 16 deletions(-) diff --git a/pom.xml b/pom.xml index 8dce0c3..6ffb6c1 100644 --- a/pom.xml +++ b/pom.xml @@ -50,6 +50,10 @@ org.springframework.boot spring-boot-starter-actuator + + org.springframework.boot + spring-boot-starter-webflux + diff --git a/src/main/java/com/palnet/server/command/SocketCommand.java b/src/main/java/com/palnet/server/command/SocketCommand.java index 3364bd2..b43daa7 100644 --- a/src/main/java/com/palnet/server/command/SocketCommand.java +++ b/src/main/java/com/palnet/server/command/SocketCommand.java @@ -114,7 +114,7 @@ public class SocketCommand { try { HttpRequest request = HttpRequest.newBuilder() .uri(new URI( - env.getProperty("app.host") + "api/ctr/cntrl/id/" + model.getObjectId() + env.getProperty("app.host") + "/api/ctr/cntrl/id/" + model.getObjectId() )) .version(HttpClient.Version.HTTP_2) .GET() @@ -162,15 +162,20 @@ public class SocketCommand { if (model.getObjectId().indexOf("PA") > -1) { // messageProducer.sendControlHistoryMessage(model); try { - taskWbService.sendData(model); - } catch (TaskRejectedException e){ + taskWbService.sendDataWebClient(model); + } catch (Exception e) { logger.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace()); } } // STEP 3. 화면에 표출할 정보 WebSocket 전달 // messageProducer.sendControlMessage(model); -// taskServerService.sendData(model); + try { +// taskServerService.sendData(model); + taskServerService.sendDataWebClient(model); + } catch (Exception e) { + logger.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace()); + } } else { logger.error("좌표 정보가 존재하지 않습니다."); @@ -236,7 +241,7 @@ public class SocketCommand { try { HttpRequest request = HttpRequest.newBuilder() .uri(new URI( - env.getProperty("app.host") + "api/ctr/cntrl/id/" + model.getObjectId() + env.getProperty("app.host") + "/api/ctr/cntrl/id/" + model.getObjectId() )) .version(HttpClient.Version.HTTP_2) .GET() @@ -352,7 +357,7 @@ public class SocketCommand { try { HttpRequest request = HttpRequest.newBuilder() .uri(new URI( - env.getProperty("app.host") + "api/ctr/cntrl/id/" + model.getObjectId() + env.getProperty("app.host") + "/api/ctr/cntrl/id/" + model.getObjectId() )) .version(HttpClient.Version.HTTP_2) .GET() diff --git a/src/main/java/com/palnet/server/task/server/service/TaskServerService.java b/src/main/java/com/palnet/server/task/server/service/TaskServerService.java index 967116c..cd9af5b 100644 --- a/src/main/java/com/palnet/server/task/server/service/TaskServerService.java +++ b/src/main/java/com/palnet/server/task/server/service/TaskServerService.java @@ -2,11 +2,14 @@ package com.palnet.server.task.server.service; import com.palnet.comn.model.GPModel; import com.palnet.comn.utils.JsonUtils; +import io.netty.channel.ChannelOption; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; import java.io.IOException; import java.net.URI; @@ -34,10 +37,10 @@ public class TaskServerService { @Value("${app.host}") private String APP_HOST; - private final String APP_SEND_URI = "api/server/receiver"; + private final String APP_SEND_ASYNC_URI = "/api/server/receiver/async"; + private final String APP_SEND_URI = "/api/server/receiver"; - @Async("asyncExecutor") - public CompletableFuture sendData(GPModel model) { + public void sendData(GPModel model) { HttpRequest request = null; try { request = HttpRequest.newBuilder() @@ -57,8 +60,49 @@ public class TaskServerService { log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace()); } +// log.info("websocket send message : {}", JsonUtils.toJson(model)); + } + + @Async("asyncExecutor") + public CompletableFuture sendDataAsync(GPModel model) { + HttpRequest request = null; + try { + request = HttpRequest.newBuilder() + .uri(new URI( + APP_HOST + APP_SEND_ASYNC_URI + )) + .version(HttpClient.Version.HTTP_2) + .header("Content-Type", "application/json") + .POST(HttpRequest.BodyPublishers.ofString(JsonUtils.toJson(model))) + .build(); + HttpResponse response = HttpClient + .newHttpClient() + .send(request, HttpResponse.BodyHandlers.ofString()); + } catch (URISyntaxException | InterruptedException | IOException e) { + log.error("요청한 URL 정보가 잘못되었습니다.", e.getMessage()); + } catch (Exception e) { + log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace()); + } + // log.info("websocket send message : {}", JsonUtils.toJson(model)); return CompletableFuture.completedFuture(null); } + + public void sendDataWebClient(GPModel model) { + + WebClient client = WebClient.builder() + .baseUrl(APP_HOST) + .defaultHeader("Content-Type", "application/json") + .build(); + + client.post() + .uri(APP_SEND_URI) + .body(Mono.just(model), GPModel.class) + .retrieve() + .bodyToMono(Void.class).subscribe(); + + + } + } diff --git a/src/main/java/com/palnet/server/task/wb/service/TaskWbService.java b/src/main/java/com/palnet/server/task/wb/service/TaskWbService.java index 9288956..1fd1739 100644 --- a/src/main/java/com/palnet/server/task/wb/service/TaskWbService.java +++ b/src/main/java/com/palnet/server/task/wb/service/TaskWbService.java @@ -7,6 +7,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; +import reactor.netty.http.client.HttpClientRequest; import java.io.IOException; import java.net.URI; @@ -14,6 +17,7 @@ import java.net.URISyntaxException; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.time.Duration; import java.util.concurrent.CompletableFuture; /** @@ -34,16 +38,17 @@ public class TaskWbService { @Value("${web-socket.host}") private String WS_HOST; - private final String WS_SEND_URI = "/api/ws/receiver/async"; + private final String WS_SEND_ASYNC_URI = "/api/ws/receiver/async"; + private final String WS_SEND_URI = "/api/ws/receiver"; @Async("asyncExecutor") - public CompletableFuture sendData(GPModel model) { + public CompletableFuture sendDataAsync(GPModel model) { // log.info(">>> wb sendData model :: {}", model); HttpRequest request = null; try { request = HttpRequest.newBuilder() .uri(new URI( - WS_HOST + WS_SEND_URI + WS_HOST + WS_SEND_ASYNC_URI )) .version(HttpClient.Version.HTTP_2) .header("Content-Type", "application/json") @@ -62,4 +67,43 @@ public class TaskWbService { return CompletableFuture.completedFuture(null); } + public void sendData(GPModel model) { +// log.info(">>> wb sendData model :: {}", model); + HttpRequest request = null; + try { + request = HttpRequest.newBuilder() + .uri(new URI( + WS_HOST + WS_SEND_URI + )) + .version(HttpClient.Version.HTTP_2) + .header("Content-Type", "application/json") + .POST(HttpRequest.BodyPublishers.ofString(JsonUtils.toJson(model))) + .build(); + HttpResponse response = HttpClient + .newHttpClient() + .send(request, HttpResponse.BodyHandlers.ofString()); + } catch (URISyntaxException | InterruptedException | IOException e) { + log.error("요청한 URL 정보가 잘못되었습니다.", e.getMessage()); + } catch (Exception e) { + log.error("ERROR : {}\n{}", e.getMessage(), e.getStackTrace()); + } + +// log.info("websocket send message : {}", JsonUtils.toJson(model)); + } + + public void sendDataWebClient(GPModel model){ + + WebClient client = WebClient.builder() + .baseUrl(WS_HOST) + .defaultHeader("Content-Type", "application/json") + .build(); + + client.post() + .uri(WS_SEND_URI) + .body(Mono.just(model), GPModel.class) + .retrieve() + .bodyToMono(Void.class) + .subscribe(); + + } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 5b1bb60..0481506 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -35,7 +35,7 @@ server: # routing-key: websocket.drone.routing.# app: - host: http://127.0.0.1:8080/ + host: http://127.0.0.1:8080 web-socket: host: http://127.0.0.1:8181 @@ -83,7 +83,7 @@ server: # routing-key: websocket.drone.routing.# app: - host: http://211.253.38.218:8080/ + host: http://211.253.38.218:8080 web-socket: host: http://211.253.38.218:8081 @@ -143,7 +143,7 @@ logging: com.palnet: info app: - host: http://211.253.38.218:8080/ + host: http://211.253.38.218:8080 web-socket: host: http://211.253.38.218:8081 @@ -204,7 +204,7 @@ logging: com.palnet: info app: - host: http://211.253.38.218:8080/ + host: http://211.253.38.218:8080 web-socket: host: http://211.253.38.218:8081