From fd6dc77ffd55cd1997d42f4463ac42d0265462d6 Mon Sep 17 00:00:00 2001 From: TcSnZh Date: Thu, 20 May 2021 21:26:09 +0800 Subject: [PATCH] =?UTF-8?q?v1.5.3=20=E4=BF=AE=E6=94=B9=E4=BA=86=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E5=B0=91=E6=95=B0=E5=86=85=E5=AE=B9=EF=BC=8C=E4=BD=86?= =?UTF-8?q?=E6=98=AF=E8=BF=98=E6=B2=A1=E5=86=99=E5=AE=8C=EF=BC=8C=E6=9C=89?= =?UTF-8?q?=E4=BA=BA=E8=A6=81=E4=B8=80=E8=B5=B7=E5=86=99=EF=BC=8C=E6=89=80?= =?UTF-8?q?=E4=BB=A5push=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- QuickStart.md | 66 +++--- .../jd/platform/async/callback/ICallback.java | 2 +- .../java/beforev14/depend/LambdaTest.java | 75 ++++++ .../src/test/java/v15/cases/Case6.java | 3 + .../async/scheduling/AsyncScheduling.java | 9 + .../DefaultSchedulingJsonParser.java | 40 ---- .../scheduling/SchedulingJsonParser.java | 24 -- .../DefaultSchedulingDrawingsParser.java | 219 ++++++++++++++++++ .../drawings/SchedulingDrawings.java | 10 + .../drawings/SchedulingDrawingsImpl.java | 16 ++ .../drawings/SchedulingDrawingsParser.java | 18 ++ .../exception/IllegalConfigException.java | 25 -- .../exception/IllegalSchedulingException.java | 25 ++ .../IllegalSchedulingPropertyException.java | 55 +++++ .../AbstractSchedulingFactory.java} | 13 +- .../DefaultSchedulingJsonModelParser.java | 33 +++ .../async/scheduling/model/ObjectModel.java | 15 +- .../model/SchedulingDrawingsModel.java | 45 ++++ .../model/SchedulingJsonModelParser.java | 23 ++ .../async/scheduling/util/ReflectUtil.java | 3 - .../test/java/schedulingtest/cases/Case1.java | 14 -- .../schedulingtest/FileStringReader.java | 6 +- .../v15/schedulingtest/cases/case1/Case1.java | 15 ++ .../schedulingtest/cases/case1}/PayTaxes.java | 9 +- .../cases/case1}/PrintParam.java | 4 +- .../cases/case1}/SelectUserByName.java | 8 +- .../schedulingtest/cases/case1}/User.java | 4 +- .../src/test/resources/case1_1.json | 61 ----- .../src/test/resources/test.json | 9 - .../src/test/resources/v15/case1_1.json | 80 +++++++ 30 files changed, 693 insertions(+), 236 deletions(-) create mode 100644 asyncTool-core/src/test/java/beforev14/depend/LambdaTest.java create mode 100644 asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/AsyncScheduling.java delete mode 100644 asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/DefaultSchedulingJsonParser.java delete mode 100644 asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/SchedulingJsonParser.java create mode 100644 asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/drawings/DefaultSchedulingDrawingsParser.java create mode 100644 asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/drawings/SchedulingDrawings.java create mode 100644 asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/drawings/SchedulingDrawingsImpl.java create mode 100644 asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/drawings/SchedulingDrawingsParser.java delete mode 100644 asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/exception/IllegalConfigException.java create mode 100644 asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/exception/IllegalSchedulingException.java create mode 100644 asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/exception/IllegalSchedulingPropertyException.java rename asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/{SchedulingFactory.java => factory/AbstractSchedulingFactory.java} (71%) create mode 100644 asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/model/DefaultSchedulingJsonModelParser.java create mode 100644 asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/model/SchedulingJsonModelParser.java delete mode 100644 asyncTool-scheduling/src/test/java/schedulingtest/cases/Case1.java rename asyncTool-scheduling/src/test/java/{ => v15}/schedulingtest/FileStringReader.java (88%) create mode 100644 asyncTool-scheduling/src/test/java/v15/schedulingtest/cases/case1/Case1.java rename asyncTool-scheduling/src/test/java/{schedulingtest/impl => v15/schedulingtest/cases/case1}/PayTaxes.java (77%) rename asyncTool-scheduling/src/test/java/{schedulingtest => v15/schedulingtest/cases/case1}/PrintParam.java (79%) rename asyncTool-scheduling/src/test/java/{schedulingtest/impl => v15/schedulingtest/cases/case1}/SelectUserByName.java (88%) rename asyncTool-scheduling/src/test/java/{schedulingtest/entity => v15/schedulingtest/cases/case1}/User.java (94%) delete mode 100644 asyncTool-scheduling/src/test/resources/case1_1.json delete mode 100644 asyncTool-scheduling/src/test/resources/test.json create mode 100644 asyncTool-scheduling/src/test/resources/v15/case1_1.json diff --git a/QuickStart.md b/QuickStart.md index a475d5a..690e952 100644 --- a/QuickStart.md +++ b/QuickStart.md @@ -1048,33 +1048,34 @@ SetNext specialToNextWrapper(DependWrapperActionStrategy strategy, WorkerW class Case6 { private static WorkerWrapperBuilder builder(String id) { return WorkerWrapper.builder() - .id(id) - .worker((param, allWrappers) -> { - System.out.println("wrapper(id=" + id + ") is working"); - try { - Thread.sleep(50); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return null; - }); + .id(id) + .worker((param, allWrappers) -> { + System.out.println("wrapper(id=" + id + ") is working"); + try { + Thread.sleep(50); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return null; + }); } public static void main(String[] args) throws ExecutionException, InterruptedException { WorkerWrapper b = builder("B") - // 这里设置了,不论a怎么样b都会快速失败。但是,a设置的对wrapper的特殊策略把它覆盖了。 - .depends((dependWrappers, thisWrapper, fromWrapper) -> - DependenceAction.FAST_FAIL - .fastFailException(ResultState.EXCEPTION, new RuntimeException("b 必定失败,除非有上游wrapper救他")) - ) - .build(); + // 这里设置了,不论a怎么样b都会快速失败。但是,a设置的对wrapper的特殊策略把它覆盖了。 + .depends((dependWrappers, thisWrapper, fromWrapper) -> + DependenceAction.FAST_FAIL + .fastFailException(ResultState.EXCEPTION, new RuntimeException("b 必定失败,除非有上游wrapper救他")) + ) + .callback(ICallback.PRINT_EXCEPTION_STACK_TRACE) + .build(); WorkerWrapper a = builder("A") - .setNext() - // a将会使b直接开始工作 - // 若是去掉这行代码,则b会失败 - .specialToNextWrapper(fromWrapper -> DependenceAction.START_WORK.emptyProperty(), b) - .wrapper(b) - .end().build(); + .setNext() + // a将会使b直接开始工作 + // 若是去掉这行代码,则b会失败 + .specialToNextWrapper(fromWrapper -> DependenceAction.START_WORK.emptyProperty(), b) + .wrapper(b) + .end().build(); Async.beginWork(1000, a); System.out.println(a.getWorkResult()); System.out.println(b.getWorkResult()); @@ -1394,9 +1395,9 @@ public interface WorkerWrapperBuilder { >```xml > > -> asyncTool-scheduling -> com.jd.platform -> 1.5.0-SNAPSHOT +> asyncTool-scheduling +> com.jd.platform +> 1.5.0-SNAPSHOT > >``` @@ -1439,14 +1440,14 @@ wrappers:[ // 而且:不能与wrappers数组中其他的对象的id属性相同。即必须保证id唯一。 // 不允许undefined,不允许null。 "id": "first", - // param,即参数。请看《param属性格式》 + // param,即参数。请看《param》 // useObjectModel代表value的值是否是“对象模型”。 - // 允许undefined,如果undefined则使用null。显然,允许null。 + // 允许undefined或null,视为{"useObjectModel": false,"value": null} "param": { "useObjectModel": false, "value": "JackMa" }, - // 传入对象模型,请看《对象模型》 + // 传入对象模型,请看《对象模型ObjectModel》 // 不允许undefined或null "worker": { "sameObjectId": 1, @@ -1457,8 +1458,9 @@ wrappers:[ "callback": { "sameObjectId": 1 }, - // wrapper依赖策略 + // wrapper策略 // 允许undefined与null。如果为两者则使用com.jd.platform.async.wrapper.strategy.WrapperStrategy.DefaultWrapperStrategy + // 即"ALL_DEPENDENCIES_ALL_SUCCESS"与"CHECK_ONE_LEVEL" "wrapperStrategy": { // 传入{}键值对,键名为即wrapper的id属性,值为对象模型。 // 允许undefined和null,两者之意与空键值对{}并无二致 @@ -1522,7 +1524,7 @@ wrappers:[ `useObjectModel`属性用于说明`value`属性的所代表的对象类型: * 为false:使用json所对应的类型。 -* 为true:使用《实现类对象规范》中的我们自定义的对象模型。 +* 为true:使用《对象模型`ObjectModel`》中的我们自定义的对象模型。 ```json { @@ -1604,8 +1606,12 @@ beginWork: { // 如果设置了该属性,其他的属性均会被忽视。(优先级低于constObjectName) "sameObjectId": 1, // 提供类的全限定名字符串,将调用无参构造方法进行初始化 + // 如果constObjectName设置了非null且非undefined值,则此值允许为null或undefined + // 如果sameObjectId设置了非null且非undefined值,则id相同的对象模型中允许且只允许一个值为非null或非undefined,其他的都必须为null或undefined "className": "your.package.name.YourKlassName", // 初始化后,会根据该值来修改对象属性 + // 允许为null或undefined,表示不额外设置属性 + "properties": { // 其中的键值对为各字段名。这些字段需要有getter、setter方法。 "myIntegerField": 123123 diff --git a/asyncTool-core/src/main/java/com/jd/platform/async/callback/ICallback.java b/asyncTool-core/src/main/java/com/jd/platform/async/callback/ICallback.java index 1087366..fe0b505 100755 --- a/asyncTool-core/src/main/java/com/jd/platform/async/callback/ICallback.java +++ b/asyncTool-core/src/main/java/com/jd/platform/async/callback/ICallback.java @@ -29,7 +29,7 @@ public interface ICallback { /** * 提供常量选项:打印异常信息,跳过时的异常{@link SkippedException}不会打印。 */ - ICallback PRINT_EXCEPTION_STACK_TRACE = new ICallback() { + ICallback PRINT_EXCEPTION_STACK_TRACE = new ICallback() { @Override public void result(boolean success, Object param, WorkResult workResult) { Exception ex = workResult.getEx(); diff --git a/asyncTool-core/src/test/java/beforev14/depend/LambdaTest.java b/asyncTool-core/src/test/java/beforev14/depend/LambdaTest.java new file mode 100644 index 0000000..7dbaeca --- /dev/null +++ b/asyncTool-core/src/test/java/beforev14/depend/LambdaTest.java @@ -0,0 +1,75 @@ +package beforev14.depend; + +import java.util.Map; + +import com.jd.platform.async.executor.Async; +import com.jd.platform.async.worker.WorkResult; +import com.jd.platform.async.wrapper.WorkerWrapper; + +/** + * @author sjsdfg + * @since 2020/6/14 + */ +@SuppressWarnings({"deprecation", "RedundantStringFormatCall"}) +class LambdaTest { + public static void main(String[] args) throws Exception { + WorkerWrapper, String> workerWrapper2 = new WorkerWrapper.Builder, String>() + .worker((WorkResult result, Map> allWrappers) -> { + System.out.println("par2的入参来自于par1: " + result.getResult()); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return result.getResult().getName(); + }) + .callback((boolean success, WorkResult param, WorkResult workResult) -> + System.out.println(String.format("thread is %s, param is %s, result is %s", Thread.currentThread().getName(), param, workResult))) + .id("third") + .build(); + + WorkerWrapper, User> workerWrapper1 = new WorkerWrapper.Builder, User>() + .worker((WorkResult result, Map> allWrappers) -> { + System.out.println("par1的入参来自于par0: " + result.getResult()); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return new User("user1"); + }) + .callback((boolean success, WorkResult param, WorkResult workResult) -> + System.out.println(String.format("thread is %s, param is %s, result is %s", Thread.currentThread().getName(), param, workResult))) + .id("second") + .next(workerWrapper2) + .build(); + + WorkerWrapper workerWrapper = new WorkerWrapper.Builder() + .worker((String object, Map> allWrappers) -> { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return new User("user0"); + }) + .param("0") + .id("first") + .next(workerWrapper1, true) + .callback((boolean success, String param, WorkResult workResult) -> + System.out.println(String.format("thread is %s, param is %s, result is %s", Thread.currentThread().getName(), param, workResult))) + .build(); + + //虽然尚未执行,但是也可以先取得结果的引用,作为下一个任务的入参。V1.2前写法,需要手工给 + //V1.3后,不用给wrapper setParam了,直接在worker的action里自行根据id获取即可.参考dependnew包下代码 + WorkResult result = workerWrapper.getWorkResult(); + WorkResult result1 = workerWrapper1.getWorkResult(); + workerWrapper1.setParam(result); + workerWrapper2.setParam(result1); + + Async.beginWork(3500, workerWrapper); + + System.out.println(workerWrapper2.getWorkResult()); + Async.shutDown(); + } +} diff --git a/asyncTool-core/src/test/java/v15/cases/Case6.java b/asyncTool-core/src/test/java/v15/cases/Case6.java index 552fecd..2368220 100644 --- a/asyncTool-core/src/test/java/v15/cases/Case6.java +++ b/asyncTool-core/src/test/java/v15/cases/Case6.java @@ -1,5 +1,6 @@ package v15.cases; +import com.jd.platform.async.callback.ICallback; import com.jd.platform.async.executor.Async; import com.jd.platform.async.worker.ResultState; import com.jd.platform.async.wrapper.WorkerWrapper; @@ -29,12 +30,14 @@ class Case6 { } public static void main(String[] args) throws ExecutionException, InterruptedException { + //noinspection unchecked WorkerWrapper b = builder("B") // 这里设置了,不论a怎么样b都会快速失败。但是,a设置的对wrapper的特殊策略把它覆盖了。 .depends((dependWrappers, thisWrapper, fromWrapper) -> DependenceAction.FAST_FAIL .fastFailException(ResultState.EXCEPTION, new RuntimeException("b 必定失败,除非有上游wrapper救他")) ) + .callback(ICallback.PRINT_EXCEPTION_STACK_TRACE) .build(); WorkerWrapper a = builder("A") .setNext() diff --git a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/AsyncScheduling.java b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/AsyncScheduling.java new file mode 100644 index 0000000..413b609 --- /dev/null +++ b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/AsyncScheduling.java @@ -0,0 +1,9 @@ +package com.jd.platform.async.scheduling; + +/** + * 入口方法类 + * + * @author tcsnzh[zh.jobs@foxmail.com] create this in 2021/5/20-上午12:05 + */ +public class AsyncScheduling { +} diff --git a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/DefaultSchedulingJsonParser.java b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/DefaultSchedulingJsonParser.java deleted file mode 100644 index 47cbbc6..0000000 --- a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/DefaultSchedulingJsonParser.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.jd.platform.async.scheduling; - -import com.jd.platform.async.scheduling.model.SchedulingDrawingsModel; - -/** - * @author create by TcSnZh on 2021/5/17-上午1:22 - */ -public class DefaultSchedulingJsonParser implements SchedulingJsonParser { - - - // ========== singleton instance ========== - - /** - * 私有构造方法,需要通过{@link #getInstance()}方法获取单例。 - */ - private DefaultSchedulingJsonParser() { - } - - /** - * 获取单例 - */ - public static DefaultSchedulingJsonParser getInstance() { - return instance; - } - - private static final DefaultSchedulingJsonParser instance = new DefaultSchedulingJsonParser(); - - // ========== public methods ========== - - @Override - public SchedulingDrawingsModel parse(String json) { - - - - // todo - return null; - } - - // ========== util methods ========== -} diff --git a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/SchedulingJsonParser.java b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/SchedulingJsonParser.java deleted file mode 100644 index ee4b908..0000000 --- a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/SchedulingJsonParser.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.jd.platform.async.scheduling; - -import com.jd.platform.async.scheduling.model.SchedulingDrawingsModel; - -/** - * @author create by TcSnZh on 2021/5/17-下午7:22 - */ -public interface SchedulingJsonParser { - - /** - * 解析json为图纸对象 - * - * @param json json - * @return 返回图纸对象接口 - */ - SchedulingDrawingsModel parse(String json); - - /** - * 默认实现 - */ - static SchedulingJsonParser getDefaultInstance() { - return DefaultSchedulingJsonParser.getInstance(); - } -} diff --git a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/drawings/DefaultSchedulingDrawingsParser.java b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/drawings/DefaultSchedulingDrawingsParser.java new file mode 100644 index 0000000..030804c --- /dev/null +++ b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/drawings/DefaultSchedulingDrawingsParser.java @@ -0,0 +1,219 @@ +package com.jd.platform.async.scheduling.drawings; + +import com.jd.platform.async.scheduling.exception.IllegalSchedulingPropertyException; +import com.jd.platform.async.scheduling.model.ObjectModel; +import com.jd.platform.async.scheduling.model.SchedulingDrawingsModel; + +import java.util.*; +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +/** + * @author tcsnzh[zh.jobs@foxmail.com] create this in 2021/5/20-下午4:38 + */ +class DefaultSchedulingDrawingsParser implements SchedulingDrawingsParser { + static final DefaultSchedulingDrawingsParser instance = new DefaultSchedulingDrawingsParser(); + + @Override + public SchedulingDrawings parseDrawings(final SchedulingDrawingsModel model) throws IllegalSchedulingPropertyException { + final SchedulingDrawingsImpl drawings = new SchedulingDrawingsImpl(); + final String drawingsName = model.getDrawingsName(); + drawings.setName(drawingsName == null ? UUID.randomUUID().toString() : drawingsName); + final List wrappers = + propRequireNotNull(model.getWrappers(), "wrappers"); + // 缓存WrapperModelMap并检查id是否唯一 + final LinkedHashMap wrapperId2ModelMap = + new LinkedHashMap<>(wrappers.size()); + for (int i = 0; i < wrappers.size(); i++) { + final SchedulingDrawingsModel.WrapperModel wrapper = wrappers.get(i); + // 检查id是否重复,并存入map + final String id = propRequireNotNull(wrapper.getId(), "wrappers[" + i + "].id"); + if (null != wrapperId2ModelMap.put(id, wrapper)) { + throw new IllegalSchedulingPropertyException("Wrapper id \"" + id + "\" duplicate ."); + } + } + // 缓存ObjectModelMap并检查 + final Map wrappersObjectModelMap = wrappersObjectModelMap(wrappers, wrapperId2ModelMap.keySet()); + // 构造wrapperFactory + // todo 还没写完 + return null; + } + + // ========== private method ========== + + + // ========== util static methods ========== + + /** + * 缓存sameObjectId有有效值的ObjectModel,并检查: + * 1. ObjectModel参数是否符合格式规范 + * 2. wrapperStrategy.dependOnUpWrapperStrategyMapper 的键id是否存在于wrappers的id属性集合中 + * + * @param wrappers wrappers属性值的列表 + * @param wrappersIdSet 已经包括wrappers列表中所有id属性的Set + * @return 返回Map的键为ObjectModel的sameObjectId,值为ObjectModel + * @throws IllegalSchedulingPropertyException 格式错误,抛出异常 + */ + protected static Map wrappersObjectModelMap( + List wrappers, + Set wrappersIdSet + ) throws IllegalSchedulingPropertyException { + final LinkedHashMap objectModelMap = new LinkedHashMap<>(); + for (final SchedulingDrawingsModel.WrapperModel wrapper : wrappers) { + final String prefixPropName = "wrappers[id=" + wrapper.getId() + "]"; + final SchedulingDrawingsModel.WrapperModel.ParamModel param = wrapper.getParam(); + // 将param参数中的objectModel检查并存入map + if (param != null && Boolean.TRUE.equals( + propRequireNotNull(param.getUseObjectModel(), prefixPropName + ".param.useObjectModel") + )) { + final Object value = param.getValue(); + if (value instanceof ObjectModel) { + checkAndPutObjectModelHasDifferentId( + (ObjectModel) value, + objectModelMap, + prefixPropName + ".param.value"); + } else { + throw IllegalSchedulingPropertyException.illegalFieldParameter( + prefixPropName + ".param.value", + value, + "it should instanceof ObjectModel." + ); + } + } + // 检查并缓存worker的objectModel + final String _workerPropName = prefixPropName + ".worker"; + checkAndPutObjectModelHasDifferentId(propRequireNotNull(wrapper.getWorker(), _workerPropName), + objectModelMap, _workerPropName); + // 检查并缓存callback的objectModel + checkAndPutObjectModelHasDifferentId(wrapper.getCallback(), objectModelMap, prefixPropName + ".callback"); + // 检查wrapperStrategy + final SchedulingDrawingsModel.WrapperModel.WrapperStrategyModel wrapperStrategy = wrapper.getWrapperStrategy(); + if (wrapperStrategy != null) { + // 检查并缓存dependOnUpWrapperStrategyMapper + final Map dependOnUpWrapperStrategyMapper = + wrapperStrategy.getDependOnUpWrapperStrategyMapper(); + if (dependOnUpWrapperStrategyMapper != null) { + for (Map.Entry entry : + dependOnUpWrapperStrategyMapper.entrySet()) { + final String wrapperId = entry.getKey(); + final String mapperPropName = prefixPropName + ".wrapperStrategy.dependOnUpWrapperStrategyMapper"; + if (!wrappersIdSet.contains(wrapperId)) { + throw IllegalSchedulingPropertyException.illegalFieldParameter( + mapperPropName, + dependOnUpWrapperStrategyMapper, + "the key(wrapperId) of \"" + wrapperId + "\n not in wrappers list" + ); + } + checkAndPutObjectModelHasDifferentId( + propRequireNotNull(entry.getValue(), mapperPropName), + objectModelMap, + mapperPropName + ); + } + } + // 检查并缓存dependenceStrategy + final ObjectModel dependenceStrategy = wrapperStrategy.getDependenceStrategy(); + final String dependenceStrategyPropName = prefixPropName + ".wrapperStrategy.dependenceStrategy"; + if (dependenceStrategy != null) { + checkAndPutObjectModelHasDifferentId( + dependenceStrategy, + objectModelMap, + dependenceStrategyPropName + ); + } + // 检查并缓存skipStrategy + final String skipStrategyPropName = prefixPropName + ".wrapperStrategy.skipStrategy"; + final ObjectModel skipStrategy = wrapperStrategy.getSkipStrategy(); + if (skipStrategy != null) { + checkAndPutObjectModelHasDifferentId( + skipStrategy, + objectModelMap, + skipStrategyPropName); + } + } + } + return objectModelMap; + } + + /** + * 本方法为{@link #wrappersObjectModelMap(List, Set)}的子方法。 + * 用于抽取ObjectModel格式的判断逻辑。 + * + * @param objectModel 对象模型 + * @param objectModelMap 要存入的Map + * @param propNameSup 属性名 + * @throws IllegalSchedulingPropertyException 格式错误,抛出异常 + */ + private static void checkAndPutObjectModelHasDifferentId(ObjectModel objectModel, + Map objectModelMap, + Supplier propNameSup) + throws IllegalSchedulingPropertyException { + final String constObjectName = objectModel.getConstObjectName(); + if (constObjectName != null) { + if (!ObjectModel.containConstObject(constObjectName)) { + final String propName; + throw new IllegalSchedulingPropertyException( + (propNameSup == null || (propName = propNameSup.get()) == null ? "" : "Property " + propName + " ") + + "ObjectModel doesn't have a constant object named \"" + + constObjectName + "\" . objectModel is " + objectModel); + } + return; + } + final Long sameObjectId = objectModel.getSameObjectId(); + if (sameObjectId != null) { + final Map properties = objectModel.getProperties(); + if (objectModelMap.containsKey(sameObjectId) && + // 同一id的对象,其他属性不允许重复设置 + (objectModel.getClassName() != null || properties != null && !properties.isEmpty())) { + throw new IllegalSchedulingPropertyException( + "The objectModel which sameObjectId=" + sameObjectId + + " cannot be set \"className\" or \"properties\" again . the two in conflict is " + + objectModel + " and " + objectModelMap.get(sameObjectId) + " ." + ); + } + objectModelMap.put(sameObjectId, objectModel); + return; + } + propRequireNotNull(objectModel.getClassName(), propNameSup.get()); + + } + + private static void checkAndPutObjectModelHasDifferentId(ObjectModel objectModel, + Map objectModelMap, + String propName) + throws IllegalSchedulingPropertyException { + checkAndPutObjectModelHasDifferentId(objectModel, objectModelMap, () -> propName); + } + + /** + * 检查属性是否为null + * + * @param prop 属性值 + * @param propName 属性名 + * @param reason 原因说明。 + * 默认值为{@code "it's not allow null"},用于{@link #propRequireNotNull(Object, String)}与 + * {@link #propRequireNotNull(Object, Supplier)}方法中。 + * @param 属性值泛型 + * @return 返回传入的属性值,供继续调用 + * @throws IllegalSchedulingPropertyException 如果属性为null,抛出异常 + */ + private static T propRequireNotNull(T prop, Supplier propName, Supplier reason) + throws IllegalSchedulingPropertyException { + if (prop == null) { + throw IllegalSchedulingPropertyException.illegalFieldParameter( + propName.get(), + null, + reason.get() + ); + } + return prop; + } + + private static T propRequireNotNull(T prop, String propName) throws IllegalSchedulingPropertyException { + return propRequireNotNull(prop, () -> propName); + } + + private static T propRequireNotNull(T prop, Supplier propName) throws IllegalSchedulingPropertyException { + return propRequireNotNull(prop, propName, () -> "it's not allow null"); + } +} diff --git a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/drawings/SchedulingDrawings.java b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/drawings/SchedulingDrawings.java new file mode 100644 index 0000000..f0b5b4b --- /dev/null +++ b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/drawings/SchedulingDrawings.java @@ -0,0 +1,10 @@ +package com.jd.platform.async.scheduling.drawings; + +/** + * 工厂图纸,可从模型转化而来 + * + * @author tcsnzh[zh.jobs@foxmail.com] create this in 2021/5/20-上午12:00 + */ +public interface SchedulingDrawings { + +} diff --git a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/drawings/SchedulingDrawingsImpl.java b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/drawings/SchedulingDrawingsImpl.java new file mode 100644 index 0000000..7cf3a4b --- /dev/null +++ b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/drawings/SchedulingDrawingsImpl.java @@ -0,0 +1,16 @@ +package com.jd.platform.async.scheduling.drawings; + +/** + * @author tcsnzh[zh.jobs@foxmail.com] create this in 2021/5/20-下午4:39 + */ +class SchedulingDrawingsImpl implements SchedulingDrawings{ + protected String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/drawings/SchedulingDrawingsParser.java b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/drawings/SchedulingDrawingsParser.java new file mode 100644 index 0000000..178f47b --- /dev/null +++ b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/drawings/SchedulingDrawingsParser.java @@ -0,0 +1,18 @@ +package com.jd.platform.async.scheduling.drawings; + +import com.jd.platform.async.scheduling.exception.IllegalSchedulingPropertyException; +import com.jd.platform.async.scheduling.model.SchedulingDrawingsModel; + +/** + * @author tcsnzh[zh.jobs@foxmail.com] create this in 2021/5/20-上午12:03 + */ +public interface SchedulingDrawingsParser { + /** + * 从模型转化为图纸 + */ + SchedulingDrawings parseDrawings(SchedulingDrawingsModel model) throws IllegalSchedulingPropertyException; + + default SchedulingDrawingsParser getDefaultInstance() { + return DefaultSchedulingDrawingsParser.instance; + } +} diff --git a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/exception/IllegalConfigException.java b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/exception/IllegalConfigException.java deleted file mode 100644 index 21b55e6..0000000 --- a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/exception/IllegalConfigException.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.jd.platform.async.scheduling.exception; - -/** - * @author tcsnzh[zh.jobs@foxmail.com] create this in 2021/5/19-下午7:20 - */ -public class IllegalConfigException extends Exception{ - public IllegalConfigException() { - } - - public IllegalConfigException(String message) { - super(message); - } - - public IllegalConfigException(String message, Throwable cause) { - super(message, cause); - } - - public IllegalConfigException(Throwable cause) { - super(cause); - } - - public IllegalConfigException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - } -} diff --git a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/exception/IllegalSchedulingException.java b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/exception/IllegalSchedulingException.java new file mode 100644 index 0000000..8a49582 --- /dev/null +++ b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/exception/IllegalSchedulingException.java @@ -0,0 +1,25 @@ +package com.jd.platform.async.scheduling.exception; + +/** + * @author tcsnzh[zh.jobs@foxmail.com] create this in 2021/5/19-下午7:20 + */ +public class IllegalSchedulingException extends Exception{ + public IllegalSchedulingException() { + } + + public IllegalSchedulingException(String message) { + super(message); + } + + public IllegalSchedulingException(String message, Throwable cause) { + super(message, cause); + } + + public IllegalSchedulingException(Throwable cause) { + super(cause); + } + + public IllegalSchedulingException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/exception/IllegalSchedulingPropertyException.java b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/exception/IllegalSchedulingPropertyException.java new file mode 100644 index 0000000..459c65a --- /dev/null +++ b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/exception/IllegalSchedulingPropertyException.java @@ -0,0 +1,55 @@ +package com.jd.platform.async.scheduling.exception; + +/** + * @author tcsnzh[zh.jobs@foxmail.com] create this in 2021/5/20-下午4:59 + */ +public class IllegalSchedulingPropertyException extends IllegalSchedulingException { + + public IllegalSchedulingPropertyException(String message) { + super(message); + } + + public IllegalSchedulingPropertyException(String message, Throwable cause) { + super(message, cause); + } + + /** + * json反序列化失败 + * + * @param json json + * @param cause 原因 + * @return 返回异常 + */ + public static IllegalSchedulingPropertyException deserializeJsonFailed(String json, + Throwable cause) { + return new IllegalSchedulingPropertyException( + "Json deserialize to model failed , please check properties and see QuickStart.md . the json is : " + json, + cause + ); + } + + /** + * 如果json反序列化有效,但是不符合规范。 + * + * @param illegalFieldName 无效的属性名 + * @param fieldValue 属性的值 + * @param reason 原因 + * @param cause 引发异常,可以为null + * @return 返回异常 + */ + public static IllegalSchedulingPropertyException illegalFieldParameter(String illegalFieldName, + Object fieldValue, + String reason, + Throwable cause) { + return new IllegalSchedulingPropertyException( + "Property" + illegalFieldName + " does not conform to specification. value is : " + fieldValue + + " . because " + reason, cause + ); + } + + public static IllegalSchedulingPropertyException illegalFieldParameter(String illegalFieldName, + Object fieldValue, + String reason) { + return illegalFieldParameter(illegalFieldName, fieldValue, reason, null); + } +} diff --git a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/SchedulingFactory.java b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/factory/AbstractSchedulingFactory.java similarity index 71% rename from asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/SchedulingFactory.java rename to asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/factory/AbstractSchedulingFactory.java index 49c7c7d..516b23a 100644 --- a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/SchedulingFactory.java +++ b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/factory/AbstractSchedulingFactory.java @@ -1,22 +1,19 @@ -package com.jd.platform.async.scheduling; - -import sun.misc.Unsafe; +package com.jd.platform.async.scheduling.factory; import java.util.concurrent.atomic.AtomicLong; -import java.util.function.Function; /** * 调度工厂。传入图纸生成一组wrapper。 * * @author create by TcSnZh on 2021/5/17-上午1:11 */ -public class SchedulingFactory { - private final String factoryName; +public abstract class AbstractSchedulingFactory { + protected final String factoryName; /** * 无参构造,默认使用 {@code 栈信息<自增long值> } 作为工厂名 */ - public SchedulingFactory() { + public AbstractSchedulingFactory() { this(Thread.currentThread().getStackTrace()[2] + "<" + defaultFactoryNameCount.getAndIncrement() + ">"); } @@ -25,7 +22,7 @@ public class SchedulingFactory { * * @param factoryName 工厂名 */ - public SchedulingFactory(String factoryName) { + public AbstractSchedulingFactory(String factoryName) { this.factoryName = factoryName; } diff --git a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/model/DefaultSchedulingJsonModelParser.java b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/model/DefaultSchedulingJsonModelParser.java new file mode 100644 index 0000000..6e62218 --- /dev/null +++ b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/model/DefaultSchedulingJsonModelParser.java @@ -0,0 +1,33 @@ +package com.jd.platform.async.scheduling.model; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.parser.Feature; +import com.jd.platform.async.scheduling.exception.IllegalSchedulingPropertyException; + +import static com.alibaba.fastjson.parser.Feature.*; + +/** + * @author create by TcSnZh on 2021/5/17-上午1:22 + */ +class DefaultSchedulingJsonModelParser implements SchedulingJsonModelParser { + // ========== singleton instance ========== + + static final DefaultSchedulingJsonModelParser instance = new DefaultSchedulingJsonModelParser(); + + // ========== public methods ========== + + @Override + public SchedulingDrawingsModel parseToModel(String json) throws IllegalSchedulingPropertyException { + try { + return JSONObject.parseObject(json, SchedulingDrawingsModel.class, DEFAULT_FEATURES); + } catch (Exception e) { + throw IllegalSchedulingPropertyException.deserializeJsonFailed(json, e); + } + } + + static Feature[] DEFAULT_FEATURES = { + AllowComment, AllowUnQuotedFieldNames, AllowSingleQuotes, SafeMode, ErrorOnEnumNotMatch + }; + + // ========== util methods ========== +} diff --git a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/model/ObjectModel.java b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/model/ObjectModel.java index 6171899..ea4783c 100644 --- a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/model/ObjectModel.java +++ b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/model/ObjectModel.java @@ -11,7 +11,6 @@ import java.util.Map; /** * @author tcsnzh[zh.jobs@foxmail.com] create this in 2021/5/19-下午7:51 */ -@SuppressWarnings("unused") public class ObjectModel { protected String constObjectName; protected String className; @@ -57,6 +56,16 @@ public class ObjectModel { return constObjects; } + @Override + public String toString() { + return "ObjectModel{" + + "constObjectName='" + constObjectName + '\'' + + ", className='" + className + '\'' + + ", sameObjectId=" + sameObjectId + + ", properties=" + properties + + '}'; + } + // static constants private static final Map constObjects; @@ -73,6 +82,10 @@ public class ObjectModel { constObjects.put("PRINT_EXCEPTION_STACK_TRACE", ICallback.PRINT_EXCEPTION_STACK_TRACE); } + public static boolean containConstObject(String name) { + return constObjects.containsKey(name); + } + public static T getConstObject(String name) { //noinspection unchecked return (T) constObjects.get(name); diff --git a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/model/SchedulingDrawingsModel.java b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/model/SchedulingDrawingsModel.java index 1e00e68..6899622 100644 --- a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/model/SchedulingDrawingsModel.java +++ b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/model/SchedulingDrawingsModel.java @@ -2,6 +2,7 @@ package com.jd.platform.async.scheduling.model; import java.util.List; import java.util.Map; +import java.util.StringJoiner; import java.util.concurrent.TimeUnit; /** @@ -159,6 +160,22 @@ public class SchedulingDrawingsModel { public void setExtendConfig(String extendConfig) { this.extendConfig = extendConfig; } + + @Override + public String toString() { + return "WrapperModel{" + + "id='" + id + '\'' + + ", param=" + param + + ", worker=" + worker + + ", callback=" + callback + + ", wrapperStrategy=" + wrapperStrategy + + ", allowInterrupt=" + allowInterrupt + + ", enableTimeout=" + enableTimeout + + ", timeoutLength=" + timeoutLength + + ", timeUnit=" + timeUnit + + ", extendConfig='" + extendConfig + '\'' + + '}'; + } } public static class RelationModel { @@ -180,6 +197,14 @@ public class SchedulingDrawingsModel { public void setTo(Object to) { this.to = to; } + + @Override + public String toString() { + return "RelationModel{" + + "from=" + from + + ", to=" + to + + '}'; + } } public static class BeginWorkModel { @@ -219,6 +244,16 @@ public class SchedulingDrawingsModel { public void setExecutor(String executor) { this.executor = executor; } + + @Override + public String toString() { + return "BeginWorkModel{" + + "timeoutLength=" + timeoutLength + + ", timeoutUnit=" + timeoutUnit + + ", wrappers=" + wrappers + + ", executor='" + executor + '\'' + + '}'; + } } public String getDrawingsName() { @@ -252,4 +287,14 @@ public class SchedulingDrawingsModel { public void setBeginWork(BeginWorkModel beginWork) { this.beginWork = beginWork; } + + @Override + public String toString() { + return "SchedulingDrawingsModel{" + + "drawingsName='" + drawingsName + '\'' + + ", wrappers=" + wrappers + + ", relations=" + relations + + ", beginWork=" + beginWork + + '}'; + } } diff --git a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/model/SchedulingJsonModelParser.java b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/model/SchedulingJsonModelParser.java new file mode 100644 index 0000000..f3cf69a --- /dev/null +++ b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/model/SchedulingJsonModelParser.java @@ -0,0 +1,23 @@ +package com.jd.platform.async.scheduling.model; + +import com.jd.platform.async.scheduling.exception.IllegalSchedulingPropertyException; + +/** + * @author create by TcSnZh on 2021/5/17-下午7:22 + */ +public interface SchedulingJsonModelParser { + /** + * 解析json为配置模型对象 + * + * @param json json + * @return 返回图纸对象接口 + */ + SchedulingDrawingsModel parseToModel(String json) throws IllegalSchedulingPropertyException; + + /** + * 默认实现 + */ + static SchedulingJsonModelParser getDefaultInstance() { + return DefaultSchedulingJsonModelParser.instance; + } +} diff --git a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/util/ReflectUtil.java b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/util/ReflectUtil.java index cdd7b97..62d1675 100644 --- a/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/util/ReflectUtil.java +++ b/asyncTool-scheduling/src/main/java/com/jd/platform/async/scheduling/util/ReflectUtil.java @@ -10,7 +10,4 @@ public abstract class ReflectUtil { private ReflectUtil() { } - public static void foreachField(Class clazz) { - - } } diff --git a/asyncTool-scheduling/src/test/java/schedulingtest/cases/Case1.java b/asyncTool-scheduling/src/test/java/schedulingtest/cases/Case1.java deleted file mode 100644 index 81a04f1..0000000 --- a/asyncTool-scheduling/src/test/java/schedulingtest/cases/Case1.java +++ /dev/null @@ -1,14 +0,0 @@ -package schedulingtest.cases; - -import com.jd.platform.async.scheduling.SchedulingJsonParser; -import schedulingtest.FileStringReader; - -/** - * @author create by TcSnZh on 2021/5/17-上午11:49 - */ -class Case1 { - public static void main(String[] args) { - String json = FileStringReader.readFile("test.json"); - System.out.println(SchedulingJsonParser.getDefaultInstance().parse(json)); - } -} diff --git a/asyncTool-scheduling/src/test/java/schedulingtest/FileStringReader.java b/asyncTool-scheduling/src/test/java/v15/schedulingtest/FileStringReader.java similarity index 88% rename from asyncTool-scheduling/src/test/java/schedulingtest/FileStringReader.java rename to asyncTool-scheduling/src/test/java/v15/schedulingtest/FileStringReader.java index d59e99c..bda04e1 100644 --- a/asyncTool-scheduling/src/test/java/schedulingtest/FileStringReader.java +++ b/asyncTool-scheduling/src/test/java/v15/schedulingtest/FileStringReader.java @@ -1,4 +1,4 @@ -package schedulingtest; +package v15.schedulingtest; import java.io.*; import java.util.Objects; @@ -34,8 +34,4 @@ public class FileStringReader { } } } - - public static void main(String[] args) { - System.out.println("test readFile : \n\n" + readFile("case1_1.json")); - } } diff --git a/asyncTool-scheduling/src/test/java/v15/schedulingtest/cases/case1/Case1.java b/asyncTool-scheduling/src/test/java/v15/schedulingtest/cases/case1/Case1.java new file mode 100644 index 0000000..8f40ae1 --- /dev/null +++ b/asyncTool-scheduling/src/test/java/v15/schedulingtest/cases/case1/Case1.java @@ -0,0 +1,15 @@ +package v15.schedulingtest.cases.case1; + +import com.jd.platform.async.scheduling.exception.IllegalSchedulingException; +import com.jd.platform.async.scheduling.model.SchedulingJsonModelParser; +import v15.schedulingtest.FileStringReader; + +/** + * @author create by TcSnZh on 2021/5/17-上午11:49 + */ +class Case1 { + public static void main(String[] args) throws IllegalSchedulingException { + String json = FileStringReader.readFile("v15/case1_1.json"); + System.out.println(SchedulingJsonModelParser.getDefaultInstance().parseToModel(json)); + } +} diff --git a/asyncTool-scheduling/src/test/java/schedulingtest/impl/PayTaxes.java b/asyncTool-scheduling/src/test/java/v15/schedulingtest/cases/case1/PayTaxes.java similarity index 77% rename from asyncTool-scheduling/src/test/java/schedulingtest/impl/PayTaxes.java rename to asyncTool-scheduling/src/test/java/v15/schedulingtest/cases/case1/PayTaxes.java index 9bc5d34..71f6e56 100644 --- a/asyncTool-scheduling/src/test/java/schedulingtest/impl/PayTaxes.java +++ b/asyncTool-scheduling/src/test/java/v15/schedulingtest/cases/case1/PayTaxes.java @@ -1,19 +1,16 @@ -package schedulingtest.impl; +package v15.schedulingtest.cases.case1; import com.jd.platform.async.callback.ICallback; import com.jd.platform.async.callback.IWorker; import com.jd.platform.async.worker.WorkResult; import com.jd.platform.async.wrapper.WorkerWrapper; -import schedulingtest.entity.User; import java.util.Map; -import static schedulingtest.impl.SelectUserByName.HundredMillion; - /** * @author create by TcSnZh on 2021/5/17-上午2:04 */ -public class PayTaxes implements IWorker, ICallback { +class PayTaxes implements IWorker, ICallback { /** * 富人(资产>1亿)收30%的税,穷人发1000块。 */ @@ -21,7 +18,7 @@ public class PayTaxes implements IWorker, ICallback public User action(String selectUserWrapperId, Map> allWrappers) { User u = (User) allWrappers.get(selectUserWrapperId).getWorkResult().getResult(); double money; - if ((money = u.getMoney()) > 1.00 * HundredMillion) { + if ((money = u.getMoney()) > 1.00 * SelectUserByName.HundredMillion) { u.setMoney(money * 0.7); } else { u.setMoney(money + 1000); diff --git a/asyncTool-scheduling/src/test/java/schedulingtest/PrintParam.java b/asyncTool-scheduling/src/test/java/v15/schedulingtest/cases/case1/PrintParam.java similarity index 79% rename from asyncTool-scheduling/src/test/java/schedulingtest/PrintParam.java rename to asyncTool-scheduling/src/test/java/v15/schedulingtest/cases/case1/PrintParam.java index 758ce5f..c46166c 100644 --- a/asyncTool-scheduling/src/test/java/schedulingtest/PrintParam.java +++ b/asyncTool-scheduling/src/test/java/v15/schedulingtest/cases/case1/PrintParam.java @@ -1,4 +1,4 @@ -package schedulingtest; +package v15.schedulingtest.cases.case1; import com.jd.platform.async.callback.IWorker; import com.jd.platform.async.wrapper.WorkerWrapper; @@ -8,7 +8,7 @@ import java.util.Map; /** * @author create by TcSnZh on 2021/5/17-上午2:31 */ -public class PrintParam implements IWorker { +class PrintParam implements IWorker { @Override public Object action(Object object, Map> allWrappers) { System.out.println("print param : " + object); diff --git a/asyncTool-scheduling/src/test/java/schedulingtest/impl/SelectUserByName.java b/asyncTool-scheduling/src/test/java/v15/schedulingtest/cases/case1/SelectUserByName.java similarity index 88% rename from asyncTool-scheduling/src/test/java/schedulingtest/impl/SelectUserByName.java rename to asyncTool-scheduling/src/test/java/v15/schedulingtest/cases/case1/SelectUserByName.java index a48f2af..b796933 100644 --- a/asyncTool-scheduling/src/test/java/schedulingtest/impl/SelectUserByName.java +++ b/asyncTool-scheduling/src/test/java/v15/schedulingtest/cases/case1/SelectUserByName.java @@ -1,13 +1,11 @@ -package schedulingtest.impl; +package v15.schedulingtest.cases.case1; import com.jd.platform.async.callback.ICallback; import com.jd.platform.async.callback.IWorker; import com.jd.platform.async.worker.WorkResult; import com.jd.platform.async.wrapper.WorkerWrapper; -import schedulingtest.entity.User; +import v15.schedulingtest.cases.case1.User; -import java.io.PrintStream; -import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; @@ -15,7 +13,7 @@ import java.util.concurrent.atomic.AtomicInteger; /** * @author create by TcSnZh on 2021/5/17-上午1:33 */ -public class SelectUserByName implements IWorker, ICallback { +class SelectUserByName implements IWorker, ICallback { public static final long HundredMillion = 100000000; private static final Map datasource; diff --git a/asyncTool-scheduling/src/test/java/schedulingtest/entity/User.java b/asyncTool-scheduling/src/test/java/v15/schedulingtest/cases/case1/User.java similarity index 94% rename from asyncTool-scheduling/src/test/java/schedulingtest/entity/User.java rename to asyncTool-scheduling/src/test/java/v15/schedulingtest/cases/case1/User.java index 9b5a4de..9a192ee 100644 --- a/asyncTool-scheduling/src/test/java/schedulingtest/entity/User.java +++ b/asyncTool-scheduling/src/test/java/v15/schedulingtest/cases/case1/User.java @@ -1,9 +1,9 @@ -package schedulingtest.entity; +package v15.schedulingtest.cases.case1; /** * @author create by TcSnZh on 2021/5/17-上午1:33 */ -public class User { +class User { private String name; private int age; private double money; diff --git a/asyncTool-scheduling/src/test/resources/case1_1.json b/asyncTool-scheduling/src/test/resources/case1_1.json deleted file mode 100644 index 43bf794..0000000 --- a/asyncTool-scheduling/src/test/resources/case1_1.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "drawingsName": "case1_1", - "wrappers": [ - { - "id": "first", - "param": "JackMa", - "worker": "schedulingtest.impl.SelectUserByName", - "callback": { - "className:": "schedulingtest.impl.SelectUserByName" - }, - "wrapperStrategy": { - "dependWrapperStrategyMapper": null, - "dependMustStrategyMapper": null, - "dependenceStrategy": "ALL_DEPENDENCIES_ALL_SUCCESS", - "skipStrategy": "CHECK_ONE_LEVEL" - }, - "allowInterrupt": true, - "enableTimeout": true, - "timeoutLength": 50, - "timeoutUnit": "TimeUnit.MILLISECONDS" - }, - { - "id": "second", - "workerAndCallback": "schedulingtest.impl.PayTaxes" - }, - { - "id": "third", - "__extend": "second" - }, - { - "id": "fourth", - "worker": "schedulingtest.impl.PrintParam", - "wrapperStrategy": { - "dependenceStrategy": "ALL_DEPENDENCIES_ALL_SUCCESS" - } - } - ], - "relations": [ - { - "from": "first", - "to": "second" - }, - { - "from": "second", - "to": "fourth" - }, - { - "from": "third", - "to": "fourth" - } - ], - "beginWork": { - "timeoutLength": 100, - "timeoutUnit": "TimeUnit.MILLISECONDS", - "wrappers": [ - "first" - ], - "executor": "COMMON_POOL" - }, - "objects": [] -} \ No newline at end of file diff --git a/asyncTool-scheduling/src/test/resources/test.json b/asyncTool-scheduling/src/test/resources/test.json deleted file mode 100644 index 09df068..0000000 --- a/asyncTool-scheduling/src/test/resources/test.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "drawingsName": "case1_1", - "wrappers": [ - { - "id": "first", - "worker": "schedulingtest.impl.SelectUserByName" - } - ] -} \ No newline at end of file diff --git a/asyncTool-scheduling/src/test/resources/v15/case1_1.json b/asyncTool-scheduling/src/test/resources/v15/case1_1.json new file mode 100644 index 0000000..cedf0fb --- /dev/null +++ b/asyncTool-scheduling/src/test/resources/v15/case1_1.json @@ -0,0 +1,80 @@ +{ + "drawingsName": "case1_1", + "wrappers": [ + { + "id": "first", + "param": { + "useObjectModel": false, + "value": "JackMa" + }, + "worker": { + "sameObjectId": 1, + "className:": "schedulingtest.impl.SelectUserByName" + }, + "callback": { + "sameObjectId": 1 + }, + "wrapperStrategy": { + "dependOnUpWrapperStrategyMapper": null, + "dependenceStrategy": { + "constObjectName": "ALL_DEPENDENCIES_ALL_SUCCESS" + }, + "skipStrategy": { + "constObjectName": "CHECK_ONE_LEVEL" + } + }, + "allowInterrupt": true, + "enableTimeout": true, + "timeoutLength": 50, + "timeoutUnit": "TimeUnit.MILLISECONDS" + }, + { + "id": "second", + "worker": { + "sameObjectId": 2, + "className:": "schedulingtest.impl.SelectUserByName" + }, + "callback": { + "sameObjectId": 2 + } + }, + { + "id": "third", + "__extend": "second" + }, + { + "id": "fourth", + "worker": { + "sameObjectId": 2, + "className:": "schedulingtest.impl.PrintParam" + }, + "wrapperStrategy": { + "dependenceStrategy": { + "constObjectName": "ALL_DEPENDENCIES_ALL_SUCCESS" + } + } + } + ], + "relations": [ + { + "from": "first", + "to": "second" + }, + { + "from": "second", + "to": "fourth" + }, + { + "from": "third", + "to": "fourth" + } + ], + "beginWork": { + "timeoutLength": 100, + "timeoutUnit": "MILLISECONDS", + "wrappers": [ + "first" + ], + "executor": "COMMON_POOL" + } +} \ No newline at end of file