From 1af361444d2a1cfc6c3b0cac64683882fec66f7a Mon Sep 17 00:00:00 2001 From: tjq Date: Sun, 31 Jan 2021 18:44:40 +0800 Subject: [PATCH] feat: offical HttpProcessor --- powerjob-offical-processors/pom.xml | 103 +++++++++++++++ .../processors/CommonBasicProcessor.java | 46 +++++++ .../processors/impl/HttpProcessor.java | 121 ++++++++++++++++++ .../offical/processors/TestUtils.java | 30 +++++ .../processors/impl/HttpProcessorTest.java | 38 ++++++ 5 files changed, 338 insertions(+) create mode 100644 powerjob-offical-processors/src/main/java/tech/powerjob/offical/processors/CommonBasicProcessor.java create mode 100644 powerjob-offical-processors/src/main/java/tech/powerjob/offical/processors/impl/HttpProcessor.java create mode 100644 powerjob-offical-processors/src/test/java/tech/powerjob/offical/processors/TestUtils.java create mode 100644 powerjob-offical-processors/src/test/java/tech/powerjob/offical/processors/impl/HttpProcessorTest.java diff --git a/powerjob-offical-processors/pom.xml b/powerjob-offical-processors/pom.xml index ebcfa1b9..7598c137 100644 --- a/powerjob-offical-processors/pom.xml +++ b/powerjob-offical-processors/pom.xml @@ -13,5 +13,108 @@ 3.4.5 jar + + + 3.2.4 + + + 5.6.1 + 1.2.3 + 3.4.4 + + + 1.2.68 + 3.14.9 + 29.0-jre + 3.10 + + + + + + + com.alibaba + fastjson + ${fastjson.version} + + + + + com.squareup.okhttp3 + okhttp + ${okhttp.version} + + + + org.apache.commons + commons-lang3 + ${commons.lang.version} + + + + + com.google.guava + guava + ${guava.version} + + + + com.github.kfcfans + powerjob-worker + ${powerjob.worker.version} + provided + + + + + org.junit.jupiter + junit-jupiter-api + ${junit.version} + test + + + + + + + org.apache.maven.plugins + maven-shade-plugin + ${mvn.shade.plugin.version} + + false + + + okhttp3 + shade.powerjob.okhttp3 + + + okio + shade.powerjob.okio + + + com + shade.powerjob.com + + + org + shade.powerjob.org + + + javax + shade.powerjob.javax + + + + + + package + + shade + + + + + + \ No newline at end of file diff --git a/powerjob-offical-processors/src/main/java/tech/powerjob/offical/processors/CommonBasicProcessor.java b/powerjob-offical-processors/src/main/java/tech/powerjob/offical/processors/CommonBasicProcessor.java new file mode 100644 index 00000000..72d06441 --- /dev/null +++ b/powerjob-offical-processors/src/main/java/tech/powerjob/offical/processors/CommonBasicProcessor.java @@ -0,0 +1,46 @@ +package tech.powerjob.offical.processors; + +import com.github.kfcfans.powerjob.worker.core.processor.ProcessResult; +import com.github.kfcfans.powerjob.worker.core.processor.TaskContext; +import com.github.kfcfans.powerjob.worker.core.processor.sdk.BasicProcessor; +import com.github.kfcfans.powerjob.worker.log.OmsLogger; +import com.google.common.base.Stopwatch; +import org.apache.commons.lang3.exception.ExceptionUtils; + +/** + * CommonBasicProcessor + * + * @author tjq + * @since 2021/1/30 + */ +public abstract class CommonBasicProcessor implements BasicProcessor { + + @Override + public ProcessResult process(TaskContext taskContext) throws Exception { + + String clzName = this.getClass().getSimpleName(); + OmsLogger omsLogger = taskContext.getOmsLogger(); + omsLogger.info("[{}] using params: {}", clzName, taskContext.getJobParams()); + + try { + Stopwatch sw = Stopwatch.createStarted(); + ProcessResult result = process0(taskContext); + omsLogger.info("[{}] execute succeed, using {}, result: {}", clzName, sw, result); + return suit(result); + } catch (Throwable t) { + omsLogger.error("[{}] execute failed!", clzName, t); + return new ProcessResult(false, ExceptionUtils.getMessage(t)); + } + } + + private static ProcessResult suit(ProcessResult processResult) { + if (processResult.getMsg() == null || processResult.getMsg().length() < 1024) { + return processResult; + } + processResult.setMsg(processResult.getMsg().substring(0, 1024) + "..."); + return processResult; + } + + protected abstract ProcessResult process0(TaskContext taskContext) throws Exception; +} + diff --git a/powerjob-offical-processors/src/main/java/tech/powerjob/offical/processors/impl/HttpProcessor.java b/powerjob-offical-processors/src/main/java/tech/powerjob/offical/processors/impl/HttpProcessor.java new file mode 100644 index 00000000..9211c674 --- /dev/null +++ b/powerjob-offical-processors/src/main/java/tech/powerjob/offical/processors/impl/HttpProcessor.java @@ -0,0 +1,121 @@ +package tech.powerjob.offical.processors.impl; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONValidator; +import com.github.kfcfans.powerjob.worker.core.processor.ProcessResult; +import com.github.kfcfans.powerjob.worker.core.processor.TaskContext; +import com.github.kfcfans.powerjob.worker.log.OmsLogger; +import lombok.Data; +import okhttp3.*; +import org.apache.commons.lang3.StringUtils; +import tech.powerjob.offical.processors.CommonBasicProcessor; + +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * common http processor + * + * @author tjq + * @since 2021/1/30 + */ +public class HttpProcessor extends CommonBasicProcessor { + + private static final OkHttpClient client; + + static { + client = new OkHttpClient.Builder() + .connectTimeout(10, TimeUnit.SECONDS) + .readTimeout(60, TimeUnit.SECONDS) + .build(); + } + + @Override + public ProcessResult process0(TaskContext taskContext) throws Exception { + OmsLogger omsLogger = taskContext.getOmsLogger(); + HttpParams httpParams = JSONObject.parseObject(taskContext.getJobParams(), HttpParams.class); + + if (StringUtils.isEmpty(httpParams.url)) { + return new ProcessResult(false, "url can't be empty!"); + } + + if (!httpParams.url.startsWith("http")) { + httpParams.url = "http://" + httpParams.url; + } + omsLogger.info("[HttpProcessor] request url: {}", httpParams.url); + + // set default method + if (StringUtils.isEmpty(httpParams.method)) { + httpParams.method = "GET"; + omsLogger.info("[HttpProcessor] using default request method: GET"); + } else { + omsLogger.info("[HttpProcessor] request method: {}", httpParams.method); + } + + // set default mediaType + if (!"GET".equals(httpParams.method) && StringUtils.isEmpty(httpParams.mediaType)) { + if (JSONValidator.from(httpParams.body).validate()) { + httpParams.mediaType = "application/json"; + omsLogger.warn("[HttpProcessor] try to use 'application/json' as media type"); + } + } + + Request.Builder builder = new Request.Builder().url(httpParams.url); + if (httpParams.headers != null) { + httpParams.headers.forEach((k, v) -> { + builder.addHeader(k, v); + omsLogger.info("[HttpProcessor] add header {}:{}", k, v); + }); + } + + switch (httpParams.method) { + case "PUT": + case "DELETE": + case "POST": + MediaType mediaType = MediaType.parse(httpParams.mediaType); + omsLogger.info("[HttpProcessor] mediaType: {}", mediaType); + RequestBody requestBody = RequestBody.create(mediaType, httpParams.body); + builder.method(httpParams.method, requestBody); + break; + default: + builder.get(); + } + + Response response = client.newCall(builder.build()).execute(); + omsLogger.info("[HttpProcessor] response: {}", response); + + String msgBody = ""; + if (response.body() != null) { + msgBody = response.body().string(); + } + + String res = String.format("code:%d,body:%s", response.code(), msgBody); + omsLogger.info("[HttpProcessor] process result: {}", res); + + return new ProcessResult(true, res); + } + + @Data + public static class HttpParams { + /** + * POST / GET / PUT / DELETE + */ + private String method; + /** + * the request url + */ + private String url; + /** + * application/json + * application/xml + * image/png + * image/jpeg + * image/gif + */ + private String mediaType; + + private String body; + + private Map headers; + } +} diff --git a/powerjob-offical-processors/src/test/java/tech/powerjob/offical/processors/TestUtils.java b/powerjob-offical-processors/src/test/java/tech/powerjob/offical/processors/TestUtils.java new file mode 100644 index 00000000..bd24a449 --- /dev/null +++ b/powerjob-offical-processors/src/test/java/tech/powerjob/offical/processors/TestUtils.java @@ -0,0 +1,30 @@ +package tech.powerjob.offical.processors; + +import com.github.kfcfans.powerjob.worker.core.processor.TaskContext; +import com.github.kfcfans.powerjob.worker.log.impl.OmsServerLogger; + +import java.util.concurrent.ThreadLocalRandom; + +/** + * TestUtils + * + * @author tjq + * @since 2021/1/30 + */ +public class TestUtils { + + public static TaskContext genTaskContext(String jobParams) { + + long jobId = ThreadLocalRandom.current().nextLong(); + + TaskContext taskContext = new TaskContext(); + taskContext.setJobId(jobId); + taskContext.setInstanceId(jobId); + taskContext.setJobParams(jobParams); + taskContext.setTaskId("0.0"); + taskContext.setTaskName("TEST_TASK"); + taskContext.setOmsLogger(new OmsServerLogger(jobId)); + + return taskContext; + } +} diff --git a/powerjob-offical-processors/src/test/java/tech/powerjob/offical/processors/impl/HttpProcessorTest.java b/powerjob-offical-processors/src/test/java/tech/powerjob/offical/processors/impl/HttpProcessorTest.java new file mode 100644 index 00000000..29346d1e --- /dev/null +++ b/powerjob-offical-processors/src/test/java/tech/powerjob/offical/processors/impl/HttpProcessorTest.java @@ -0,0 +1,38 @@ +package tech.powerjob.offical.processors.impl; + +import com.alibaba.fastjson.JSONObject; +import org.junit.jupiter.api.Test; +import tech.powerjob.offical.processors.TestUtils; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * HttpProcessorTest + * + * @author tjq + * @since 2021/1/31 + */ +class HttpProcessorTest { + + @Test + void testGet() throws Exception { + String url = "https://www.baidu.com"; + JSONObject params = new JSONObject(); + params.put("url", url); + params.put("method", "GET"); + + System.out.println(new HttpProcessor().process(TestUtils.genTaskContext(params.toJSONString()))); + } + + @Test + void testPost() throws Exception { + String url = "https://mock.uutool.cn/4f5qfgcdahj0?test=true"; + JSONObject params = new JSONObject(); + params.put("url", url); + params.put("method", "POST"); + params.put("mediaType", "application/json"); + params.put("body", params.toJSONString()); + + System.out.println(new HttpProcessor().process(TestUtils.genTaskContext(params.toJSONString()))); + } +} \ No newline at end of file