From 610cc08d565e8584b9916228fe77e90553b4a6a4 Mon Sep 17 00:00:00 2001 From: huzekang <1040080742@qq.com> Date: Mon, 17 Jun 2019 12:04:09 +0800 Subject: [PATCH] =?UTF-8?q?add:=201.=E5=8A=A0=E5=85=A5=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20change:=201.job=E5=90=AF=E5=8A=A8=E6=94=B9?= =?UTF-8?q?=E6=88=90=E5=BC=82=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++ core/pom.xml | 8 ++ .../java/com/alibaba/datax/core/Engine.java | 68 +--------------- datax-web/pom.xml | 5 ++ .../com/wugui/dataxweb/config/WebConfig.java | 24 ++++++ .../dataxweb/controller/JobController.java | 14 +++- .../dataxweb/service/IDataxJobService.java | 16 ++++ .../service/impl/IDataxJobServiceImpl.java | 76 ++++++++++++++++++ .../src/main/resources/static/favicon.ico | Bin 0 -> 67646 bytes .../src/main/resources/static/index.html | 1 + 10 files changed, 148 insertions(+), 70 deletions(-) create mode 100644 datax-web/src/main/java/com/wugui/dataxweb/config/WebConfig.java create mode 100644 datax-web/src/main/java/com/wugui/dataxweb/service/IDataxJobService.java create mode 100644 datax-web/src/main/java/com/wugui/dataxweb/service/impl/IDataxJobServiceImpl.java create mode 100644 datax-web/src/main/resources/static/favicon.ico create mode 100644 datax-web/src/main/resources/static/index.html diff --git a/README.md b/README.md index 7aba96fc..d844e2e8 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,8 @@ * [ ] 实现部分写插件支持自动建表功能 +## 前端项目 +https://github.com/zhouhongfa/datax-vue-admin.git ## how to run ### 1. 在父工程目录下使用maven打包 ``` @@ -47,3 +49,7 @@ curl http://localhost:8080/startJob ``` 可以看到成功跑完一个datax作业 ![](https://raw.githubusercontent.com/peter1040080742/picbed/master/20190505162333.png) + +### 5. 打开网页端启动作业 +http://localhost:8080/index.html#/datax/job +![](https://raw.githubusercontent.com/huzekang/picbed/master/20190617120207.png) \ No newline at end of file diff --git a/core/pom.xml b/core/pom.xml index bc0d1c9b..8b1bbfd7 100755 --- a/core/pom.xml +++ b/core/pom.xml @@ -155,6 +155,14 @@ ${project-sourceEncoding} + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + diff --git a/core/src/main/java/com/alibaba/datax/core/Engine.java b/core/src/main/java/com/alibaba/datax/core/Engine.java index 9ffed620..509f7db4 100755 --- a/core/src/main/java/com/alibaba/datax/core/Engine.java +++ b/core/src/main/java/com/alibaba/datax/core/Engine.java @@ -1,6 +1,5 @@ package com.alibaba.datax.core; -import cn.hutool.core.io.FileUtil; import com.alibaba.datax.common.element.ColumnCast; import com.alibaba.datax.common.exception.DataXException; import com.alibaba.datax.common.spi.ErrorCode; @@ -19,10 +18,6 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.PrintWriter; -import java.io.UnsupportedEncodingException; import java.util.Arrays; import java.util.List; import java.util.Set; @@ -33,6 +28,8 @@ import java.util.regex.Pattern; * Engine是DataX入口类,该类负责初始化Job或者Task的运行容器,并运行插件的Job或者Task逻辑 */ public class Engine { + + private static final Logger LOG = LoggerFactory.getLogger(Engine.class); private static String RUNTIME_MODE; @@ -225,70 +222,9 @@ public class Engine { System.exit(exitCode); } - /** - * 测试使用springboot启动作业job - * - * @author: huzekang - * @Date: 2019-05-05 - */ - public static void testStartJob(String jobPath) { - try { - Engine.entry(jobPath); - } catch (Throwable e) { - LOG.error("\n\n经DataX智能分析,该任务最可能的错误原因是:\n" + ExceptionTracker.trace(e)); - - if (e instanceof DataXException) { - DataXException tempException = (DataXException) e; - ErrorCode errorCode = tempException.getErrorCode(); - if (errorCode instanceof FrameworkErrorCode) { - FrameworkErrorCode tempErrorCode = (FrameworkErrorCode) errorCode; - } - } - - } - } - - // todo 都是用同一个文件,是否需要考虑线程安全问题 - // 需要做成异步的,否则前端会一直loading等待完成作业 - public static void startJobByJsonStr(String jobJson) { - final String tmpFilePath = "jobTmp-"+System.currentTimeMillis()+".conf"; - // 根据json写入到临时本地文件 - PrintWriter writer = null; - try { - writer = new PrintWriter(tmpFilePath, "UTF-8"); - writer.println(jobJson); - - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } finally { - if (writer != null) { - writer.close(); - } - } - - // 使用临时本地文件启动datax作业 - try { - Engine.entry(tmpFilePath); - } catch (Throwable e) { - LOG.error("\n\n经DataX智能分析,该任务最可能的错误原因是:\n" + ExceptionTracker.trace(e)); - - if (e instanceof DataXException) { - DataXException tempException = (DataXException) e; - ErrorCode errorCode = tempException.getErrorCode(); - if (errorCode instanceof FrameworkErrorCode) { - FrameworkErrorCode tempErrorCode = (FrameworkErrorCode) errorCode; - } - } - - } - //删除临时文件 - FileUtil.del(new File(tmpFilePath)); - } } diff --git a/datax-web/pom.xml b/datax-web/pom.xml index f5a25b01..5af9a88a 100644 --- a/datax-web/pom.xml +++ b/datax-web/pom.xml @@ -44,6 +44,11 @@ mybatis-plus ${mybatisplus.version} + + com.google.guava + guava + 27.0.1-jre + io.springfox diff --git a/datax-web/src/main/java/com/wugui/dataxweb/config/WebConfig.java b/datax-web/src/main/java/com/wugui/dataxweb/config/WebConfig.java new file mode 100644 index 00000000..f19bfec8 --- /dev/null +++ b/datax-web/src/main/java/com/wugui/dataxweb/config/WebConfig.java @@ -0,0 +1,24 @@ +package com.wugui.dataxweb.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * 前端静态资源访问 + * + * @program: datax-all + * @author: huzekang + * @create: 2019-06-17 10:40 + **/ +@Configuration + +public class WebConfig implements WebMvcConfigurer { + + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/index.html").addResourceLocations("classpath:/static/index.html"); + registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/static/"); + } +} diff --git a/datax-web/src/main/java/com/wugui/dataxweb/controller/JobController.java b/datax-web/src/main/java/com/wugui/dataxweb/controller/JobController.java index 5dc6a7ce..fe28015a 100644 --- a/datax-web/src/main/java/com/wugui/dataxweb/controller/JobController.java +++ b/datax-web/src/main/java/com/wugui/dataxweb/controller/JobController.java @@ -1,8 +1,11 @@ package com.wugui.dataxweb.controller; import com.alibaba.datax.core.Engine; +import com.baomidou.mybatisplus.extension.api.R; +import com.wugui.dataxweb.service.IDataxJobService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; /** @@ -16,11 +19,14 @@ import org.springframework.web.bind.annotation.*; @Api(tags = "datax作业接口") public class JobController { + @Autowired + IDataxJobService iDataxJobService; + @GetMapping("/testStartJob") public void testStartJob() { // 指定获取作业配置json的接口,此处用下面mock出来的接口提供 String jobPath = "http://localhost:8080/mock_stream2stream"; - Engine.testStartJob(jobPath); + iDataxJobService.startJobByJsonStr(jobPath); } @GetMapping("/mock_oracle2mongodb") @@ -125,9 +131,9 @@ public class JobController { */ @ApiOperation("通过传入json配置启动一个datax作业") @PostMapping("/runJob") - public String runJob(@RequestBody String jobJson) { - Engine.startJobByJsonStr(jobJson); - return "success"; + public R runJob(@RequestBody String jobJson) { + String result = iDataxJobService.startJobByJsonStr(jobJson); + return R.ok(result); } diff --git a/datax-web/src/main/java/com/wugui/dataxweb/service/IDataxJobService.java b/datax-web/src/main/java/com/wugui/dataxweb/service/IDataxJobService.java new file mode 100644 index 00000000..ac5acd93 --- /dev/null +++ b/datax-web/src/main/java/com/wugui/dataxweb/service/IDataxJobService.java @@ -0,0 +1,16 @@ +package com.wugui.dataxweb.service; + +/** + * @program: datax-all + * @author: huzekang + * @create: 2019-06-17 11:25 + **/ +public interface IDataxJobService { + /** + * 根据json字符串用线程池启动一个datax作业 + * + * @author: huzekang + * @Date: 2019-06-17 + */ + String startJobByJsonStr(String jobJson); +} diff --git a/datax-web/src/main/java/com/wugui/dataxweb/service/impl/IDataxJobServiceImpl.java b/datax-web/src/main/java/com/wugui/dataxweb/service/impl/IDataxJobServiceImpl.java new file mode 100644 index 00000000..095d1752 --- /dev/null +++ b/datax-web/src/main/java/com/wugui/dataxweb/service/impl/IDataxJobServiceImpl.java @@ -0,0 +1,76 @@ +package com.wugui.dataxweb.service.impl; + +import cn.hutool.core.io.FileUtil; +import com.alibaba.datax.common.exception.DataXException; +import com.alibaba.datax.common.spi.ErrorCode; +import com.alibaba.datax.core.Engine; +import com.alibaba.datax.core.util.ExceptionTracker; +import com.alibaba.datax.core.util.FrameworkErrorCode; +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.wugui.dataxweb.service.IDataxJobService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; +import java.util.concurrent.*; + +/** + * @program: datax-all + * @author: huzekang + * @create: 2019-06-17 11:26 + **/ +@Slf4j +@Service +public class IDataxJobServiceImpl implements IDataxJobService { + private ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("datax-job-%d").build(); + + private ExecutorService jobPool = new ThreadPoolExecutor(5, 200, 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy()); + + + @Override + public String startJobByJsonStr(String jobJson) { + + jobPool.submit(() -> { + + final String tmpFilePath = "jobTmp-" + System.currentTimeMillis() + ".conf"; + // 根据json写入到临时本地文件 + PrintWriter writer = null; + try { + writer = new PrintWriter(tmpFilePath, "UTF-8"); + writer.println(jobJson); + + } catch (FileNotFoundException | UnsupportedEncodingException e) { + e.printStackTrace(); + } finally { + if (writer != null) { + writer.close(); + } + } + + try { + // 使用临时本地文件启动datax作业 + Engine.entry(tmpFilePath); + // 删除临时文件 + FileUtil.del(new File(tmpFilePath)); + } catch (Throwable e) { + log.error("\n\n经DataX智能分析,该任务最可能的错误原因是:\n" + ExceptionTracker.trace(e)); + + if (e instanceof DataXException) { + DataXException tempException = (DataXException) e; + ErrorCode errorCode = tempException.getErrorCode(); + if (errorCode instanceof FrameworkErrorCode) { + FrameworkErrorCode tempErrorCode = (FrameworkErrorCode) errorCode; + } + } + + } + }); + + return "success"; + } + +} diff --git a/datax-web/src/main/resources/static/favicon.ico b/datax-web/src/main/resources/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..34b63ac63a87ee3ea8e7a0f3f5b5406c437e2112 GIT binary patch literal 67646 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 X;@D+E7Ad=S_FbjlW&KY_+xPzm3MBT? literal 0 HcmV?d00001 diff --git a/datax-web/src/main/resources/static/index.html b/datax-web/src/main/resources/static/index.html new file mode 100644 index 00000000..ffa490f3 --- /dev/null +++ b/datax-web/src/main/resources/static/index.html @@ -0,0 +1 @@ +datax管理
\ No newline at end of file