From 2fd6436d2d3d0943b37bf176ac5d1d453d252a83 Mon Sep 17 00:00:00 2001 From: sdvdxl Date: Sat, 15 May 2021 22:34:09 +0800 Subject: [PATCH 01/14] http init Signed-off-by: sdvdxl --- framework-network-http/pom.xml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 framework-network-http/pom.xml diff --git a/framework-network-http/pom.xml b/framework-network-http/pom.xml new file mode 100644 index 0000000..9939870 --- /dev/null +++ b/framework-network-http/pom.xml @@ -0,0 +1,20 @@ + + + + iotos-soft-gateway + me.hekr.iotos.softgateway + 2.0.0 + ../pom.xml.versionsBackup + + 4.0.0 + + framework-network-http + + + 8 + 8 + + + \ No newline at end of file -- Gitee From 2fc844ce3c16e6aa0142cdf5303a242002c02b96 Mon Sep 17 00:00:00 2001 From: sdvdxl Date: Tue, 18 May 2021 12:44:10 +0800 Subject: [PATCH 02/14] =?UTF-8?q?http=20=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sdvdxl --- example/pom.xml | 4 + framework-network-http/pom.xml | 32 ++++- .../softgateway/network/http/HttpClient.java | 113 ++++++++++++++++++ .../network/http/HttpException.java | 32 +++++ .../network/http/HttpExceptionHandler.java | 31 +++++ .../softgateway/network/http/HttpMethod.java | 14 +++ .../network/http/HttpPageRequest.java | 12 ++ .../network/http/HttpPageResponse.java | 33 +++++ .../softgateway/network/http/HttpRequest.java | 109 +++++++++++++++++ .../network/http/HttpRequestPageable.java | 20 ++++ .../network/http/HttpResponse.java | 20 ++++ .../network/http/HttpResponseChecker.java | 25 ++++ .../network/http/HttpResponsePageable.java | 13 ++ .../network/http/ResponseParser.java | 13 ++ .../softgateway/network/http/Device.java | 9 ++ .../network/http/DeviceResponse.java | 13 ++ .../network/http/HttpClientTest.java | 36 ++++++ .../softgateway/network/http/Server.java | 27 +++++ pom.xml | 1 + 19 files changed, 554 insertions(+), 3 deletions(-) create mode 100644 framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpClient.java create mode 100644 framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpException.java create mode 100644 framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpExceptionHandler.java create mode 100644 framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpMethod.java create mode 100644 framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpPageRequest.java create mode 100644 framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpPageResponse.java create mode 100644 framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequest.java create mode 100644 framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequestPageable.java create mode 100644 framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponse.java create mode 100644 framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponseChecker.java create mode 100644 framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponsePageable.java create mode 100644 framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/ResponseParser.java create mode 100644 framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Device.java create mode 100644 framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/DeviceResponse.java create mode 100644 framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/HttpClientTest.java create mode 100644 framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Server.java diff --git a/example/pom.xml b/example/pom.xml index fcb1924..2db0a39 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -27,6 +27,10 @@ me.hekr.iotos.softgateway framework-network-mqtt + + me.hekr.iotos.softgateway + framework-network-http + ch.qos.logback diff --git a/framework-network-http/pom.xml b/framework-network-http/pom.xml index 9939870..10d15d9 100644 --- a/framework-network-http/pom.xml +++ b/framework-network-http/pom.xml @@ -5,12 +5,38 @@ iotos-soft-gateway me.hekr.iotos.softgateway - 2.0.0 - ../pom.xml.versionsBackup + 3.1.0 4.0.0 - framework-network-http + + + + org.springframework.boot + spring-boot-parent + 2.2.12.RELEASE + pom + import + + + + + + + me.hekr.iotos.softgateway + framework-common-utils + + + org.springframework.boot + spring-boot-starter-web + + + + com.squareup.okhttp3 + logging-interceptor + 3.13.1 + + 8 diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpClient.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpClient.java new file mode 100644 index 0000000..6eec1e6 --- /dev/null +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpClient.java @@ -0,0 +1,113 @@ +package me.hekr.iotos.softgateway.network.http; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; +import lombok.Data; +import lombok.Setter; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import me.hekr.iotos.softgateway.common.utils.JsonUtil; +import okhttp3.ConnectionPool; +import okhttp3.OkHttpClient; +import okhttp3.Response; +import okhttp3.ResponseBody; +import okhttp3.logging.HttpLoggingInterceptor; +import okhttp3.logging.HttpLoggingInterceptor.Level; + +/** @author du */ +@Data +@Slf4j +public class HttpClient { + + private OkHttpClient okHttpClient; + private String baseUrl; + /** http response 结果校验,如果不通过则抛出异常 */ + @Setter private HttpResponseChecker httpResponseChecker = HttpResponseChecker.DEFAULT; + + @Setter private HttpExceptionHandler httpExceptionHandler = HttpExceptionHandler.THROW_HANDLER; + + private HttpClient() {} + + @SneakyThrows + public static HttpClient newInstance(String baseUrl, int timeoutOfSecs, Level level) { + ConnectionPool connectionPool = new ConnectionPool(1, 30, TimeUnit.SECONDS); + HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); + interceptor.setLevel(level); + OkHttpClient client = + new OkHttpClient() + .newBuilder() + // 读超时 + .readTimeout(Duration.ofSeconds(timeoutOfSecs)) + // 写超时 + .writeTimeout(Duration.ofSeconds(timeoutOfSecs)) + // + .callTimeout(Duration.ofSeconds(timeoutOfSecs)) + // 连接池 + .connectionPool(connectionPool) + // 连接超时 + .connectTimeout(Duration.ofSeconds(3)) + // 不重试 + .retryOnConnectionFailure(false) + .addInterceptor(interceptor) + .build(); + HttpClient httpClient = new HttpClient(); + httpClient.okHttpClient = client; + httpClient.baseUrl = baseUrl; + return httpClient; + } + + @SneakyThrows + public static HttpClient newInstance(String url) { + return newInstance(url, 3, Level.BASIC); + } + + @SneakyThrows + public HttpResponse exec(HttpRequest request) { + HttpResponse httpResponse; + request.baseUrl = baseUrl; + try { + Response response = okHttpClient.newCall(request.getOkHttpRequest()).execute(); + ResponseBody body = response.body(); + byte[] bytes = body == null ? null : body.bytes(); + httpResponse = new HttpResponse(response, bytes); + httpResponse.success = httpResponseChecker.isSuccess(httpResponse); + } catch (Exception e) { + httpResponse = new HttpResponse(); + httpExceptionHandler.onException(request, e); + } + return httpResponse; + } + + @SneakyThrows + public T exec(HttpRequest request, Class clazz) { + HttpResponse response = exec(request); + return JsonUtil.fromBytes(response.bytes, clazz); + } + + /** + * @param request 请求 + * @param parser response解析 + * @param curPage 初始化当前页码 + * @param pageSize 初始化每页大小 + * @param response + * @param response 中的元素 + * @return 元素列表 + */ + public List exec( + HttpRequestPageable request, ResponseParser parser, int curPage, int pageSize) { + List resultList = new ArrayList<>(); + boolean hasMore = true; + int page = curPage; + while (hasMore) { + HttpResponse resp = exec(request.buildPageRequest(page, pageSize)); + HttpPageResponse parse = parser.parse(resp); + resultList.addAll(parse.getItems()); + hasMore = request.hasMore(parse.getResult()); + page++; + } + + return resultList; + } +} diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpException.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpException.java new file mode 100644 index 0000000..c5064db --- /dev/null +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpException.java @@ -0,0 +1,32 @@ +package me.hekr.iotos.softgateway.network.http; + +/** + * http 异常 + * + * @author IoTOS + */ +public class HttpException extends RuntimeException { + + public HttpException(HttpRequest request, Throwable t) {} + + public HttpException(String message) { + super(message); + } + + public HttpException(String message, Throwable cause) { + super(message, cause); + } + + public HttpException(Throwable cause) { + super(cause); + } + + public HttpException( + String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public HttpException(HttpRequest request, HttpResponse response, Throwable throwable) { + super("request:" + request + ", response:" + response, throwable); + } +} diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpExceptionHandler.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpExceptionHandler.java new file mode 100644 index 0000000..526c748 --- /dev/null +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpExceptionHandler.java @@ -0,0 +1,31 @@ +package me.hekr.iotos.softgateway.network.http; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 异常处理器 + * + * @author IoTOS + */ +public interface HttpExceptionHandler { + Logger log = LoggerFactory.getLogger(HttpExceptionHandler.class); + /** 抛出异常 */ + HttpExceptionHandler THROW_HANDLER = + (request, t) -> { + throw new HttpException(request, t); + }; + + /** 默认打印异常 */ + HttpExceptionHandler LOG_HANDLER = + (request, t) -> { + log.error("request:" + request + ", error:" + t.getMessage(), t); + }; + /** + * 异常发生的时候 + * + * @param request 请求 + * @param t 异常 + */ + void onException(HttpRequest request, Throwable t); +} diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpMethod.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpMethod.java new file mode 100644 index 0000000..c99a57a --- /dev/null +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpMethod.java @@ -0,0 +1,14 @@ +package me.hekr.iotos.softgateway.network.http; + +/** @author iotos */ +public enum HttpMethod { + OPTIONS, + GET, + POST, + HEAD, + PUT, + PATCH, + DELETE, + TRACE, + CONNECT +} diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpPageRequest.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpPageRequest.java new file mode 100644 index 0000000..4fe46d9 --- /dev/null +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpPageRequest.java @@ -0,0 +1,12 @@ +package me.hekr.iotos.softgateway.network.http; + +/** @author iotos */ +public abstract class HttpPageRequest extends HttpRequest { + private Builder builder; + + public HttpPageRequest(Builder builder) { + super(builder); + } + + public abstract HttpPageRequest build(); +} diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpPageResponse.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpPageResponse.java new file mode 100644 index 0000000..1746900 --- /dev/null +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpPageResponse.java @@ -0,0 +1,33 @@ +package me.hekr.iotos.softgateway.network.http; + +import java.util.Collections; +import java.util.List; +import lombok.Getter; +import lombok.Setter; + +/** + * 分页请求结果 + * + * @author iotos + */ +public class HttpPageResponse { + + /** 分页元素 */ + @Setter private List items; + /** response 整体结果 */ + @Setter @Getter private P result; + public HttpPageResponse() {} + + public HttpPageResponse(P p, List t) { + this.result = p; + this.items = t; + } + + public static HttpPageResponse wrap(P p, List t) { + return new HttpPageResponse<>(p, t); + } + + public List getItems() { + return items == null ? Collections.emptyList() : items; + } +} diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequest.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequest.java new file mode 100644 index 0000000..2130f3c --- /dev/null +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequest.java @@ -0,0 +1,109 @@ +package me.hekr.iotos.softgateway.network.http; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.Request; +import okhttp3.RequestBody; +import org.springframework.http.MediaType; + +/** @author iotos */ +public class HttpRequest { + protected Request request; + String baseUrl; + private Builder requestBuilder; + + public HttpRequest(Builder builder) { + this.requestBuilder = builder; + } + + public HttpRequest(Request request) { + this.request = request; + } + + public static Builder builder() { + return new Builder(); + } + + public Request getOkHttpRequest() { + HttpUrl httpUrl = HttpUrl.parse(requestBuilder.path); + // 为 null,非完整的 url,拼接 baseUrl + if (httpUrl == null) { + httpUrl = HttpUrl.parse(baseUrl + requestBuilder.path); + Objects.requireNonNull(httpUrl, "需要填写baseUrl 或者 request 的 path 需要填写完整的 url 地址"); + } + HttpUrl.Builder httpUrlBuilder = httpUrl.newBuilder(); + requestBuilder.queryParams.forEach( + (k, v) -> httpUrlBuilder.addQueryParameter(k, String.valueOf(v))); + + return requestBuilder.okHttpRequestBuilder.url(httpUrlBuilder.build()).build(); + } + + public static class Builder { + private final Map queryParams = new HashMap<>(10); + private final Headers.Builder headerBuilder = new Headers.Builder(); + Request.Builder okHttpRequestBuilder; + HttpUrl.Builder httpUrlBuilder = new HttpUrl.Builder(); + private byte[] body; + private HttpMethod method = HttpMethod.GET; + private MediaType mediaType = MediaType.APPLICATION_JSON; + private String path = ""; + + public HttpRequest build() { + okHttpRequestBuilder = new Request.Builder(); + handleHeaders(); + handleMethodAndBody(); + return new HttpRequest(this); + } + + private void handleUrl() { + HttpUrl.Builder httpUrlBuilder = HttpUrl.get(path).newBuilder(); + queryParams.forEach((k, v) -> httpUrlBuilder.addQueryParameter(k, String.valueOf(v))); + okHttpRequestBuilder.url(httpUrlBuilder.build()); + } + + private void handleMethodAndBody() { + RequestBody requestBody = null; + if (okhttp3.internal.http.HttpMethod.requiresRequestBody(method.name())) { + requestBody = RequestBody.create(okhttp3.MediaType.parse(mediaType.toString()), body); + } + okHttpRequestBuilder.method(method.name(), requestBody); + } + + private void handleHeaders() { + okHttpRequestBuilder.headers(headerBuilder.build()); + } + + public Builder addHeader(String name, String value) { + headerBuilder.add(name, value); + return this; + } + + public Builder body(byte[] body) { + this.body = body; + return this; + } + + public Builder addParam(String name, Object value) { + queryParams.put(name, value); + return this; + } + + public Builder path(String path) { + this.path = path; + return this; + } + + public Builder method(HttpMethod method) { + this.method = method; + return this; + } + + public Builder mediaType(MediaType mediaType) { + this.mediaType = mediaType; + return this; + } + } +} diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequestPageable.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequestPageable.java new file mode 100644 index 0000000..d83b83c --- /dev/null +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequestPageable.java @@ -0,0 +1,20 @@ +package me.hekr.iotos.softgateway.network.http; + +import okhttp3.Request; + +/** + * 分页请求 + * + * @author iotos + */ +public interface HttpRequestPageable { + HttpRequest buildPageRequest(int currentPage, int pageSize); + + /** + * 是否还有更多元素 + * + * @param resp 结果 + * @return true 还有剩余分页数据;false 没有分页数据 + */ + boolean hasMore(R resp); +} diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponse.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponse.java new file mode 100644 index 0000000..a2f0ca9 --- /dev/null +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponse.java @@ -0,0 +1,20 @@ +package me.hekr.iotos.softgateway.network.http; + +import lombok.Getter; +import okhttp3.Response; + +/** @author IoTOS */ +public class HttpResponse { + Response response; + @Getter boolean success; + @Getter byte[] bytes; + @Getter int statusCode; + + public HttpResponse(Response response, byte[] bytes) { + this.response = response; + this.statusCode = response.code(); + this.bytes = bytes; + } + + public HttpResponse() {} +} diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponseChecker.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponseChecker.java new file mode 100644 index 0000000..cd7581a --- /dev/null +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponseChecker.java @@ -0,0 +1,25 @@ +package me.hekr.iotos.softgateway.network.http; + +/** + * 是否成功校验 + * + * @author iotos + */ +public interface HttpResponseChecker { + + /** 默认实现, http status 200<=code<300 */ + HttpResponseChecker DEFAULT = + new HttpResponseChecker() { + @Override + public boolean isSuccess(HttpResponse response) { + return response.response.isSuccessful(); + } + }; + /** + * 是否成功 + * + * @param response response + * @return 成功 true,否则 false + */ + boolean isSuccess(HttpResponse response); +} diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponsePageable.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponsePageable.java new file mode 100644 index 0000000..61d3478 --- /dev/null +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponsePageable.java @@ -0,0 +1,13 @@ +package me.hekr.iotos.softgateway.network.http; + +/** @author iotos */ +public interface HttpResponsePageable { + + /** + * 是否还有更多元素 + * + * @param resp 结果 + * @return true 还有剩余分页数据;false 没有分页数据 + */ + boolean hasMoreHeaders(T resp); +} diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/ResponseParser.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/ResponseParser.java new file mode 100644 index 0000000..2f17db0 --- /dev/null +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/ResponseParser.java @@ -0,0 +1,13 @@ +package me.hekr.iotos.softgateway.network.http; + +/** @author iotos */ +public interface ResponseParser { + + /** + * 解析 response + * + * @param response 请求结果 + * @return 请求结果 + */ + HttpPageResponse parse(HttpResponse response); +} diff --git a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Device.java b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Device.java new file mode 100644 index 0000000..8f48b75 --- /dev/null +++ b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Device.java @@ -0,0 +1,9 @@ +package me.hekr.iotos.softgateway.network.http; + +import lombok.Data; + +@Data +public class Device { + private String name; + private int temId; +} diff --git a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/DeviceResponse.java b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/DeviceResponse.java new file mode 100644 index 0000000..b05abbd --- /dev/null +++ b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/DeviceResponse.java @@ -0,0 +1,13 @@ +package me.hekr.iotos.softgateway.network.http; + +import java.util.List; +import lombok.Data; + +@Data +public class DeviceResponse { + List devices; + + public boolean hasMore() { + return devices != null && !devices.isEmpty(); + } +} diff --git a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/HttpClientTest.java b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/HttpClientTest.java new file mode 100644 index 0000000..ac052ad --- /dev/null +++ b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/HttpClientTest.java @@ -0,0 +1,36 @@ +package me.hekr.iotos.softgateway.network.http; + +import java.util.List; +import me.hekr.iotos.softgateway.common.utils.JsonUtil; +import org.junit.Test; + +public class HttpClientTest { + @Test + public void testRequestPageable() { + HttpClient client = HttpClient.newInstance("http://localhost:8080/"); + HttpRequestPageable request = + new HttpRequestPageable() { + @Override + public HttpRequest buildPageRequest(int curPage, int pageSize) { + return HttpRequest.builder() + .path("") + .addParam("curPage", curPage) + .addParam("pageSize", pageSize) + .build(); + } + + @Override + public boolean hasMore(DeviceResponse resp) { + return resp.hasMore(); + } + }; + ResponseParser parser = + response -> { + DeviceResponse fromBytes; + fromBytes = JsonUtil.fromBytes(response.bytes, DeviceResponse.class); + return HttpPageResponse.wrap(fromBytes, fromBytes.devices); + }; + List list = client.exec(request, parser, 0, 1); + System.out.println(list); + } +} diff --git a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Server.java b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Server.java new file mode 100644 index 0000000..836584a --- /dev/null +++ b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Server.java @@ -0,0 +1,27 @@ +package me.hekr.iotos.softgateway.network.http; + +import java.util.Collections; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@RestController +public class Server { + public static void main(String[] args) { + SpringApplication.run(Server.class); + } + + @GetMapping("/") + public Object get(Integer curPage, Integer pageSize) { + DeviceResponse response = new DeviceResponse(); + + if (curPage >= 3) { + response.setDevices(Collections.emptyList()); + } else { + response.setDevices(Collections.singletonList(new Device())); + } + return response; + } +} diff --git a/pom.xml b/pom.xml index f3c2209..1f1fc4a 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,7 @@ example framework-common-utils framework-network-mqtt + framework-network-http -- Gitee From b9161169d6b675a88028fdc59cc67e4fb299c6de Mon Sep 17 00:00:00 2001 From: sdvdxl Date: Tue, 18 May 2021 12:44:31 +0800 Subject: [PATCH 03/14] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sdvdxl --- .../java/me/hekr/iotos/softgateway/network/http/HttpRequest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequest.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequest.java index 2130f3c..81c8db2 100644 --- a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequest.java +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequest.java @@ -45,7 +45,6 @@ public class HttpRequest { private final Map queryParams = new HashMap<>(10); private final Headers.Builder headerBuilder = new Headers.Builder(); Request.Builder okHttpRequestBuilder; - HttpUrl.Builder httpUrlBuilder = new HttpUrl.Builder(); private byte[] body; private HttpMethod method = HttpMethod.GET; private MediaType mediaType = MediaType.APPLICATION_JSON; -- Gitee From deec2e11a95b410264507cfeff4876de5d67c93f Mon Sep 17 00:00:00 2001 From: sdvdxl Date: Tue, 18 May 2021 15:02:57 +0800 Subject: [PATCH 04/14] fix response parser Signed-off-by: sdvdxl --- .../softgateway/network/http/HttpClient.java | 26 +++++++++++++++---- .../network/http/HttpPageResponse.java | 13 +++++----- .../network/http/HttpRequestPageable.java | 26 +++++++++++++++---- .../network/http/HttpResponse.java | 1 + .../network/http/HttpResponseChecker.java | 2 +- ...nsePageable.java => PageableResponse.java} | 11 ++++---- .../network/http/PageableResponseParser.java | 12 +++++++++ .../network/http/ResponseParser.java | 10 +++---- .../network/http/DeviceResponse.java | 7 ++++- .../network/http/HttpClientTest.java | 13 +++------- 10 files changed, 84 insertions(+), 37 deletions(-) rename framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/{HttpResponsePageable.java => PageableResponse.java} (30%) create mode 100644 framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/PageableResponseParser.java diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpClient.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpClient.java index 6eec1e6..ce44f85 100644 --- a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpClient.java +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpClient.java @@ -66,7 +66,7 @@ public class HttpClient { @SneakyThrows public HttpResponse exec(HttpRequest request) { HttpResponse httpResponse; - request.baseUrl = baseUrl; + request.baseUrl = baseUrl; try { Response response = okHttpClient.newCall(request.getOkHttpRequest()).execute(); ResponseBody body = response.body(); @@ -80,10 +80,23 @@ public class HttpClient { return httpResponse; } + /** + * 执行请求,并自动从 json 对象解析成对象 + * + * @param request 请求 + * @param clazz 映射的对象 + * @param 参数类型 + * @return 结果 + */ @SneakyThrows public T exec(HttpRequest request, Class clazz) { + return exec(request, response -> JsonUtil.fromBytes(response.bytes, clazz)); + } + + @SneakyThrows + public T exec(HttpRequest request, ResponseParser parser) { HttpResponse response = exec(request); - return JsonUtil.fromBytes(response.bytes, clazz); + return parser.parse(response); } /** @@ -95,13 +108,16 @@ public class HttpClient { * @param response 中的元素 * @return 元素列表 */ - public List exec( - HttpRequestPageable request, ResponseParser parser, int curPage, int pageSize) { + public , T> List exec( + HttpRequestPageable request, + PageableResponseParser parser, + int curPage, + int pageSize) { List resultList = new ArrayList<>(); boolean hasMore = true; int page = curPage; while (hasMore) { - HttpResponse resp = exec(request.buildPageRequest(page, pageSize)); + HttpResponse resp = exec(request.buildRequest(page, pageSize)); HttpPageResponse parse = parser.parse(resp); resultList.addAll(parse.getItems()); hasMore = request.hasMore(parse.getResult()); diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpPageResponse.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpPageResponse.java index 1746900..8d993fc 100644 --- a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpPageResponse.java +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpPageResponse.java @@ -10,21 +10,22 @@ import lombok.Setter; * * @author iotos */ -public class HttpPageResponse { +public class HttpPageResponse, T> { /** 分页元素 */ @Setter private List items; /** response 整体结果 */ - @Setter @Getter private P result; + @Setter @Getter private R result; + public HttpPageResponse() {} - public HttpPageResponse(P p, List t) { - this.result = p; + public HttpPageResponse(R r, List t) { + this.result = r; this.items = t; } - public static HttpPageResponse wrap(P p, List t) { - return new HttpPageResponse<>(p, t); + public static , T> HttpPageResponse wrap(R r) { + return new HttpPageResponse<>(r, r.getItems()); } public List getItems() { diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequestPageable.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequestPageable.java index d83b83c..d21245b 100644 --- a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequestPageable.java +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequestPageable.java @@ -1,14 +1,30 @@ package me.hekr.iotos.softgateway.network.http; -import okhttp3.Request; - /** * 分页请求 * * @author iotos */ -public interface HttpRequestPageable { - HttpRequest buildPageRequest(int currentPage, int pageSize); +public abstract class HttpRequestPageable { + int curPage = 0; + int pageSize = 10; + + /** 默认分页 curPage=0; pageSize=10; */ + public HttpRequestPageable() {} + + public HttpRequestPageable(int curPage, int pageSize) { + this.curPage = curPage; + this.pageSize = pageSize; + } + + /** + * 通过分页信息构造一个 httpRequest + * + * @param curPage 当前页码, 下次查询的页码,第一次传入是 初始化的页面,后面每次调用会+1 + * @param pageSize 每页大小 + * @return 构造的 HttpRequest + */ + public abstract HttpRequest buildRequest(int curPage, int pageSize); /** * 是否还有更多元素 @@ -16,5 +32,5 @@ public interface HttpRequestPageable { * @param resp 结果 * @return true 还有剩余分页数据;false 没有分页数据 */ - boolean hasMore(R resp); + abstract boolean hasMore(R resp); } diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponse.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponse.java index a2f0ca9..92d12fc 100644 --- a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponse.java +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponse.java @@ -14,6 +14,7 @@ public class HttpResponse { this.response = response; this.statusCode = response.code(); this.bytes = bytes; + success = true; } public HttpResponse() {} diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponseChecker.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponseChecker.java index cd7581a..1adf6da 100644 --- a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponseChecker.java +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponseChecker.java @@ -7,7 +7,7 @@ package me.hekr.iotos.softgateway.network.http; */ public interface HttpResponseChecker { - /** 默认实现, http status 200<=code<300 */ + /** 默认实现, http status 200 <=code<300 */ HttpResponseChecker DEFAULT = new HttpResponseChecker() { @Override diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponsePageable.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/PageableResponse.java similarity index 30% rename from framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponsePageable.java rename to framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/PageableResponse.java index 61d3478..cf3df70 100644 --- a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponsePageable.java +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/PageableResponse.java @@ -1,13 +1,14 @@ package me.hekr.iotos.softgateway.network.http; +import java.util.List; + /** @author iotos */ -public interface HttpResponsePageable { +public interface PageableResponse { /** - * 是否还有更多元素 + * 获取分页的元素列表 * - * @param resp 结果 - * @return true 还有剩余分页数据;false 没有分页数据 + * @return 分页的元素列表 */ - boolean hasMoreHeaders(T resp); + List getItems(); } diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/PageableResponseParser.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/PageableResponseParser.java new file mode 100644 index 0000000..ba044ad --- /dev/null +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/PageableResponseParser.java @@ -0,0 +1,12 @@ +package me.hekr.iotos.softgateway.network.http; + +/** @author iotos */ +public interface PageableResponseParser, T> { + /** + * 解析 response + * + * @param response 请求结果 + * @return 请求结果 + */ + HttpPageResponse parse(HttpResponse response); +} diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/ResponseParser.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/ResponseParser.java index 2f17db0..0feaa4d 100644 --- a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/ResponseParser.java +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/ResponseParser.java @@ -1,13 +1,13 @@ package me.hekr.iotos.softgateway.network.http; /** @author iotos */ -public interface ResponseParser { +public interface ResponseParser { /** - * 解析 response + * 从 response 解析成对象 * - * @param response 请求结果 - * @return 请求结果 + * @param response response + * @return 解析结果 */ - HttpPageResponse parse(HttpResponse response); + T parse(HttpResponse response); } diff --git a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/DeviceResponse.java b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/DeviceResponse.java index b05abbd..bcae991 100644 --- a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/DeviceResponse.java +++ b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/DeviceResponse.java @@ -4,10 +4,15 @@ import java.util.List; import lombok.Data; @Data -public class DeviceResponse { +public class DeviceResponse implements PageableResponse { List devices; public boolean hasMore() { return devices != null && !devices.isEmpty(); } + + @Override + public List getItems() { + return devices; + } } diff --git a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/HttpClientTest.java b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/HttpClientTest.java index ac052ad..f8c3b9b 100644 --- a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/HttpClientTest.java +++ b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/HttpClientTest.java @@ -9,11 +9,10 @@ public class HttpClientTest { public void testRequestPageable() { HttpClient client = HttpClient.newInstance("http://localhost:8080/"); HttpRequestPageable request = - new HttpRequestPageable() { + new HttpRequestPageable(0, 10) { @Override - public HttpRequest buildPageRequest(int curPage, int pageSize) { + public HttpRequest buildRequest(int curPage, int pageSize) { return HttpRequest.builder() - .path("") .addParam("curPage", curPage) .addParam("pageSize", pageSize) .build(); @@ -24,12 +23,8 @@ public class HttpClientTest { return resp.hasMore(); } }; - ResponseParser parser = - response -> { - DeviceResponse fromBytes; - fromBytes = JsonUtil.fromBytes(response.bytes, DeviceResponse.class); - return HttpPageResponse.wrap(fromBytes, fromBytes.devices); - }; + PageableResponseParser parser = + r -> HttpPageResponse.wrap(JsonUtil.fromBytes(r.bytes, DeviceResponse.class)); List list = client.exec(request, parser, 0, 1); System.out.println(list); } -- Gitee From 833e1815fb6ca118d68c8c25d1d8cc565a38172c Mon Sep 17 00:00:00 2001 From: sdvdxl Date: Tue, 18 May 2021 15:51:58 +0800 Subject: [PATCH 05/14] =?UTF-8?q?fix=20=E5=88=86=E9=A1=B5=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sdvdxl --- .../softgateway/network/http/HttpClient.java | 12 +++-- .../network/http/HttpExceptionHandler.java | 4 +- .../network/http/HttpPageResponse.java | 13 ++--- .../network/http/DeviceResponse.java | 6 +++ .../network/http/HttpClientTest.java | 48 +++++++++++++++++++ .../softgateway/network/http/Server.java | 8 ++++ 6 files changed, 77 insertions(+), 14 deletions(-) diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpClient.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpClient.java index ce44f85..f67ebdf 100644 --- a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpClient.java +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpClient.java @@ -26,8 +26,6 @@ public class HttpClient { /** http response 结果校验,如果不通过则抛出异常 */ @Setter private HttpResponseChecker httpResponseChecker = HttpResponseChecker.DEFAULT; - @Setter private HttpExceptionHandler httpExceptionHandler = HttpExceptionHandler.THROW_HANDLER; - private HttpClient() {} @SneakyThrows @@ -47,7 +45,7 @@ public class HttpClient { // 连接池 .connectionPool(connectionPool) // 连接超时 - .connectTimeout(Duration.ofSeconds(3)) + .connectTimeout(Duration.ofSeconds(timeoutOfSecs)) // 不重试 .retryOnConnectionFailure(false) .addInterceptor(interceptor) @@ -63,6 +61,11 @@ public class HttpClient { return newInstance(url, 3, Level.BASIC); } + @SneakyThrows + public static HttpClient newInstance(String url, Level level) { + return newInstance(url, 3, level); + } + @SneakyThrows public HttpResponse exec(HttpRequest request) { HttpResponse httpResponse; @@ -74,8 +77,7 @@ public class HttpClient { httpResponse = new HttpResponse(response, bytes); httpResponse.success = httpResponseChecker.isSuccess(httpResponse); } catch (Exception e) { - httpResponse = new HttpResponse(); - httpExceptionHandler.onException(request, e); + throw new HttpException(request, e); } return httpResponse; } diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpExceptionHandler.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpExceptionHandler.java index 526c748..544796e 100644 --- a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpExceptionHandler.java +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpExceptionHandler.java @@ -20,12 +20,14 @@ public interface HttpExceptionHandler { HttpExceptionHandler LOG_HANDLER = (request, t) -> { log.error("request:" + request + ", error:" + t.getMessage(), t); + return new HttpResponse(); }; /** * 异常发生的时候 * * @param request 请求 * @param t 异常 + * @return 自定义 response */ - void onException(HttpRequest request, Throwable t); + HttpResponse onException(HttpRequest request, Throwable t); } diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpPageResponse.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpPageResponse.java index 8d993fc..01831ed 100644 --- a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpPageResponse.java +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpPageResponse.java @@ -1,7 +1,7 @@ package me.hekr.iotos.softgateway.network.http; +import java.util.Collection; import java.util.Collections; -import java.util.List; import lombok.Getter; import lombok.Setter; @@ -12,23 +12,20 @@ import lombok.Setter; */ public class HttpPageResponse, T> { - /** 分页元素 */ - @Setter private List items; /** response 整体结果 */ @Setter @Getter private R result; public HttpPageResponse() {} - public HttpPageResponse(R r, List t) { + public HttpPageResponse(R r) { this.result = r; - this.items = t; } public static , T> HttpPageResponse wrap(R r) { - return new HttpPageResponse<>(r, r.getItems()); + return new HttpPageResponse<>(r); } - public List getItems() { - return items == null ? Collections.emptyList() : items; + public Collection getItems() { + return result == null ? Collections.emptyList() : result.getItems(); } } diff --git a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/DeviceResponse.java b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/DeviceResponse.java index bcae991..61bfc52 100644 --- a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/DeviceResponse.java +++ b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/DeviceResponse.java @@ -7,6 +7,12 @@ import lombok.Data; public class DeviceResponse implements PageableResponse { List devices; + public DeviceResponse() {} + + public DeviceResponse(List devices) { + this.devices = devices; + } + public boolean hasMore() { return devices != null && !devices.isEmpty(); } diff --git a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/HttpClientTest.java b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/HttpClientTest.java index f8c3b9b..e908bdf 100644 --- a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/HttpClientTest.java +++ b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/HttpClientTest.java @@ -1,10 +1,16 @@ package me.hekr.iotos.softgateway.network.http; +import com.fasterxml.jackson.core.type.TypeReference; import java.util.List; import me.hekr.iotos.softgateway.common.utils.JsonUtil; +import okhttp3.logging.HttpLoggingInterceptor.Level; +import org.junit.Ignore; import org.junit.Test; +@Ignore public class HttpClientTest { + + /** 测试分页 */ @Test public void testRequestPageable() { HttpClient client = HttpClient.newInstance("http://localhost:8080/"); @@ -28,4 +34,46 @@ public class HttpClientTest { List list = client.exec(request, parser, 0, 1); System.out.println(list); } + + /** 测试分页 ,紧紧返回列表的情况 */ + @Test + public void testRequestPageableItems() { + HttpClient client = HttpClient.newInstance("http://localhost:8080/"); + HttpRequestPageable request = + new HttpRequestPageable(0, 10) { + @Override + public HttpRequest buildRequest(int curPage, int pageSize) { + return HttpRequest.builder() + .path("items") + .addParam("curPage", curPage) + .addParam("pageSize", pageSize) + .build(); + } + + @Override + public boolean hasMore(DeviceResponse resp) { + return resp.hasMore(); + } + }; + PageableResponseParser parser = + r -> { + List devices = + JsonUtil.fromBytes(r.getBytes(), new TypeReference>() {}); + return new HttpPageResponse<>(new DeviceResponse(devices)); + }; + List list = client.exec(request, parser, 0, 1); + System.out.println(list); + } + + @Test(expected = HttpException.class) + public void testHttpException() { + HttpClient client = HttpClient.newInstance("http://localhost:1234/"); + client.exec(HttpRequest.builder().build(), DeviceResponse.class); + } + + @Test + public void testHttpExceptionLog() { + HttpClient client = HttpClient.newInstance("http://localhost:8080/", Level.BODY); + System.out.println(client.exec(HttpRequest.builder().build(), DeviceResponse.class)); + } } diff --git a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Server.java b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Server.java index 836584a..d1f45a6 100644 --- a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Server.java +++ b/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Server.java @@ -24,4 +24,12 @@ public class Server { } return response; } + + @GetMapping("/items") + public Object items(Integer curPage, Integer pageSize) { + if (curPage >= 3) { + return Collections.emptyList(); + } + return Collections.singletonList(new Device()); + } } -- Gitee From 224e17d7832112bb1cc46500a343a1c755992889 Mon Sep 17 00:00:00 2001 From: sdvdxl Date: Tue, 18 May 2021 16:04:46 +0800 Subject: [PATCH 06/14] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20http=20sample?= =?UTF-8?q?=EF=BC=9B=20fix=20=E9=83=A8=E5=88=86=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sdvdxl --- .../iotos/softgateway/sample}/Device.java | 2 +- .../softgateway/sample}/DeviceResponse.java | 3 +- .../softgateway/sample/HttpClientSample.java | 42 +++++++++---------- .../softgateway/sample/HttpServerSample.java | 13 ++++-- example/src/main/resources/application.yml | 2 + .../network/http/HttpRequestPageable.java | 2 +- pom.xml | 42 +++++++++++-------- 7 files changed, 59 insertions(+), 47 deletions(-) rename {framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http => example/src/main/java/me/hekr/iotos/softgateway/sample}/Device.java (66%) rename {framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http => example/src/main/java/me/hekr/iotos/softgateway/sample}/DeviceResponse.java (79%) rename framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/HttpClientTest.java => example/src/main/java/me/hekr/iotos/softgateway/sample/HttpClientSample.java (70%) rename framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Server.java => example/src/main/java/me/hekr/iotos/softgateway/sample/HttpServerSample.java (79%) create mode 100644 example/src/main/resources/application.yml diff --git a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Device.java b/example/src/main/java/me/hekr/iotos/softgateway/sample/Device.java similarity index 66% rename from framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Device.java rename to example/src/main/java/me/hekr/iotos/softgateway/sample/Device.java index 8f48b75..9b45861 100644 --- a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Device.java +++ b/example/src/main/java/me/hekr/iotos/softgateway/sample/Device.java @@ -1,4 +1,4 @@ -package me.hekr.iotos.softgateway.network.http; +package me.hekr.iotos.softgateway.sample; import lombok.Data; diff --git a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/DeviceResponse.java b/example/src/main/java/me/hekr/iotos/softgateway/sample/DeviceResponse.java similarity index 79% rename from framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/DeviceResponse.java rename to example/src/main/java/me/hekr/iotos/softgateway/sample/DeviceResponse.java index 61bfc52..2376801 100644 --- a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/DeviceResponse.java +++ b/example/src/main/java/me/hekr/iotos/softgateway/sample/DeviceResponse.java @@ -1,7 +1,8 @@ -package me.hekr.iotos.softgateway.network.http; +package me.hekr.iotos.softgateway.sample; import java.util.List; import lombok.Data; +import me.hekr.iotos.softgateway.network.http.PageableResponse; @Data public class DeviceResponse implements PageableResponse { diff --git a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/HttpClientTest.java b/example/src/main/java/me/hekr/iotos/softgateway/sample/HttpClientSample.java similarity index 70% rename from framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/HttpClientTest.java rename to example/src/main/java/me/hekr/iotos/softgateway/sample/HttpClientSample.java index e908bdf..9d4e18e 100644 --- a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/HttpClientTest.java +++ b/example/src/main/java/me/hekr/iotos/softgateway/sample/HttpClientSample.java @@ -1,18 +1,27 @@ -package me.hekr.iotos.softgateway.network.http; +package me.hekr.iotos.softgateway.sample; import com.fasterxml.jackson.core.type.TypeReference; import java.util.List; import me.hekr.iotos.softgateway.common.utils.JsonUtil; -import okhttp3.logging.HttpLoggingInterceptor.Level; -import org.junit.Ignore; -import org.junit.Test; +import me.hekr.iotos.softgateway.network.http.HttpClient; +import me.hekr.iotos.softgateway.network.http.HttpPageResponse; +import me.hekr.iotos.softgateway.network.http.HttpRequest; +import me.hekr.iotos.softgateway.network.http.HttpRequestPageable; +import me.hekr.iotos.softgateway.network.http.PageableResponseParser; -@Ignore -public class HttpClientTest { +/** + * 运行前先启动 HttpServerSample + * + * @author iotos + */ +public class HttpClientSample { + public static void main(String[] args) { + testRequestPageable(); + testRequestPageableItems(); + } /** 测试分页 */ - @Test - public void testRequestPageable() { + public static void testRequestPageable() { HttpClient client = HttpClient.newInstance("http://localhost:8080/"); HttpRequestPageable request = new HttpRequestPageable(0, 10) { @@ -30,14 +39,13 @@ public class HttpClientTest { } }; PageableResponseParser parser = - r -> HttpPageResponse.wrap(JsonUtil.fromBytes(r.bytes, DeviceResponse.class)); + r -> HttpPageResponse.wrap(JsonUtil.fromBytes(r.getBytes(), DeviceResponse.class)); List list = client.exec(request, parser, 0, 1); System.out.println(list); } /** 测试分页 ,紧紧返回列表的情况 */ - @Test - public void testRequestPageableItems() { + public static void testRequestPageableItems() { HttpClient client = HttpClient.newInstance("http://localhost:8080/"); HttpRequestPageable request = new HttpRequestPageable(0, 10) { @@ -64,16 +72,4 @@ public class HttpClientTest { List list = client.exec(request, parser, 0, 1); System.out.println(list); } - - @Test(expected = HttpException.class) - public void testHttpException() { - HttpClient client = HttpClient.newInstance("http://localhost:1234/"); - client.exec(HttpRequest.builder().build(), DeviceResponse.class); - } - - @Test - public void testHttpExceptionLog() { - HttpClient client = HttpClient.newInstance("http://localhost:8080/", Level.BODY); - System.out.println(client.exec(HttpRequest.builder().build(), DeviceResponse.class)); - } } diff --git a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Server.java b/example/src/main/java/me/hekr/iotos/softgateway/sample/HttpServerSample.java similarity index 79% rename from framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Server.java rename to example/src/main/java/me/hekr/iotos/softgateway/sample/HttpServerSample.java index d1f45a6..7bc5fa2 100644 --- a/framework-network-http/src/test/java/me/hekr/iotos/softgateway/network/http/Server.java +++ b/example/src/main/java/me/hekr/iotos/softgateway/sample/HttpServerSample.java @@ -1,4 +1,4 @@ -package me.hekr.iotos.softgateway.network.http; +package me.hekr.iotos.softgateway.sample; import java.util.Collections; import org.springframework.boot.SpringApplication; @@ -6,11 +6,18 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; +/** + * http server + * + *

端口配置在 resources/application.yml 中 + * + * @author iotos + */ @SpringBootApplication @RestController -public class Server { +public class HttpServerSample { public static void main(String[] args) { - SpringApplication.run(Server.class); + SpringApplication.run(HttpServerSample.class); } @GetMapping("/") diff --git a/example/src/main/resources/application.yml b/example/src/main/resources/application.yml new file mode 100644 index 0000000..04ea648 --- /dev/null +++ b/example/src/main/resources/application.yml @@ -0,0 +1,2 @@ +# http server port +server.port: 8080 diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequestPageable.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequestPageable.java index d21245b..c7a17c3 100644 --- a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequestPageable.java +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequestPageable.java @@ -32,5 +32,5 @@ public abstract class HttpRequestPageable { * @param resp 结果 * @return true 还有剩余分页数据;false 没有分页数据 */ - abstract boolean hasMore(R resp); + public abstract boolean hasMore(R resp); } diff --git a/pom.xml b/pom.xml index 1f1fc4a..09a722c 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,8 @@ scm:git:git://https://gitee.com/geekhekr/iotos-soft-gateway.git - scm:git:ssh://gitee.com:geekhekr/iotos-soft-gateway.git + scm:git:ssh://gitee.com:geekhekr/iotos-soft-gateway.git + https://gitee.com/geekhekr/iotos-soft-gateway @@ -62,6 +63,11 @@ netty-all 4.1.60.Final + + me.hekr.iotos.softgateway + framework-network-common + ${iotos.softgateway.version} + me.hekr.iotos.softgateway framework-core @@ -89,7 +95,7 @@ me.hekr.iotos.softgateway - framework-network-common + framework-network-http ${iotos.softgateway.version} @@ -149,22 +155,22 @@ - - org.apache.maven.plugins - maven-javadoc-plugin - 2.9.1 - - - attach-javadocs - - jar - - - - - false - - + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9.1 + + + attach-javadocs + + jar + + + + + false + + org.apache.maven.plugins maven-gpg-plugin -- Gitee From fe2f55fe508487eaf107b748a4dc413470182a73 Mon Sep 17 00:00:00 2001 From: sdvdxl Date: Tue, 18 May 2021 16:25:49 +0800 Subject: [PATCH 07/14] =?UTF-8?q?fix=20=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sdvdxl --- .../softgateway/sample/HttpClientSample.java | 26 +++++++++++++++++++ .../softgateway/network/http/HttpClient.java | 7 ++++- .../network/http/HttpException.java | 4 +++ .../softgateway/network/http/HttpRequest.java | 5 ++++ .../network/http/HttpResponse.java | 7 +++-- .../network/http/HttpResponseChecker.java | 15 +++++++++++ 6 files changed, 61 insertions(+), 3 deletions(-) diff --git a/example/src/main/java/me/hekr/iotos/softgateway/sample/HttpClientSample.java b/example/src/main/java/me/hekr/iotos/softgateway/sample/HttpClientSample.java index 9d4e18e..ba6e22f 100644 --- a/example/src/main/java/me/hekr/iotos/softgateway/sample/HttpClientSample.java +++ b/example/src/main/java/me/hekr/iotos/softgateway/sample/HttpClientSample.java @@ -7,6 +7,8 @@ import me.hekr.iotos.softgateway.network.http.HttpClient; import me.hekr.iotos.softgateway.network.http.HttpPageResponse; import me.hekr.iotos.softgateway.network.http.HttpRequest; import me.hekr.iotos.softgateway.network.http.HttpRequestPageable; +import me.hekr.iotos.softgateway.network.http.HttpResponse; +import me.hekr.iotos.softgateway.network.http.HttpResponseChecker; import me.hekr.iotos.softgateway.network.http.PageableResponseParser; /** @@ -18,11 +20,17 @@ public class HttpClientSample { public static void main(String[] args) { testRequestPageable(); testRequestPageableItems(); + testChecker(); } /** 测试分页 */ public static void testRequestPageable() { HttpClient client = HttpClient.newInstance("http://localhost:8080/"); + client.setHttpResponseChecker( + response -> { + // 200才算成功 + return response.getStatusCode() == 200; + }); HttpRequestPageable request = new HttpRequestPageable(0, 10) { @Override @@ -72,4 +80,22 @@ public class HttpClientSample { List list = client.exec(request, parser, 0, 1); System.out.println(list); } + + /** 测试自定义校验 */ + public static void testChecker() { + HttpClient client = HttpClient.newInstance("http://localhost:8080/"); + client.setHttpResponseChecker( + new HttpResponseChecker() { + @Override + public boolean isSuccess(HttpResponse response) { + return response.getStatusCode() == 201; + } + + @Override + public String desc() { + return "不是201!!"; + } + }); + client.exec(HttpRequest.builder().path("").build()); + } } diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpClient.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpClient.java index f67ebdf..862d81f 100644 --- a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpClient.java +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpClient.java @@ -75,10 +75,15 @@ public class HttpClient { ResponseBody body = response.body(); byte[] bytes = body == null ? null : body.bytes(); httpResponse = new HttpResponse(response, bytes); - httpResponse.success = httpResponseChecker.isSuccess(httpResponse); } catch (Exception e) { throw new HttpException(request, e); } + + boolean success = httpResponseChecker.isSuccess(httpResponse); + if (!success) { + throw new HttpException(request, httpResponse, httpResponseChecker.desc()); + } + return httpResponse; } diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpException.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpException.java index c5064db..fff0806 100644 --- a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpException.java +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpException.java @@ -29,4 +29,8 @@ public class HttpException extends RuntimeException { public HttpException(HttpRequest request, HttpResponse response, Throwable throwable) { super("request:" + request + ", response:" + response, throwable); } + + public HttpException(HttpRequest request, HttpResponse response, String desc) { + super(desc + ", request:" + request + ", response:" + response); + } } diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequest.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequest.java index 81c8db2..8c5d808 100644 --- a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequest.java +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpRequest.java @@ -41,6 +41,11 @@ public class HttpRequest { return requestBuilder.okHttpRequestBuilder.url(httpUrlBuilder.build()).build(); } + @Override + public String toString() { + return "HttpRequest{" + "request=" + getOkHttpRequest() + '}'; + } + public static class Builder { private final Map queryParams = new HashMap<>(10); private final Headers.Builder headerBuilder = new Headers.Builder(); diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponse.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponse.java index 92d12fc..fd65335 100644 --- a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponse.java +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponse.java @@ -6,7 +6,6 @@ import okhttp3.Response; /** @author IoTOS */ public class HttpResponse { Response response; - @Getter boolean success; @Getter byte[] bytes; @Getter int statusCode; @@ -14,8 +13,12 @@ public class HttpResponse { this.response = response; this.statusCode = response.code(); this.bytes = bytes; - success = true; } public HttpResponse() {} + + @Override + public String toString() { + return "HttpResponse{" + "response=" + response + '}'; + } } diff --git a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponseChecker.java b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponseChecker.java index 1adf6da..dbb1777 100644 --- a/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponseChecker.java +++ b/framework-network-http/src/main/java/me/hekr/iotos/softgateway/network/http/HttpResponseChecker.java @@ -14,6 +14,11 @@ public interface HttpResponseChecker { public boolean isSuccess(HttpResponse response) { return response.response.isSuccessful(); } + + @Override + public String desc() { + return "status code 不是2xx"; + } }; /** * 是否成功 @@ -22,4 +27,14 @@ public interface HttpResponseChecker { * @return 成功 true,否则 false */ boolean isSuccess(HttpResponse response); + + /** + * 校验失败描述 + * + * @return 描述 + */ + default String desc() { + return "response 校验失败"; + } + ; } -- Gitee From f69f94e37fe49bf95748dcc4247154a04101ff31 Mon Sep 17 00:00:00 2001 From: sdvdxl Date: Tue, 18 May 2021 16:40:26 +0800 Subject: [PATCH 08/14] 3.2.0-snapshot --- deploy.sh | 2 +- example/pom.xml | 2 +- framework-common-utils/pom.xml | 2 +- framework-core/pom.xml | 2 +- framework-network-common/pom.xml | 2 +- framework-network-http/pom.xml | 2 +- framework-network-mqtt/pom.xml | 4 ++-- framework-network-tcp/pom.xml | 3 +-- framework-network-udp/pom.xml | 3 +-- pom.xml | 4 ++-- 10 files changed, 12 insertions(+), 14 deletions(-) diff --git a/deploy.sh b/deploy.sh index bc9e49c..113480b 100755 --- a/deploy.sh +++ b/deploy.sh @@ -3,7 +3,7 @@ # ./deploy deploy 生成 maven jar包 # ./deploy upload 生成 maven jar 包并 commit -VERSION="3.1.0" +VERSION="3.2.0-SNAPSHOT" echo "版本号:$VERSION" updateVersion(){ diff --git a/example/pom.xml b/example/pom.xml index 2db0a39..28ede44 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -5,7 +5,7 @@ iotos-soft-gateway me.hekr.iotos.softgateway - 3.1.0 + 3.2.0-SNAPSHOT 8 diff --git a/framework-common-utils/pom.xml b/framework-common-utils/pom.xml index 06dba71..3bae32a 100644 --- a/framework-common-utils/pom.xml +++ b/framework-common-utils/pom.xml @@ -5,7 +5,7 @@ iotos-soft-gateway me.hekr.iotos.softgateway - 3.1.0 + 3.2.0-SNAPSHOT 4.0.0 diff --git a/framework-core/pom.xml b/framework-core/pom.xml index 5960932..fa92ee8 100644 --- a/framework-core/pom.xml +++ b/framework-core/pom.xml @@ -5,7 +5,7 @@ iotos-soft-gateway me.hekr.iotos.softgateway - 3.1.0 + 3.2.0-SNAPSHOT 4.0.0 jar diff --git a/framework-network-common/pom.xml b/framework-network-common/pom.xml index cdf6749..af4e865 100644 --- a/framework-network-common/pom.xml +++ b/framework-network-common/pom.xml @@ -5,7 +5,7 @@ iotos-soft-gateway me.hekr.iotos.softgateway - 3.1.0 + 3.2.0-SNAPSHOT 4.0.0 diff --git a/framework-network-http/pom.xml b/framework-network-http/pom.xml index 10d15d9..5aa4653 100644 --- a/framework-network-http/pom.xml +++ b/framework-network-http/pom.xml @@ -5,7 +5,7 @@ iotos-soft-gateway me.hekr.iotos.softgateway - 3.1.0 + 3.2.0-SNAPSHOT 4.0.0 framework-network-http diff --git a/framework-network-mqtt/pom.xml b/framework-network-mqtt/pom.xml index 00b9a69..209e7c3 100644 --- a/framework-network-mqtt/pom.xml +++ b/framework-network-mqtt/pom.xml @@ -5,7 +5,7 @@ iotos-soft-gateway me.hekr.iotos.softgateway - 3.1.0 + 3.2.0-SNAPSHOT 4.0.0 @@ -25,7 +25,7 @@ me.hekr.iotos.softgateway framework-network-common - 3.1.0 + 3.2.0-SNAPSHOT \ No newline at end of file diff --git a/framework-network-tcp/pom.xml b/framework-network-tcp/pom.xml index 53b25ca..d504866 100644 --- a/framework-network-tcp/pom.xml +++ b/framework-network-tcp/pom.xml @@ -5,12 +5,11 @@ iotos-soft-gateway me.hekr.iotos.softgateway - 3.1.0 + 3.2.0-SNAPSHOT 4.0.0 framework-network-tcp - 3.1.0 8 diff --git a/framework-network-udp/pom.xml b/framework-network-udp/pom.xml index 269d009..0b670a4 100644 --- a/framework-network-udp/pom.xml +++ b/framework-network-udp/pom.xml @@ -5,12 +5,11 @@ iotos-soft-gateway me.hekr.iotos.softgateway - 3.1.0 + 3.2.0-SNAPSHOT 4.0.0 framework-network-udp - 3.1.0 8 diff --git a/pom.xml b/pom.xml index 09a722c..1f804b4 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ me.hekr.iotos.softgateway iotos-soft-gateway - 3.1.0 + 3.2.0-SNAPSHOT ${project.groupId}:${project.artifactId} IoTOS 软网关 https://gitee.com/geekhekr/iotos-soft-gateway @@ -30,7 +30,7 @@ UTF-8 UTF-8 UTF-8 - 3.1.0 + 3.2.0-SNAPSHOT -- Gitee From b7b971e3988cd6c5f98321063cb7a8e49958d324 Mon Sep 17 00:00:00 2001 From: sdvdxl Date: Tue, 18 May 2021 17:09:27 +0800 Subject: [PATCH 09/14] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sdvdxl --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index c4a7c7c..71567c4 100644 --- a/README.md +++ b/README.md @@ -179,6 +179,8 @@ snapshot 版本 需要添加仓库: ``` +最新版本: 3.2.0-SNAPSHOT + 示例 demo 可以参考 [iotos-soft-gateway-demo](https://gitee.com/geekhekr/iotos-soft-gateway-demo) 项目。 ### 发布 -- Gitee From df6b8d7c3dea50822bbf06fba4aa80cb48582103 Mon Sep 17 00:00:00 2001 From: sdvdxl Date: Wed, 19 May 2021 10:20:23 +0800 Subject: [PATCH 10/14] =?UTF-8?q?fix=20iot=20config=EF=BC=8C=20=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E6=9C=8D=E5=8A=A1=E8=BF=9E=E6=8E=A5=E9=87=8D=E8=BF=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sdvdxl --- .../hekr/iotos/softgateway/core/config/IotOsConfig.java | 4 +++- .../network/common/client/AbstractClient.java | 9 ++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/framework-core/src/main/java/me/hekr/iotos/softgateway/core/config/IotOsConfig.java b/framework-core/src/main/java/me/hekr/iotos/softgateway/core/config/IotOsConfig.java index 8f345c2..5eae7a6 100644 --- a/framework-core/src/main/java/me/hekr/iotos/softgateway/core/config/IotOsConfig.java +++ b/framework-core/src/main/java/me/hekr/iotos/softgateway/core/config/IotOsConfig.java @@ -17,10 +17,12 @@ public class IotOsConfig { @Getter private MqttConfig mqttConfig; @Getter private GatewayConfig gatewayConfig; + /** mqtt 连接地址 */ @Value("${connect.mqtt.endpoint}") private String endpoint; - @Value("${connect.mqtt.connectionTimeout}") + /** mqtt 连接超时时间 秒 */ + @Value("${connect.mqtt.connectionTimeout:10}") private int connectionTimeout; @Value("${connect.mqtt.keepAliveTime}") diff --git a/framework-network-common/src/main/java/me/hekr/iotos/softgateway/network/common/client/AbstractClient.java b/framework-network-common/src/main/java/me/hekr/iotos/softgateway/network/common/client/AbstractClient.java index 7d93230..4313996 100644 --- a/framework-network-common/src/main/java/me/hekr/iotos/softgateway/network/common/client/AbstractClient.java +++ b/framework-network-common/src/main/java/me/hekr/iotos/softgateway/network/common/client/AbstractClient.java @@ -14,6 +14,7 @@ import io.netty.channel.socket.DatagramChannel; import io.netty.handler.logging.LoggingHandler; import java.net.InetSocketAddress; import java.util.Objects; +import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import lombok.Getter; import lombok.Setter; @@ -71,6 +72,7 @@ public abstract class AbstractClient { protected void init() {} public void close() { + log.info("准备关闭服务 " + this.getClass().getName()); try { preDestroy(); } catch (Exception e) { @@ -78,7 +80,8 @@ public abstract class AbstractClient { } if (eventLoop != null) { try { - eventLoop.shutdownGracefully().syncUninterruptibly(); + log.info("关闭 eventLoop"); + eventLoop.shutdownGracefully(0, 10, TimeUnit.SECONDS); log.info(" 成功关闭 client"); } catch (Exception e) { log.error(e.getMessage(), e); @@ -216,6 +219,10 @@ public abstract class AbstractClient { /** 直到连接成功 */ protected void loopConnect() { + if (eventLoop.isShuttingDown() || eventLoop.isShutdown() || eventLoop.isTerminated()) { + log.error("服务关闭,不能重连"); + return; + } while (true) { try { connect(); -- Gitee From 136faac92f279810adba5e3781ceb4804427fb93 Mon Sep 17 00:00:00 2001 From: sdvdxl Date: Wed, 19 May 2021 10:41:32 +0800 Subject: [PATCH 11/14] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=B8=BA=203.2.1-SNAPSHOT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sdvdxl --- deploy.sh | 2 +- example/pom.xml | 2 +- framework-common-utils/pom.xml | 2 +- framework-core/pom.xml | 2 +- framework-network-common/pom.xml | 2 +- framework-network-http/pom.xml | 2 +- framework-network-mqtt/pom.xml | 4 ++-- framework-network-tcp/pom.xml | 2 +- framework-network-udp/pom.xml | 2 +- pom.xml | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/deploy.sh b/deploy.sh index 113480b..85cc8b8 100755 --- a/deploy.sh +++ b/deploy.sh @@ -3,7 +3,7 @@ # ./deploy deploy 生成 maven jar包 # ./deploy upload 生成 maven jar 包并 commit -VERSION="3.2.0-SNAPSHOT" +VERSION="3.2.1-SNAPSHOT" echo "版本号:$VERSION" updateVersion(){ diff --git a/example/pom.xml b/example/pom.xml index 28ede44..fc1a3aa 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -5,7 +5,7 @@ iotos-soft-gateway me.hekr.iotos.softgateway - 3.2.0-SNAPSHOT + 3.2.1-SNAPSHOT 8 diff --git a/framework-common-utils/pom.xml b/framework-common-utils/pom.xml index 3bae32a..4e790bb 100644 --- a/framework-common-utils/pom.xml +++ b/framework-common-utils/pom.xml @@ -5,7 +5,7 @@ iotos-soft-gateway me.hekr.iotos.softgateway - 3.2.0-SNAPSHOT + 3.2.1-SNAPSHOT 4.0.0 diff --git a/framework-core/pom.xml b/framework-core/pom.xml index fa92ee8..699b48a 100644 --- a/framework-core/pom.xml +++ b/framework-core/pom.xml @@ -5,7 +5,7 @@ iotos-soft-gateway me.hekr.iotos.softgateway - 3.2.0-SNAPSHOT + 3.2.1-SNAPSHOT 4.0.0 jar diff --git a/framework-network-common/pom.xml b/framework-network-common/pom.xml index af4e865..b9280d0 100644 --- a/framework-network-common/pom.xml +++ b/framework-network-common/pom.xml @@ -5,7 +5,7 @@ iotos-soft-gateway me.hekr.iotos.softgateway - 3.2.0-SNAPSHOT + 3.2.1-SNAPSHOT 4.0.0 diff --git a/framework-network-http/pom.xml b/framework-network-http/pom.xml index 5aa4653..a4c43d8 100644 --- a/framework-network-http/pom.xml +++ b/framework-network-http/pom.xml @@ -5,7 +5,7 @@ iotos-soft-gateway me.hekr.iotos.softgateway - 3.2.0-SNAPSHOT + 3.2.1-SNAPSHOT 4.0.0 framework-network-http diff --git a/framework-network-mqtt/pom.xml b/framework-network-mqtt/pom.xml index 209e7c3..25abf8a 100644 --- a/framework-network-mqtt/pom.xml +++ b/framework-network-mqtt/pom.xml @@ -5,7 +5,7 @@ iotos-soft-gateway me.hekr.iotos.softgateway - 3.2.0-SNAPSHOT + 3.2.1-SNAPSHOT 4.0.0 @@ -25,7 +25,7 @@ me.hekr.iotos.softgateway framework-network-common - 3.2.0-SNAPSHOT + 3.2.1-SNAPSHOT \ No newline at end of file diff --git a/framework-network-tcp/pom.xml b/framework-network-tcp/pom.xml index d504866..8d546fb 100644 --- a/framework-network-tcp/pom.xml +++ b/framework-network-tcp/pom.xml @@ -5,7 +5,7 @@ iotos-soft-gateway me.hekr.iotos.softgateway - 3.2.0-SNAPSHOT + 3.2.1-SNAPSHOT 4.0.0 diff --git a/framework-network-udp/pom.xml b/framework-network-udp/pom.xml index 0b670a4..fbe6af6 100644 --- a/framework-network-udp/pom.xml +++ b/framework-network-udp/pom.xml @@ -5,7 +5,7 @@ iotos-soft-gateway me.hekr.iotos.softgateway - 3.2.0-SNAPSHOT + 3.2.1-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index 1f804b4..7c72475 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ me.hekr.iotos.softgateway iotos-soft-gateway - 3.2.0-SNAPSHOT + 3.2.1-SNAPSHOT ${project.groupId}:${project.artifactId} IoTOS 软网关 https://gitee.com/geekhekr/iotos-soft-gateway -- Gitee From 249c0d939b0f2449c98645c89a249c7ef0dbfc75 Mon Sep 17 00:00:00 2001 From: sdvdxl Date: Wed, 19 May 2021 10:48:17 +0800 Subject: [PATCH 12/14] DEFAULT_SCHEDULED Signed-off-by: sdvdxl --- .../me/hekr/iotos/softgateway/common/utils/ThreadPoolUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework-common-utils/src/main/java/me/hekr/iotos/softgateway/common/utils/ThreadPoolUtil.java b/framework-common-utils/src/main/java/me/hekr/iotos/softgateway/common/utils/ThreadPoolUtil.java index be67393..8274391 100644 --- a/framework-common-utils/src/main/java/me/hekr/iotos/softgateway/common/utils/ThreadPoolUtil.java +++ b/framework-common-utils/src/main/java/me/hekr/iotos/softgateway/common/utils/ThreadPoolUtil.java @@ -32,7 +32,7 @@ public class ThreadPoolUtil implements Closeable { public static final ScheduledExecutorService DEFAULT_SCHEDULED = (ScheduledExecutorService) new Builder() - .setPrefix("spring-schedule") + .setPrefix("default-scheduled") .setCore(CORES * 4) .setMax(32) .setQueueSize(1000) -- Gitee From 0e03a23857edc5aa1d509c504c25585c89d1ceec Mon Sep 17 00:00:00 2001 From: sdvdxl Date: Wed, 19 May 2021 12:00:50 +0800 Subject: [PATCH 13/14] =?UTF-8?q?add=20doc=E5=9C=B0=E5=9D=80=EF=BC=9B=20lo?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: sdvdxl --- README.md | 2 ++ .../softgateway/core/config/IotOsConfig.java | 4 ++++ .../core/network/mqtt/MqttService.java | 21 ++++++++++++++++++- .../common/client/ClientMessageHandler.java | 6 +++++- pom.xml | 2 +- 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 71567c4..36e152f 100644 --- a/README.md +++ b/README.md @@ -158,6 +158,8 @@ DeviceRemoteConfig 类做了设备映射关系;该关系是通过服务启动 SDK 已经发布到 maven 仓库中,https://mvnrepository.com/artifact/me.hekr.iotos.softgateway +[API 文档](https://apidoc.gitee.com/geekhekr/iotos-soft-gateway/) + 添加必须依赖: ```xml diff --git a/framework-core/src/main/java/me/hekr/iotos/softgateway/core/config/IotOsConfig.java b/framework-core/src/main/java/me/hekr/iotos/softgateway/core/config/IotOsConfig.java index 5eae7a6..2514073 100644 --- a/framework-core/src/main/java/me/hekr/iotos/softgateway/core/config/IotOsConfig.java +++ b/framework-core/src/main/java/me/hekr/iotos/softgateway/core/config/IotOsConfig.java @@ -28,6 +28,10 @@ public class IotOsConfig { @Value("${connect.mqtt.keepAliveTime}") private int keepAliveTime; + @Value("${connect.mqtt.klink.queue.size:10}") + @Getter + private int klinkQueueSize; + @Value("${gateway.pk}") private String gatewayPk; diff --git a/framework-core/src/main/java/me/hekr/iotos/softgateway/core/network/mqtt/MqttService.java b/framework-core/src/main/java/me/hekr/iotos/softgateway/core/network/mqtt/MqttService.java index 8ac2ec3..347a749 100644 --- a/framework-core/src/main/java/me/hekr/iotos/softgateway/core/network/mqtt/MqttService.java +++ b/framework-core/src/main/java/me/hekr/iotos/softgateway/core/network/mqtt/MqttService.java @@ -11,6 +11,8 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import me.hekr.iotos.softgateway.common.utils.JsonUtil; +import me.hekr.iotos.softgateway.common.utils.ThreadPoolUtil; import me.hekr.iotos.softgateway.core.config.DeviceRemoteConfig; import me.hekr.iotos.softgateway.core.config.IotOsConfig; import me.hekr.iotos.softgateway.core.config.MqttConfig; @@ -18,7 +20,6 @@ import me.hekr.iotos.softgateway.core.klink.DevLogin; import me.hekr.iotos.softgateway.core.klink.DevLogout; import me.hekr.iotos.softgateway.core.klink.KlinkDev; import me.hekr.iotos.softgateway.core.listener.MqttConnectedListener; -import me.hekr.iotos.softgateway.common.utils.JsonUtil; import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.eclipse.paho.client.mqttv3.MqttException; @@ -52,6 +53,20 @@ public class MqttService { this.iotOsConfig = iotOsConfig; initConfig(iotOsConfig); publishExecutor.execute(this::startPublishTask); + ThreadPoolUtil.DEFAULT_SCHEDULED.scheduleAtFixedRate( + () -> { + int size = queue.size(); + if (log.isDebugEnabled()) { + log.debug("klink 队列还有 {} 个", size); + } + + if (size > iotOsConfig.getKlinkQueueSize()) { + log.warn("Klink 队列未及时消费,还有: {} 个记录", size); + } + }, + 0, + 3, + TimeUnit.SECONDS); } private void initConfig(IotOsConfig iotOsConfig) throws MqttException { @@ -137,6 +152,10 @@ public class MqttService { /** @param klink 消息,发送的时候会被 toJson */ @SneakyThrows public void publish(KlinkDev klink) { + if (log.isDebugEnabled()) { + log.debug("发送 klink: {}", JsonUtil.toJson(klink)); + } + String pk = klink.getPk(); String devId = klink.getDevId(); Optional byPkAndDevId = DeviceRemoteConfig.getByPkAndDevId(pk, devId); diff --git a/framework-network-common/src/main/java/me/hekr/iotos/softgateway/network/common/client/ClientMessageHandler.java b/framework-network-common/src/main/java/me/hekr/iotos/softgateway/network/common/client/ClientMessageHandler.java index db6b78e..80897a6 100644 --- a/framework-network-common/src/main/java/me/hekr/iotos/softgateway/network/common/client/ClientMessageHandler.java +++ b/framework-network-common/src/main/java/me/hekr/iotos/softgateway/network/common/client/ClientMessageHandler.java @@ -8,8 +8,8 @@ import java.net.InetSocketAddress; import lombok.extern.slf4j.Slf4j; import me.hekr.iotos.softgateway.network.common.CloseReason; import me.hekr.iotos.softgateway.network.common.InternalPacket; -import me.hekr.iotos.softgateway.network.common.listener.MessageListener; import me.hekr.iotos.softgateway.network.common.PacketContext; +import me.hekr.iotos.softgateway.network.common.listener.MessageListener; /** @author iotos */ @Sharable @@ -35,6 +35,10 @@ public class ClientMessageHandler extends SimpleChannelInboundHandler packet) { + if (log.isDebugEnabled()) { + log.debug("收到消息:{}", packet); + } + // 如果不是同步,调用消息回调接口 if (!sync) { messageListener.onMessage(PacketContext.wrap(packet.getAddress(), packet.getMessage())); diff --git a/pom.xml b/pom.xml index 7c72475..75b9966 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ UTF-8 UTF-8 UTF-8 - 3.2.0-SNAPSHOT + 3.2.1-SNAPSHOT -- Gitee From 20be20aa1a5423a3a9c5d53ce61e65a48efddc64 Mon Sep 17 00:00:00 2001 From: sdvdxl Date: Wed, 19 May 2021 14:05:29 +0800 Subject: [PATCH 14/14] 3.2.1-SNAPSHOT --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 36e152f..b411281 100644 --- a/README.md +++ b/README.md @@ -181,7 +181,7 @@ snapshot 版本 需要添加仓库: ``` -最新版本: 3.2.0-SNAPSHOT +最新版本: 3.2.1-SNAPSHOT 示例 demo 可以参考 [iotos-soft-gateway-demo](https://gitee.com/geekhekr/iotos-soft-gateway-demo) 项目。 -- Gitee