diff --git a/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/CommonBenchmark.java b/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/CommonBenchmark.java index 6fb2d746b..275683423 100644 --- a/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/CommonBenchmark.java +++ b/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/CommonBenchmark.java @@ -45,17 +45,6 @@ public class CommonBenchmark { flowExecutor.execute2Resp("chain1"); } - @Benchmark - public void test2(){ - flowExecutor.execute2Resp("chain2"); - } - - @Benchmark - public void test3(){ - flowExecutor.execute2Resp("chain3"); - } - - public static void main(String[] args) throws RunnerException { Options opt = new OptionsBuilder() .include(CommonBenchmark.class.getSimpleName()) diff --git a/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/cmp/ACmp.java b/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/cmp/ACmp.java index 8c9d02813..4611110de 100644 --- a/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/cmp/ACmp.java +++ b/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/cmp/ACmp.java @@ -7,14 +7,37 @@ */ package com.yomahub.liteflow.benchmark.cmp; +import cn.hutool.core.collection.ListUtil; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.slot.DefaultContext; +import com.yomahub.liteflow.spi.holder.ContextAwareHolder; + +import java.util.List; @LiteflowComponent("a") public class ACmp extends NodeComponent { @Override public void process() { + int v1 = 2; + int v2 = 3; + DefaultContext ctx = this.getFirstContextBean(); + ctx.setData("s1", v1 * v2); + + TestDomain domain = ContextAwareHolder.loadContextAware().getBean(TestDomain.class); + String str = domain.sayHello("jack"); + ctx.setData("hi", str); + + List personList = ListUtil.toList( + new Person("jack", 15000), + new Person("tom", 13500), + new Person("peter", 18600) + ); + + int totalSalary = personList.stream().mapToInt(Person::getSalary).sum(); + + ctx.setData("salary", totalSalary); } } diff --git a/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/cmp/CCmp.java b/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/cmp/CCmp.java deleted file mode 100644 index 95ee9b80c..000000000 --- a/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/cmp/CCmp.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - *

Title: liteflow

- *

Description: 轻量级的组件式流程框架

- * @author Bryan.Zhang - * @email weenyc31@163.com - * @Date 2020/4/1 - */ -package com.yomahub.liteflow.benchmark.cmp; - -import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeComponent; - -@LiteflowComponent("c") -public class CCmp extends NodeComponent { - - @Override - public void process() { - } - -} diff --git a/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/cmp/DCmp.java b/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/cmp/DCmp.java deleted file mode 100644 index 35ee84388..000000000 --- a/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/cmp/DCmp.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.yomahub.liteflow.benchmark.cmp; - -import cn.hutool.core.collection.ListUtil; -import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeIteratorComponent; - -import java.util.Iterator; - -@LiteflowComponent("d") -public class DCmp extends NodeIteratorComponent { - @Override - public Iterator processIterator() throws Exception { - return ListUtil.toList("1","2","3").iterator(); - } -} diff --git a/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/cmp/TestDomain.java b/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/cmp/TestDomain.java new file mode 100644 index 000000000..bbd999956 --- /dev/null +++ b/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/cmp/TestDomain.java @@ -0,0 +1,25 @@ +package com.yomahub.liteflow.benchmark.cmp; + +import cn.hutool.core.collection.ListUtil; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class TestDomain { + + public String sayHello(String name){ + return "hello," + name; + } + + public static void main(String[] args) { + List personList = ListUtil.toList( + new Person("jack", 15000), + new Person("tom", 13500), + new Person("peter", 18600) + ); + + int totalSalary = personList.stream().mapToInt(Person::getSalary).sum(); + System.out.println(totalSalary); + } +} diff --git a/liteflow-benchmark/liteflow-benchmark-common/src/test/resources/flow.xml b/liteflow-benchmark/liteflow-benchmark-common/src/test/resources/flow.xml index 38c7afc0d..41259eb42 100644 --- a/liteflow-benchmark/liteflow-benchmark-common/src/test/resources/flow.xml +++ b/liteflow-benchmark/liteflow-benchmark-common/src/test/resources/flow.xml @@ -1,37 +1,7 @@ - - - - - - - THEN(a,b,c); - - - - THEN(a,b,s1); - - - - ITERATOR(d).parallel(true).DO(THEN(a,b,c)); + THEN(a); \ No newline at end of file diff --git a/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/java/com/yomahub/liteflow/benchmark/ScriptGroovyBenchmark.java b/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/java/com/yomahub/liteflow/benchmark/ScriptGroovyBenchmark.java index 77bf63be0..42c39b85b 100644 --- a/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/java/com/yomahub/liteflow/benchmark/ScriptGroovyBenchmark.java +++ b/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/java/com/yomahub/liteflow/benchmark/ScriptGroovyBenchmark.java @@ -47,19 +47,6 @@ public class ScriptGroovyBenchmark { flowExecutor.execute2Resp("chain1"); } - //LF动态创建组件和规则,并执行 - @Benchmark - public void test2(){ - String scriptContent = ResourceUtil.readUtf8Str("classpath:script.groovy"); - LiteFlowNodeBuilder.createScriptNode().setId("ds").setScript(scriptContent).build(); - - if(!FlowBus.containChain("chain2")){ - LiteFlowChainELBuilder.createChain().setChainId("chain2").setEL("THEN(ds)").build(); - } - flowExecutor.execute2Resp("chain2"); - } - - public static void main(String[] args) throws RunnerException { Options opt = new OptionsBuilder() .include(ScriptGroovyBenchmark.class.getSimpleName()) diff --git a/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/java/com/yomahub/liteflow/benchmark/cmp/ACmp.java b/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/java/com/yomahub/liteflow/benchmark/cmp/ACmp.java deleted file mode 100644 index 8c9d02813..000000000 --- a/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/java/com/yomahub/liteflow/benchmark/cmp/ACmp.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - *

Title: liteflow

- *

Description: 轻量级的组件式流程框架

- * @author Bryan.Zhang - * @email weenyc31@163.com - * @Date 2020/4/1 - */ -package com.yomahub.liteflow.benchmark.cmp; - -import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeComponent; - -@LiteflowComponent("a") -public class ACmp extends NodeComponent { - - @Override - public void process() { - } - -} diff --git a/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/java/com/yomahub/liteflow/benchmark/cmp/BCmp.java b/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/java/com/yomahub/liteflow/benchmark/cmp/BCmp.java deleted file mode 100644 index 1dc6a517f..000000000 --- a/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/java/com/yomahub/liteflow/benchmark/cmp/BCmp.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - *

Title: liteflow

- *

Description: 轻量级的组件式流程框架

- * @author Bryan.Zhang - * @email weenyc31@163.com - * @Date 2020/4/1 - */ -package com.yomahub.liteflow.benchmark.cmp; - -import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeComponent; - -@LiteflowComponent("b") -public class BCmp extends NodeComponent { - - @Override - public void process() { - } - -} diff --git a/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/java/com/yomahub/liteflow/benchmark/cmp/Person.java b/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/java/com/yomahub/liteflow/benchmark/cmp/Person.java new file mode 100644 index 000000000..be665958d --- /dev/null +++ b/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/java/com/yomahub/liteflow/benchmark/cmp/Person.java @@ -0,0 +1,28 @@ +package com.yomahub.liteflow.benchmark.cmp; + +public class Person { + private String name; + + private Integer salary; + + public Person(String name, Integer salary) { + this.name = name; + this.salary = salary; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getSalary() { + return salary; + } + + public void setSalary(Integer salary) { + this.salary = salary; + } +} diff --git a/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/resources/flow.xml b/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/resources/flow.xml index ee2649be2..7643c9a49 100644 --- a/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/resources/flow.xml +++ b/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/resources/flow.xml @@ -35,21 +35,9 @@ defaultContext.setData("s1", a * b) ]]> - - - - - - - - - THEN(FOR(s2).DO(THEN(a, b, c, s1)), SWITCH(s3).TO(a,b)); + THEN(s1); \ No newline at end of file diff --git a/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/resources/script.groovy b/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/resources/script.groovy deleted file mode 100644 index aa5bcc4f2..000000000 --- a/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/resources/script.groovy +++ /dev/null @@ -1,29 +0,0 @@ -import cn.hutool.core.collection.ListUtil -import cn.hutool.core.date.DateUtil - -import java.util.function.Consumer -import java.util.function.Function -import java.util.stream.Collectors - -def date = DateUtil.parse("2022-10-17 13:31:43") -defaultContext.setData("demoDate", date) - -List list = ListUtil.toList("a", "b", "c") - -List resultList = list.stream().map(s -> "hello," + s).collect(Collectors.toList()) - -defaultContext.setData("resultList", resultList) - -class Student { - int studentID - String studentName -} - -Student student = new Student() -student.studentID = 100301 -student.studentName = "张三" -defaultContext.setData("student", student) - -def a = 3 -def b = 2 -defaultContext.setData("s1", a * b) \ No newline at end of file diff --git a/liteflow-benchmark/liteflow-benchmark-script-java/src/test/java/com/yomahub/liteflow/benchmark/ScriptJavaBenchmark.java b/liteflow-benchmark/liteflow-benchmark-script-java/src/test/java/com/yomahub/liteflow/benchmark/ScriptJavaBenchmark.java index 607b40bac..35872d0b3 100644 --- a/liteflow-benchmark/liteflow-benchmark-script-java/src/test/java/com/yomahub/liteflow/benchmark/ScriptJavaBenchmark.java +++ b/liteflow-benchmark/liteflow-benchmark-script-java/src/test/java/com/yomahub/liteflow/benchmark/ScriptJavaBenchmark.java @@ -48,7 +48,7 @@ public class ScriptJavaBenchmark { } //LF动态创建组件和规则,并执行 - @Benchmark + /*@Benchmark public void test2(){ String scriptContent = ResourceUtil.readUtf8Str("classpath:javaScript.java"); LiteFlowNodeBuilder.createScriptNode().setId("ds").setScript(scriptContent).build(); @@ -57,7 +57,7 @@ public class ScriptJavaBenchmark { LiteFlowChainELBuilder.createChain().setChainId("chain2").setEL("THEN(ds)").build(); } flowExecutor.execute2Resp("chain2"); - } + }*/ public static void main(String[] args) throws RunnerException { @@ -67,7 +67,7 @@ public class ScriptJavaBenchmark { .warmupIterations(1)//预热次数 .measurementIterations(3)//执行次数 .measurementTime(new TimeValue(10, TimeUnit.SECONDS))//每次执行多少时间 - .threads(300)//多少个线程 + .threads(100)//多少个线程 .forks(1)//多少个进程 .timeUnit(TimeUnit.SECONDS) .build(); diff --git a/liteflow-benchmark/liteflow-benchmark-script-java/src/test/resources/flow.xml b/liteflow-benchmark/liteflow-benchmark-script-java/src/test/resources/flow.xml index 210ff5ba6..6fe64ebdc 100644 --- a/liteflow-benchmark/liteflow-benchmark-script-java/src/test/resources/flow.xml +++ b/liteflow-benchmark/liteflow-benchmark-script-java/src/test/resources/flow.xml @@ -4,12 +4,16 @@ personList = ListUtil.toList( + new Person("jack", 15000), + new Person("tom", 13500), + new Person("peter", 18600) + ); + + int totalSalary = 0; + for (int i = 0; i < personList.size(); i++) { + Person p = (Person)personList.get(i); + totalSalary += p.getSalary(); + } + + ctx.setData("salary", totalSalary); + return null; } } ]]> - - - - - - - - - THEN(FOR(s2).DO(THEN(a, b, c, s1)), SWITCH(s3).TO(a,b)); + THEN(s1); \ No newline at end of file diff --git a/liteflow-benchmark/liteflow-benchmark-script-javax-pro/pom.xml b/liteflow-benchmark/liteflow-benchmark-script-javax-pro/pom.xml new file mode 100644 index 000000000..3e680b8ac --- /dev/null +++ b/liteflow-benchmark/liteflow-benchmark-script-javax-pro/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + + liteflow-benchmark + com.yomahub + ${revision} + ../pom.xml + + + liteflow-benchmark-script-javax-pro + + + + com.yomahub + liteflow-script-javax-pro + ${revision} + test + + + + \ No newline at end of file diff --git a/liteflow-benchmark/liteflow-benchmark-script-javax-pro/src/test/java/com/yomahub/liteflow/benchmark/ScriptJavaxProBenchmark.java b/liteflow-benchmark/liteflow-benchmark-script-javax-pro/src/test/java/com/yomahub/liteflow/benchmark/ScriptJavaxProBenchmark.java new file mode 100644 index 000000000..480a7b3a5 --- /dev/null +++ b/liteflow-benchmark/liteflow-benchmark-script-javax-pro/src/test/java/com/yomahub/liteflow/benchmark/ScriptJavaxProBenchmark.java @@ -0,0 +1,59 @@ +package com.yomahub.liteflow.benchmark; + +import com.yomahub.liteflow.core.FlowExecutor; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; +import org.openjdk.jmh.runner.options.TimeValue; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.PropertySource; + +import java.util.concurrent.TimeUnit; + +@State(Scope.Benchmark) +@EnableAutoConfiguration +@PropertySource(value = "classpath:application.properties") +@ComponentScan("com.yomahub.liteflow.benchmark.cmp") +public class ScriptJavaxProBenchmark { + + private ConfigurableApplicationContext applicationContext; + + private FlowExecutor flowExecutor; + + @Setup + public void setup() { + applicationContext = SpringApplication.run(ScriptJavaxProBenchmark.class); + flowExecutor = applicationContext.getBean(FlowExecutor.class); + } + + @TearDown + public void tearDown() { + applicationContext.close(); + } + + //普通执行 + @Benchmark + public void test1(){ + flowExecutor.execute2Resp("chain1"); + } + + + public static void main(String[] args) throws RunnerException { + Options opt = new OptionsBuilder() + .include(ScriptJavaxProBenchmark.class.getSimpleName()) + .mode(Mode.Throughput) + .warmupIterations(1)//预热次数 + .measurementIterations(3)//执行次数 + .measurementTime(new TimeValue(10, TimeUnit.SECONDS))//每次执行多少时间 + .threads(100)//多少个线程 + .forks(1)//多少个进程 + .timeUnit(TimeUnit.SECONDS) + .build(); + new Runner(opt).run(); + } +} diff --git a/liteflow-benchmark/liteflow-benchmark-script-javax-pro/src/test/java/com/yomahub/liteflow/benchmark/cmp/Person.java b/liteflow-benchmark/liteflow-benchmark-script-javax-pro/src/test/java/com/yomahub/liteflow/benchmark/cmp/Person.java new file mode 100644 index 000000000..be665958d --- /dev/null +++ b/liteflow-benchmark/liteflow-benchmark-script-javax-pro/src/test/java/com/yomahub/liteflow/benchmark/cmp/Person.java @@ -0,0 +1,28 @@ +package com.yomahub.liteflow.benchmark.cmp; + +public class Person { + private String name; + + private Integer salary; + + public Person(String name, Integer salary) { + this.name = name; + this.salary = salary; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getSalary() { + return salary; + } + + public void setSalary(Integer salary) { + this.salary = salary; + } +} diff --git a/liteflow-benchmark/liteflow-benchmark-script-javax-pro/src/test/java/com/yomahub/liteflow/benchmark/cmp/TestDomain.java b/liteflow-benchmark/liteflow-benchmark-script-javax-pro/src/test/java/com/yomahub/liteflow/benchmark/cmp/TestDomain.java new file mode 100644 index 000000000..bbd999956 --- /dev/null +++ b/liteflow-benchmark/liteflow-benchmark-script-javax-pro/src/test/java/com/yomahub/liteflow/benchmark/cmp/TestDomain.java @@ -0,0 +1,25 @@ +package com.yomahub.liteflow.benchmark.cmp; + +import cn.hutool.core.collection.ListUtil; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class TestDomain { + + public String sayHello(String name){ + return "hello," + name; + } + + public static void main(String[] args) { + List personList = ListUtil.toList( + new Person("jack", 15000), + new Person("tom", 13500), + new Person("peter", 18600) + ); + + int totalSalary = personList.stream().mapToInt(Person::getSalary).sum(); + System.out.println(totalSalary); + } +} diff --git a/liteflow-benchmark/liteflow-benchmark-script-javax-pro/src/test/resources/application.properties b/liteflow-benchmark/liteflow-benchmark-script-javax-pro/src/test/resources/application.properties new file mode 100644 index 000000000..970b6d155 --- /dev/null +++ b/liteflow-benchmark/liteflow-benchmark-script-javax-pro/src/test/resources/application.properties @@ -0,0 +1,3 @@ +liteflow.rule-source=flow.xml +liteflow.print-execution-log=false +liteflow.script-setting.javax-is-cache=false \ No newline at end of file diff --git a/liteflow-benchmark/liteflow-benchmark-script-javax-pro/src/test/resources/flow.xml b/liteflow-benchmark/liteflow-benchmark-script-javax-pro/src/test/resources/flow.xml new file mode 100644 index 000000000..e7130f23d --- /dev/null +++ b/liteflow-benchmark/liteflow-benchmark-script-javax-pro/src/test/resources/flow.xml @@ -0,0 +1,48 @@ + + + + + + personList = ListUtil.toList( + new Person("jack", 15000), + new Person("tom", 13500), + new Person("peter", 18600) + ); + + int totalSalary = personList.stream().mapToInt(Person::getSalary).sum(); + + ctx.setData("salary", 47100); + } + } + ]]> + + + + + THEN(s1); + + \ No newline at end of file diff --git a/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/java/com/yomahub/liteflow/benchmark/ScriptJavaxBenchmark.java b/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/java/com/yomahub/liteflow/benchmark/ScriptJavaxBenchmark.java index 02a8e52f3..bdb5f3957 100644 --- a/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/java/com/yomahub/liteflow/benchmark/ScriptJavaxBenchmark.java +++ b/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/java/com/yomahub/liteflow/benchmark/ScriptJavaxBenchmark.java @@ -49,18 +49,6 @@ public class ScriptJavaxBenchmark { flowExecutor.execute2Resp("chain1"); } - //LF动态创建组件和规则,并执行 - @Benchmark - public void test2(){ - String scriptContent = ResourceUtil.readUtf8Str("classpath:javaxScript.java"); - LiteFlowNodeBuilder.createScriptNode().setId("ds").setScript(scriptContent).build(); - - if(!FlowBus.containChain("chain2")){ - LiteFlowChainELBuilder.createChain().setChainId("chain2").setEL("THEN(ds)").build(); - } - flowExecutor.execute2Resp("chain2"); - } - public static void main(String[] args) throws RunnerException { Options opt = new OptionsBuilder() diff --git a/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/java/com/yomahub/liteflow/benchmark/cmp/BCmp.java b/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/java/com/yomahub/liteflow/benchmark/cmp/BCmp.java deleted file mode 100644 index 1dc6a517f..000000000 --- a/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/java/com/yomahub/liteflow/benchmark/cmp/BCmp.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - *

Title: liteflow

- *

Description: 轻量级的组件式流程框架

- * @author Bryan.Zhang - * @email weenyc31@163.com - * @Date 2020/4/1 - */ -package com.yomahub.liteflow.benchmark.cmp; - -import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeComponent; - -@LiteflowComponent("b") -public class BCmp extends NodeComponent { - - @Override - public void process() { - } - -} diff --git a/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/java/com/yomahub/liteflow/benchmark/cmp/CCmp.java b/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/java/com/yomahub/liteflow/benchmark/cmp/CCmp.java deleted file mode 100644 index 95ee9b80c..000000000 --- a/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/java/com/yomahub/liteflow/benchmark/cmp/CCmp.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - *

Title: liteflow

- *

Description: 轻量级的组件式流程框架

- * @author Bryan.Zhang - * @email weenyc31@163.com - * @Date 2020/4/1 - */ -package com.yomahub.liteflow.benchmark.cmp; - -import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeComponent; - -@LiteflowComponent("c") -public class CCmp extends NodeComponent { - - @Override - public void process() { - } - -} diff --git a/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/resources/flow.xml b/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/resources/flow.xml index 762bcf14c..379bd9023 100644 --- a/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/resources/flow.xml +++ b/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/resources/flow.xml @@ -41,35 +41,9 @@ } ]]> - - - - - - - - - THEN(FOR(s2).DO(THEN(a, b, c, s1)), SWITCH(s3).TO(a,b)); + THEN(s1); \ No newline at end of file diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptBooleanComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptBooleanComponent.java index 995563531..2f27ae0ab 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptBooleanComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptBooleanComponent.java @@ -1,6 +1,9 @@ package com.yomahub.liteflow.core; +import com.yomahub.liteflow.log.LFLog; +import com.yomahub.liteflow.log.LFLoggerManager; import com.yomahub.liteflow.script.ScriptExecuteWrap; +import com.yomahub.liteflow.script.ScriptExecutor; import com.yomahub.liteflow.script.ScriptExecutorFactory; /** @@ -11,17 +14,68 @@ import com.yomahub.liteflow.script.ScriptExecutorFactory; */ public class ScriptBooleanComponent extends NodeBooleanComponent implements ScriptComponent { + private final LFLog LOG = LFLoggerManager.getLogger(this.getClass()); + + private ScriptExecutor scriptExecutor; + @Override public boolean processBoolean() throws Exception { ScriptExecuteWrap wrap = this.buildWrap(this); - return (boolean) ScriptExecutorFactory.loadInstance() - .getScriptExecutor(this.getRefNode().getLanguage()) - .execute(wrap); + return (boolean) scriptExecutor.execute(wrap); } @Override public void loadScript(String script, String language) { - ScriptExecutorFactory.loadInstance().getScriptExecutor(language).load(getNodeId(), script); + LOG.info("load script for component[{}]", getDisplayName()); + scriptExecutor = ScriptExecutorFactory.loadInstance().getScriptExecutor(language); + scriptExecutor.load(getNodeId(), script); } + @Override + public boolean isAccess() { + ScriptExecuteWrap wrap = this.buildWrap(this); + return scriptExecutor.executeIsAccess(wrap); + } + + @Override + public boolean isContinueOnError() { + ScriptExecuteWrap wrap = this.buildWrap(this); + return scriptExecutor.executeIsContinueOnError(wrap); + } + + @Override + public boolean isEnd() { + ScriptExecuteWrap wrap = this.buildWrap(this); + return scriptExecutor.executeIsEnd(wrap); + } + + @Override + public void beforeProcess() { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeBeforeProcess(wrap); + } + + @Override + public void afterProcess() { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeAfterProcess(wrap); + } + + @Override + public void onSuccess() throws Exception { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeOnSuccess(wrap); + } + + @Override + public void onError(Exception e) throws Exception { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeOnError(wrap, e); + } + + @Override + public void rollback() throws Exception { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeRollback(wrap); + } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptCommonComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptCommonComponent.java index 81f6a6279..29429082c 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptCommonComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptCommonComponent.java @@ -3,14 +3,11 @@ package com.yomahub.liteflow.core; import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; import com.yomahub.liteflow.script.ScriptExecuteWrap; +import com.yomahub.liteflow.script.ScriptExecutor; import com.yomahub.liteflow.script.ScriptExecutorFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Map; /** - * 脚本组件类 + * 普通脚本组件类 * * @author Bryan.Zhang * @since 2.6.0 @@ -19,16 +16,66 @@ public class ScriptCommonComponent extends NodeComponent implements ScriptCompon private final LFLog LOG = LFLoggerManager.getLogger(this.getClass()); + private ScriptExecutor scriptExecutor; + @Override public void process() throws Exception { ScriptExecuteWrap wrap = this.buildWrap(this); - ScriptExecutorFactory.loadInstance().getScriptExecutor(this.getRefNode().getLanguage()).execute(wrap); + scriptExecutor.execute(wrap); } @Override public void loadScript(String script, String language) { LOG.info("load script for component[{}]", getDisplayName()); - ScriptExecutorFactory.loadInstance().getScriptExecutor(language).load(getNodeId(), script); + scriptExecutor = ScriptExecutorFactory.loadInstance().getScriptExecutor(language); + scriptExecutor.load(getNodeId(), script); } + @Override + public boolean isAccess() { + ScriptExecuteWrap wrap = this.buildWrap(this); + return scriptExecutor.executeIsAccess(wrap); + } + + @Override + public boolean isContinueOnError() { + ScriptExecuteWrap wrap = this.buildWrap(this); + return scriptExecutor.executeIsContinueOnError(wrap); + } + + @Override + public boolean isEnd() { + ScriptExecuteWrap wrap = this.buildWrap(this); + return scriptExecutor.executeIsEnd(wrap); + } + + @Override + public void beforeProcess() { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeBeforeProcess(wrap); + } + + @Override + public void afterProcess() { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeAfterProcess(wrap); + } + + @Override + public void onSuccess() throws Exception { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeOnSuccess(wrap); + } + + @Override + public void onError(Exception e) throws Exception { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeOnError(wrap, e); + } + + @Override + public void rollback() throws Exception { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeRollback(wrap); + } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptComponent.java index 77fa7ffe6..b72509142 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptComponent.java @@ -32,16 +32,16 @@ public interface ScriptComponent { */ void loadScript(String script, String language); - default ScriptExecuteWrap buildWrap(NodeComponent cmp){ + default ScriptExecuteWrap buildWrap(NodeComponent thisCmp) { ScriptExecuteWrap wrap = new ScriptExecuteWrap(); - wrap.setCurrChainId(cmp.getCurrChainId()); - wrap.setNodeId(cmp.getNodeId()); - wrap.setSlotIndex(cmp.getSlotIndex()); - wrap.setTag(cmp.getTag()); - wrap.setCmpData(cmp.getCmpData(Map.class)); - wrap.setLoopIndex(cmp.getLoopIndex()); - wrap.setLoopObject(cmp.getCurrLoopObj()); - wrap.setCmp(cmp); + wrap.setCurrChainId(thisCmp.getCurrChainId()); + wrap.setNodeId(thisCmp.getNodeId()); + wrap.setSlotIndex(thisCmp.getSlotIndex()); + wrap.setTag(thisCmp.getTag()); + wrap.setLoopIndex(thisCmp.getLoopIndex()); + wrap.setLoopObject(thisCmp.getCurrLoopObj()); + wrap.setCmpData(thisCmp.getCmpData(Map.class)); + wrap.setCmp(thisCmp); return wrap; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptForComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptForComponent.java index 345d2e761..036fe25cb 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptForComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptForComponent.java @@ -1,6 +1,9 @@ package com.yomahub.liteflow.core; +import com.yomahub.liteflow.log.LFLog; +import com.yomahub.liteflow.log.LFLoggerManager; import com.yomahub.liteflow.script.ScriptExecuteWrap; +import com.yomahub.liteflow.script.ScriptExecutor; import com.yomahub.liteflow.script.ScriptExecutorFactory; import java.util.Map; @@ -13,17 +16,68 @@ import java.util.Map; */ public class ScriptForComponent extends NodeForComponent implements ScriptComponent { + private final LFLog LOG = LFLoggerManager.getLogger(this.getClass()); + + private ScriptExecutor scriptExecutor; + @Override public int processFor() throws Exception { ScriptExecuteWrap wrap = this.buildWrap(this); - return (int) ScriptExecutorFactory.loadInstance() - .getScriptExecutor(this.getRefNode().getLanguage()) - .execute(wrap); + return (int) scriptExecutor.execute(wrap); } @Override public void loadScript(String script, String language) { - ScriptExecutorFactory.loadInstance().getScriptExecutor(language).load(getNodeId(), script); + LOG.info("load script for component[{}]", getDisplayName()); + scriptExecutor = ScriptExecutorFactory.loadInstance().getScriptExecutor(language); + scriptExecutor.load(getNodeId(), script); } + @Override + public boolean isAccess() { + ScriptExecuteWrap wrap = this.buildWrap(this); + return scriptExecutor.executeIsAccess(wrap); + } + + @Override + public boolean isContinueOnError() { + ScriptExecuteWrap wrap = this.buildWrap(this); + return scriptExecutor.executeIsContinueOnError(wrap); + } + + @Override + public boolean isEnd() { + ScriptExecuteWrap wrap = this.buildWrap(this); + return scriptExecutor.executeIsEnd(wrap); + } + + @Override + public void beforeProcess() { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeBeforeProcess(wrap); + } + + @Override + public void afterProcess() { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeAfterProcess(wrap); + } + + @Override + public void onSuccess() throws Exception { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeOnSuccess(wrap); + } + + @Override + public void onError(Exception e) throws Exception { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeOnError(wrap, e); + } + + @Override + public void rollback() throws Exception { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeRollback(wrap); + } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptSwitchComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptSwitchComponent.java index fa5aa3041..d318e9ad7 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptSwitchComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptSwitchComponent.java @@ -1,6 +1,9 @@ package com.yomahub.liteflow.core; +import com.yomahub.liteflow.log.LFLog; +import com.yomahub.liteflow.log.LFLoggerManager; import com.yomahub.liteflow.script.ScriptExecuteWrap; +import com.yomahub.liteflow.script.ScriptExecutor; import com.yomahub.liteflow.script.ScriptExecutorFactory; import java.util.Map; @@ -13,17 +16,68 @@ import java.util.Map; */ public class ScriptSwitchComponent extends NodeSwitchComponent implements ScriptComponent { + private final LFLog LOG = LFLoggerManager.getLogger(this.getClass()); + + private ScriptExecutor scriptExecutor; + @Override public String processSwitch() throws Exception { ScriptExecuteWrap wrap = this.buildWrap(this); - return (String) ScriptExecutorFactory.loadInstance() - .getScriptExecutor(this.getRefNode().getLanguage()) - .execute(wrap); + return (String) scriptExecutor.execute(wrap); } @Override public void loadScript(String script, String language) { - ScriptExecutorFactory.loadInstance().getScriptExecutor(language).load(getNodeId(), script); + LOG.info("load script for component[{}]", getDisplayName()); + scriptExecutor = ScriptExecutorFactory.loadInstance().getScriptExecutor(language); + scriptExecutor.load(getNodeId(), script); } + @Override + public boolean isAccess() { + ScriptExecuteWrap wrap = this.buildWrap(this); + return scriptExecutor.executeIsAccess(wrap); + } + + @Override + public boolean isContinueOnError() { + ScriptExecuteWrap wrap = this.buildWrap(this); + return scriptExecutor.executeIsContinueOnError(wrap); + } + + @Override + public boolean isEnd() { + ScriptExecuteWrap wrap = this.buildWrap(this); + return scriptExecutor.executeIsEnd(wrap); + } + + @Override + public void beforeProcess() { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeBeforeProcess(wrap); + } + + @Override + public void afterProcess() { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeAfterProcess(wrap); + } + + @Override + public void onSuccess() throws Exception { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeOnSuccess(wrap); + } + + @Override + public void onError(Exception e) throws Exception { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeOnError(wrap, e); + } + + @Override + public void rollback() throws Exception { + ScriptExecuteWrap wrap = this.buildWrap(this); + scriptExecutor.executeRollback(wrap); + } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java index a7715d0e2..14bf84afc 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java @@ -8,6 +8,7 @@ import com.yomahub.liteflow.exception.LiteFlowException; import com.yomahub.liteflow.lifecycle.LifeCycleHolder; import com.yomahub.liteflow.slot.DataBus; import com.yomahub.liteflow.slot.Slot; +import com.yomahub.liteflow.spi.holder.CmpAroundAspectHolder; import java.util.List; import java.util.Map; @@ -99,4 +100,36 @@ public abstract class ScriptExecutor { * @throws Exception 例外 */ public abstract Object compile(String script) throws Exception; + + public boolean executeIsAccess(ScriptExecuteWrap wrap){ + return true; + } + + public boolean executeIsContinueOnError(ScriptExecuteWrap wrap){ + return false; + } + + public boolean executeIsEnd(ScriptExecuteWrap wrap){ + return false; + } + + public void executeBeforeProcess(ScriptExecuteWrap wrap){ + CmpAroundAspectHolder.loadCmpAroundAspect().beforeProcess(wrap.getCmp()); + } + + public void executeAfterProcess(ScriptExecuteWrap wrap){ + CmpAroundAspectHolder.loadCmpAroundAspect().afterProcess(wrap.getCmp()); + } + + public void executeOnSuccess(ScriptExecuteWrap wrap) throws Exception{ + CmpAroundAspectHolder.loadCmpAroundAspect().onSuccess(wrap.getCmp()); + } + + public void executeOnError(ScriptExecuteWrap wrap, Exception e) throws Exception{ + CmpAroundAspectHolder.loadCmpAroundAspect().onError(wrap.getCmp(), e); + } + + public void executeRollback(ScriptExecuteWrap wrap) throws Exception{ + + } } diff --git a/liteflow-script-plugin/liteflow-script-javax-pro/pom.xml b/liteflow-script-plugin/liteflow-script-javax-pro/pom.xml new file mode 100644 index 000000000..d98bcf3ec --- /dev/null +++ b/liteflow-script-plugin/liteflow-script-javax-pro/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + com.yomahub + liteflow-script-plugin + ${revision} + ../pom.xml + + + liteflow-script-javax-pro + + + + com.yomahub + liteflow-core + ${revision} + true + provided + + + org.noear + liquor-eval + + + \ No newline at end of file diff --git a/liteflow-script-plugin/liteflow-script-javax-pro/src/main/java/com/yomahub/liteflow/script/javaxpro/JavaxProExecutor.java b/liteflow-script-plugin/liteflow-script-javax-pro/src/main/java/com/yomahub/liteflow/script/javaxpro/JavaxProExecutor.java new file mode 100644 index 000000000..a69e4a0a3 --- /dev/null +++ b/liteflow-script-plugin/liteflow-script-javax-pro/src/main/java/com/yomahub/liteflow/script/javaxpro/JavaxProExecutor.java @@ -0,0 +1,169 @@ +package com.yomahub.liteflow.script.javaxpro; + +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.ScriptTypeEnum; +import com.yomahub.liteflow.property.LiteflowConfig; +import com.yomahub.liteflow.property.LiteflowConfigGetter; +import com.yomahub.liteflow.script.ScriptExecuteWrap; +import com.yomahub.liteflow.script.ScriptExecutor; +import com.yomahub.liteflow.script.exception.ScriptLoadException; +import com.yomahub.liteflow.script.javaxpro.vo.JavaxProSettingMapKey; +import com.yomahub.liteflow.util.CopyOnWriteHashMap; +import org.noear.liquor.eval.CodeSpec; +import org.noear.liquor.eval.Scripts; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Javax语言执行器,基于liquor + * 和静态类完全一样的定义模式 + * @author Bryan.Zhang + * @since 2.13.0 + */ +public class JavaxProExecutor extends ScriptExecutor { + private final Map compiledScriptMap = new CopyOnWriteHashMap<>(); + + private boolean isCache; + + @Override + public ScriptExecutor init() { + LiteflowConfig liteflowConfig = LiteflowConfigGetter.get(); + String isCacheValue = liteflowConfig.getScriptSetting().get(JavaxProSettingMapKey.IS_CACHE); + isCache = Boolean.parseBoolean(isCacheValue); + //如果有生命周期则执行相应生命周期实现 + super.lifeCycle(null); + return this; + } + + @Override + public void load(String nodeId, String script) { + try{ + compiledScriptMap.put(nodeId, (NodeComponent) compile(script)); + }catch (InvocationTargetException e){ + String errorMsg = StrUtil.format("script loading error for node[{}],error msg:{}", nodeId, e.getTargetException().getMessage()); + throw new ScriptLoadException(errorMsg); + }catch (Exception e){ + String errorMsg = StrUtil.format("script loading error for node[{}],error msg:{}", nodeId, e.getMessage()); + throw new ScriptLoadException(errorMsg); + } + } + + @Override + public void unLoad(String nodeId) { + compiledScriptMap.remove(nodeId); + } + + @Override + public List getNodeIds() { + return new ArrayList<>(compiledScriptMap.keySet()); + } + + @Override + public Object executeScript(ScriptExecuteWrap wrap) throws Exception { + NodeComponent cmp = getExecutableCmp(wrap); + cmp.process(); + return cmp.getItemResultMetaValue(wrap.slotIndex); + } + + @Override + public void cleanCache() { + compiledScriptMap.clear(); + } + + @Override + public ScriptTypeEnum scriptType() { + return ScriptTypeEnum.JAVA; + } + + @Override + public Object compile(String script) throws Exception { + CodeSpec codeSpec = new CodeSpec(convertScript(script)) + .returnType(Object.class) + .cached(isCache); + return Scripts.eval(codeSpec); + } + + @Override + public boolean executeIsAccess(ScriptExecuteWrap wrap) { + NodeComponent cmp = getExecutableCmp(wrap); + return cmp.isAccess(); + } + + @Override + public boolean executeIsContinueOnError(ScriptExecuteWrap wrap) { + NodeComponent cmp = getExecutableCmp(wrap); + return cmp.isContinueOnError(); + } + + @Override + public boolean executeIsEnd(ScriptExecuteWrap wrap) { + NodeComponent cmp = getExecutableCmp(wrap); + return cmp.isEnd(); + } + + @Override + public void executeBeforeProcess(ScriptExecuteWrap wrap) { + NodeComponent cmp = getExecutableCmp(wrap); + cmp.beforeProcess(); + } + + @Override + public void executeAfterProcess(ScriptExecuteWrap wrap) { + NodeComponent cmp = getExecutableCmp(wrap); + cmp.afterProcess(); + } + + @Override + public void executeOnSuccess(ScriptExecuteWrap wrap) throws Exception { + NodeComponent cmp = getExecutableCmp(wrap); + cmp.onSuccess(); + } + + @Override + public void executeOnError(ScriptExecuteWrap wrap, Exception e) throws Exception { + NodeComponent cmp = getExecutableCmp(wrap); + cmp.onError(e); + } + + @Override + public void executeRollback(ScriptExecuteWrap wrap) throws Exception { + NodeComponent cmp = getExecutableCmp(wrap); + cmp.rollback(); + } + + private NodeComponent getExecutableCmp(ScriptExecuteWrap wrap){ + if (!compiledScriptMap.containsKey(wrap.getNodeId())) { + String errorMsg = StrUtil.format("script for node[{}] is not loaded", wrap.getNodeId()); + throw new ScriptLoadException(errorMsg); + } + NodeComponent cmp = compiledScriptMap.get(wrap.getNodeId()); + cmp.setRefNode(wrap.getCmp().getRefNode()); + cmp.setNodeId(wrap.getNodeId()); + cmp.setType(wrap.getCmp().getType()); + cmp.setSelf(cmp); + return cmp; + } + + private String convertScript(String script){ + //替换掉public,private,protected等修饰词 + String script1 = script.replaceAll("public class", "class") + .replaceAll("private class", "class") + .replaceAll("protected class", "class"); + + //分析出class的具体名称 + String className = ReUtil.getGroup1("class\\s+(\\w+)\\s+(implements|extends)", script1); + + if (StrUtil.isBlank(className)){ + throw new RuntimeException("cannot find class defined"); + } + + return script1 + "\n" + + StrUtil.format("{} item = new {}();\n", className, className) + + "return item;"; + } +} diff --git a/liteflow-script-plugin/liteflow-script-javax-pro/src/main/java/com/yomahub/liteflow/script/javaxpro/vo/JavaxProSettingMapKey.java b/liteflow-script-plugin/liteflow-script-javax-pro/src/main/java/com/yomahub/liteflow/script/javaxpro/vo/JavaxProSettingMapKey.java new file mode 100644 index 000000000..d85a34c30 --- /dev/null +++ b/liteflow-script-plugin/liteflow-script-javax-pro/src/main/java/com/yomahub/liteflow/script/javaxpro/vo/JavaxProSettingMapKey.java @@ -0,0 +1,11 @@ +package com.yomahub.liteflow.script.javaxpro.vo; + +/** + * Javax语言特殊配置项的Key + * @author Bryan.Zhang + * @since 2.12.4 + */ +public interface JavaxProSettingMapKey { + + String IS_CACHE = "javax-is-cache"; +} diff --git a/liteflow-script-plugin/liteflow-script-javax-pro/src/main/resources/META-INF/services/com.yomahub.liteflow.script.ScriptExecutor b/liteflow-script-plugin/liteflow-script-javax-pro/src/main/resources/META-INF/services/com.yomahub.liteflow.script.ScriptExecutor new file mode 100644 index 000000000..9e476d2cf --- /dev/null +++ b/liteflow-script-plugin/liteflow-script-javax-pro/src/main/resources/META-INF/services/com.yomahub.liteflow.script.ScriptExecutor @@ -0,0 +1,2 @@ +# Javax-pro的实现 +com.yomahub.liteflow.script.javaxpro.JavaxProExecutor \ No newline at end of file diff --git a/liteflow-script-plugin/liteflow-script-javax/src/main/java/com/yomahub/liteflow/script/javax/JavaxExecutor.java b/liteflow-script-plugin/liteflow-script-javax/src/main/java/com/yomahub/liteflow/script/javax/JavaxExecutor.java index 91a9a0b52..3a17fd7f6 100644 --- a/liteflow-script-plugin/liteflow-script-javax/src/main/java/com/yomahub/liteflow/script/javax/JavaxExecutor.java +++ b/liteflow-script-plugin/liteflow-script-javax/src/main/java/com/yomahub/liteflow/script/javax/JavaxExecutor.java @@ -1,6 +1,5 @@ package com.yomahub.liteflow.script.javax; -import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.enums.ScriptTypeEnum; diff --git a/liteflow-script-plugin/pom.xml b/liteflow-script-plugin/pom.xml index a188cd04b..9c8a62031 100644 --- a/liteflow-script-plugin/pom.xml +++ b/liteflow-script-plugin/pom.xml @@ -23,7 +23,9 @@ liteflow-script-lua liteflow-script-aviator liteflow-script-java + liteflow-script-javax liteflow-script-kotlin + liteflow-script-javax-pro \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/pom.xml b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/pom.xml new file mode 100644 index 000000000..d23f69e71 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + liteflow-testcase-el + com.yomahub + ${revision} + ../pom.xml + + + liteflow-testcase-el-script-javaxpro-springboot + + + + com.yomahub + liteflow-spring-boot-starter + ${revision} + + + com.yomahub + liteflow-script-javax-pro + ${revision} + test + + + org.springframework.boot + spring-boot-starter-test + + + com.alibaba.fastjson2 + fastjson2 + 2.0.39 + + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/BaseTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/BaseTest.java new file mode 100644 index 000000000..891764c42 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/BaseTest.java @@ -0,0 +1,26 @@ +package com.yomahub.liteflow.test; + +import com.yomahub.liteflow.core.FlowInitHook; +import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.lifecycle.LifeCycleHolder; +import com.yomahub.liteflow.property.LiteflowConfigGetter; +import com.yomahub.liteflow.spi.holder.SpiFactoryInitializing; +import com.yomahub.liteflow.spring.ComponentScanner; +import com.yomahub.liteflow.thread.ExecutorHelper; +import org.junit.jupiter.api.AfterAll; + +public class BaseTest { + + @AfterAll + public static void cleanScanCache() { + ComponentScanner.cleanCache(); + FlowBus.cleanCache(); + ExecutorHelper.loadInstance().clearExecutorServiceMap(); + SpiFactoryInitializing.clean(); + LiteflowConfigGetter.clean(); + FlowInitHook.cleanHook(); + FlowBus.clearStat(); + LifeCycleHolder.clean(); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/ScriptJavaxProCommonELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/ScriptJavaxProCommonELTest.java new file mode 100644 index 000000000..cfb4caa83 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/ScriptJavaxProCommonELTest.java @@ -0,0 +1,43 @@ +package com.yomahub.liteflow.test.script.javaxpro.common; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.slot.DefaultContext; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; + +@ExtendWith(SpringExtension.class) +@TestPropertySource(value = "classpath:/common/application.properties") +@SpringBootTest(classes = ScriptJavaxProCommonELTest.class) +@EnableAutoConfiguration +@ComponentScan({ "com.yomahub.liteflow.test.script.javaxpro.common.cmp" }) +public class ScriptJavaxProCommonELTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + @Test + public void testCommon1() { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals(6, (int)context.getData("s1")); + Assertions.assertEquals("hello,jack", context.getData("hi")); + Assertions.assertEquals(47100, (Integer) context.getData("salary")); + } + + @Test + public void testCommon2() { + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + } +} diff --git a/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/java/com/yomahub/liteflow/benchmark/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/ACmp.java similarity index 78% rename from liteflow-benchmark/liteflow-benchmark-script-javax/src/test/java/com/yomahub/liteflow/benchmark/cmp/ACmp.java rename to liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/ACmp.java index 8c9d02813..1f7eea3b0 100644 --- a/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/java/com/yomahub/liteflow/benchmark/cmp/ACmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/ACmp.java @@ -5,7 +5,7 @@ * @email weenyc31@163.com * @Date 2020/4/1 */ -package com.yomahub.liteflow.benchmark.cmp; +package com.yomahub.liteflow.test.script.javaxpro.common.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeComponent; @@ -15,6 +15,7 @@ public class ACmp extends NodeComponent { @Override public void process() { + System.out.println("ACmp executed!"); } } diff --git a/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/BCmp.java similarity index 78% rename from liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/cmp/BCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/BCmp.java index 1dc6a517f..1d9fa6b03 100644 --- a/liteflow-benchmark/liteflow-benchmark-common/src/test/java/com/yomahub/liteflow/benchmark/cmp/BCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/BCmp.java @@ -5,7 +5,7 @@ * @email weenyc31@163.com * @Date 2020/4/1 */ -package com.yomahub.liteflow.benchmark.cmp; +package com.yomahub.liteflow.test.script.javaxpro.common.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeComponent; @@ -15,6 +15,7 @@ public class BCmp extends NodeComponent { @Override public void process() { + System.out.println("BCmp executed!"); } } diff --git a/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/java/com/yomahub/liteflow/benchmark/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/CCmp.java similarity index 78% rename from liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/java/com/yomahub/liteflow/benchmark/cmp/CCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/CCmp.java index 95ee9b80c..5d7e4df06 100644 --- a/liteflow-benchmark/liteflow-benchmark-script-groovy/src/test/java/com/yomahub/liteflow/benchmark/cmp/CCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/CCmp.java @@ -5,7 +5,7 @@ * @email weenyc31@163.com * @Date 2020/4/1 */ -package com.yomahub.liteflow.benchmark.cmp; +package com.yomahub.liteflow.test.script.javaxpro.common.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeComponent; @@ -15,6 +15,7 @@ public class CCmp extends NodeComponent { @Override public void process() { + System.out.println("CCmp executed!"); } } diff --git a/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/java/com/yomahub/liteflow/benchmark/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/DCmp.java similarity index 83% rename from liteflow-benchmark/liteflow-benchmark-script-javax/src/test/java/com/yomahub/liteflow/benchmark/cmp/DCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/DCmp.java index d78b2ea33..68ff6f790 100644 --- a/liteflow-benchmark/liteflow-benchmark-script-javax/src/test/java/com/yomahub/liteflow/benchmark/cmp/DCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/DCmp.java @@ -5,7 +5,7 @@ * @email weenyc31@163.com * @Date 2020/4/1 */ -package com.yomahub.liteflow.benchmark.cmp; +package com.yomahub.liteflow.test.script.javaxpro.common.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeComponent; @@ -18,6 +18,7 @@ public class DCmp extends NodeComponent { public void process() { DefaultContext context = this.getFirstContextBean(); context.setData("count", 198); + System.out.println("DCmp executed!"); } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/Person.java b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/Person.java new file mode 100644 index 000000000..f936bf185 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/Person.java @@ -0,0 +1,28 @@ +package com.yomahub.liteflow.test.script.javaxpro.common.cmp; + +public class Person { + private String name; + + private Integer salary; + + public Person(String name, Integer salary) { + this.name = name; + this.salary = salary; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getSalary() { + return salary; + } + + public void setSalary(Integer salary) { + this.salary = salary; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/TestDomain.java b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/TestDomain.java new file mode 100644 index 000000000..47d74b41d --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/java/com/yomahub/liteflow/test/script/javaxpro/common/cmp/TestDomain.java @@ -0,0 +1,25 @@ +package com.yomahub.liteflow.test.script.javaxpro.common.cmp; + +import cn.hutool.core.collection.ListUtil; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class TestDomain { + + public String sayHello(String name){ + return "hello," + name; + } + + public static void main(String[] args) { + List personList = ListUtil.toList( + new Person("jack", 15000), + new Person("tom", 13500), + new Person("peter", 18600) + ); + + int totalSalary = personList.stream().mapToInt(Person::getSalary).sum(); + System.out.println(totalSalary); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/resources/common/application.properties b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/resources/common/application.properties new file mode 100644 index 000000000..4c9c216b6 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/resources/common/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=common/flow.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/resources/common/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/resources/common/flow.xml new file mode 100644 index 000000000..1ec745e75 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javaxpro-springboot/src/test/resources/common/flow.xml @@ -0,0 +1,119 @@ + + + + + + personList = ListUtil.toList( + new Person("jack", 15000), + new Person("tom", 13500), + new Person("peter", 18600) + ); + + int totalSalary = personList.stream().mapToInt(Person::getSalary).sum(); + + System.out.println(totalSalary); + ctx.setData("salary", 47100); + } + } + ]]> + + + + + + + + + + + + + + + + + + + + + THEN(FOR(s2).DO(THEN(a, b, c, s1)), SWITCH(s3).TO(a,b)); + + + + THEN(t1.tag("1111"), t2.data("{\"name\":\"jack\",\"age\":31}")); + + \ No newline at end of file diff --git a/liteflow-testcase-el/pom.xml b/liteflow-testcase-el/pom.xml index e2a579d8d..72352a2e4 100644 --- a/liteflow-testcase-el/pom.xml +++ b/liteflow-testcase-el/pom.xml @@ -44,6 +44,7 @@ liteflow-testcase-el-sql-solon liteflow-testcase-el-script-javax-springboot liteflow-testcase-el-sql-springboot-sharding-jdbc + liteflow-testcase-el-script-javaxpro-springboot diff --git a/pom.xml b/pom.xml index a2a7a9895..8ca095157 100644 --- a/pom.xml +++ b/pom.xml @@ -451,7 +451,8 @@ liteflow-el-builder liteflow-script-plugin/liteflow-script-javax liteflow-benchmark - + liteflow-benchmark/liteflow-benchmark-script-javax-pro +