🍣脚本与Java进行交互
提示
这章只适用于groovy,js,python,qlexpress,lua,aviator这6种脚本语言。
v2.11.0新增的Java脚本语言和Java类的交互方式在Java脚本引擎中已做了详细说明。
# 和上下文进行交互
因为LiteFlow组件与组件之间的数据交互都在上下文中,所以在脚本语言中,你可以通过你定义数据上下文的className的驼峰形式来获取数据。
比如你的上下文类叫OrderContext
,那么脚本中的就用orderContext
这个关键字来获取数据或调用方法。
如果你是多上下文,同样的,你也可以在脚本中用多个上下文来获取数据或调用context内部的逻辑方法。
比如,你想获取UserContext
中的userName
对象。你可以这样写(以下以groovy作例子):
<node id="s1" name="普通脚本" type="script">
<![CDATA[
//你可以这样定义
def name = userContext.userName;
//也可以这样定义,如果你对userName有getter方法的话
def name = userContext.getUserName();
//同理,你可以调用数据上下文中的任意方法
userContext.doYourMethod();
]]>
</node>
# 自定义上下文引用名称
上文提到,在脚本中默认的上下文引用规则为上下文类的simpleClassName,比如你的上下文为UserContext
,那么脚本就用userContext
去引用。
那么可不可以自定义这个上下文的名称呢?
可以。LiteFlow从2.10.0版本开始支持这个功能,如果你不想用userContext
来引用,那么只需加一个@ContextBean
的注解即可完成:
@ContextBean("userCxt")
public class UserContext {
...
}
这样定义后,那么脚本中,你就可以用userCtxt
关键字去引用上下文了。
# 元数据
在脚本中可以用通过_meta
关键字获取元数据,可以通过_meta.xxx
获取元数据,元数据里包括:
- slotIndex: slot下标,可以通过FlowBus.getSlot(slotIndex)来获得slot数据
- currChainId: 当前执行chain的名称
- nodeId: 当前执行node的Id
- tag: tag值,关于tag的说明请查看组件标签
- cmpData: 组件规则参数,关于cmpData的说明请查看组件参数
- loopIndex: 在循环中的循环下标
- loopObject: 在迭代循环中的循环对象
- requestData: 流程初始参数
- subRequestData: 当前隐式流程的入参,如果此节点编排在隐式流程里的话,能获取到,反之不能
# 和自定义的JavaBean进行交互
LiteFlow从v2.9.0开始支持在脚本中注入你自己定义的任何java对象。
在spring体系中,你只需要在你需要注入的java对象上使用@ScriptBean
标注,即可完成注入。
@Component
@ScriptBean("demo")
public class DemoBean1 {
@Resource
private DemoBean2 demoBean2;
public String getDemoStr1(){
return "hello";
}
public String getDemoStr2(String name){
return demoBean2.getDemoStr2(name);
}
}
以上例子中,脚本里就可以直接使用demo
关键字来调用getDemoStr1()
和getDemoStr2()
方法了。
我们在LiteFlow 2.9.5版本支持了@ScriptBean
的指定方法和排除方法功能。
如果你想指定这个类中的某2个方法可以被脚本访问到,你可以这样写:
@Component
@ScriptBean(name = "demo", includeMethodName = {"test1","test2"})
public class DemoBean3 {
public String test1(String name){
...
}
public String test2(String name){
...
}
public String test3(String name){
...
}
}
这样你在脚本中只能访问test1
和test2
方法。
如果你想指定这个类中的某些访问无法被脚本访问到,你可以这样写:
@Component
@ScriptBean(name = "demo", excludeMethodName = {"test2","test3"})
public class DemoBean4 {
public String test1(String name){
...
}
public String test2(String name){
...
}
public String test3(String name){
...
}
}
这样你在脚本中只能访问到test1
方法了。
提示
需要注意的是,java对象在spring体系中一定要注册进上下文,如果不注册进上下文,光加@ScriptBean
注解也是没用的。
在非spring体系下面,如果你要把自己的定义的java对象注入脚本,则需要手动写代码(最好在启动应用的时候):
ScriptBeanManager.addScriptBean("demo", new DemoBean());
# 直接注入方法
如果你有一个java类,里面有100个方法,而我只想暴露其1个给脚本使用,用@ScriptBean
可能会把整个bean都暴露出去,有没有方法呢?
有。LiteFlow从2.9.5开始加入了@ScriptMethod
注解,在方法上进行标注:
@Component
public class DemoBean1 {
@ScriptMethod("demo")
public String getDemoStr1() {
return "hello";
}
public String method2() {
...
}
public String method3() {
...
}
...
}
这样,你就可以在脚本中用demo.getDemoStr1()
来调用到相应的java方法了。
提示
当然这里的前提同样是:java对象在spring体系中一定要注册进上下文,如果不注册进上下文,光加@ScriptMethod
注解也是没用的。