记录工作中groovy动态生成Flink任务
工作中的痛点:有一个计算的任务,需要配置成前端配置好一些简单的信息,例如名字,计算间隔,计算规则(这个是需要提前写好,开放给用户选择的),然后通过提交到我们的计算引擎中心生成对应的任务jar包提交到服务器上去计算(Flink+groovy)
我这里仅仅记录流程和关键点。
1:将前端传入引擎的信息进行封装
// 解析定义的参数,并封装运算脚本所需的其他参数值(key-value形式)。
Map<String, Object> ruleParams = parseParamsToMap(taskDef.getRuleParams()); //接下来就是个中封装数据 等等 ,下面粗略的给了一个脚本内容 内容就是计算的方法 scriptContentInfo就是计算方法中需要的一些参数
ruleParams.put("ScriptContentInfo",taskDef.ScriptContentInfo);
2:自行构建一个groovy的脚本类
class GetRuleTask {
static void getJobInfo(String ruleName, String scriptContentBody, Map<String, Object> inputParams, String gScriptPath){
// gScriptPath 是脚本所在的路径 通常是idea是放在resource下面,ruleName是创建动态任务类的方法名,scripteContenBody就是类的方法体 inputParams就是方法中使用到的各种参数
GroovyScriptEngine engine = new GroovyScriptEngine(gScriptPath);
Binding bind = new Binding();
bind.setVariable("ScriptContentBody",ScriptContentBody);
bind.setVariable("ruleName", ruleName);
bind.setVariable("inputParams", inputParams);
//CodeLoader下面会介绍,是一个将参数和类绑定在一起生成完整类的操作
engine.run("CodeLoader.groovy",bind);
AnnotationConfigApplicationContext cxt = new AnnotationConfigApplicationContext();
cxt.scan("com.my.boke.boven.loader");
cxt.refresh();
//这个地方的RuleSet.class 下面会介绍,就是动态生成的类
RuleSet rules = cxt.getBean(RuleSet.class);
//调用动态类的动态方法
rules.invokeMethod(ruleName, null);
3:提前创建一个空类 RuleSet
package com.my.boke.boven.loader
class RuleSet {
}
4:CodeLoader介绍
ScriptEngineManager factory = new ScriptEngineManager()
ScriptEngine engine = factory.getEngineByName("groovy")
// 绑定规则的输入参数
Bindings binds = engine.createBindings();
for (Entry<String, Object> entry : inputParams.entrySet()) {
binds.put(entry.getKey(), entry.getValue());
}
//导入参数所用的到的所有包,其实也不多,也就10几个。
def code_import = """import com.my.boke.boven.common.*;
import com.alibaba.fastjson.JSONObject;
...
...
...
;\n""" //这个地方就是将方法包和方法体进行一个绑定,生成一个完整类
Reader reader = new StringReader(code_import + methodBody);
RuleSet.metaClass.'static'."${methodName}" = {
->
engine.eval(reader, binds)
}
我故意将2步骤写在了前面,就是想体现一点,其实我们的服务运行当中,如果没有启动任务的时候,类中的方法是不存在的,只有当我启动的时候才会去动态的生成。
到这一步只需要remote将jar包提交到flink即可。
以上只提供思路,具体实现根据自己业务实现。
记录工作中groovy动态生成Flink任务的更多相关文章
- jQuery EasyUI中DataGird动态生成列的方法
EasyUI中使用DataGird显示数据列表中,有时需要根据需要显示不同的列,例如,在权限管理中,不同的用户登录后只能查看自己权限范围内的列表字段,这就需要DataGird动态组合列,下面介绍Eas ...
- Delphi 如何在程序中执行动态生成的Delphi代码
如何在程序中执行动态生成的Delphi代码 经常发现有人提这类问题,或者提问内容最后归结成这种问题 前些阵子有位高手写了一个“执行动态生成的代码”,这是真正的高手,我没那种功力,我只会投机取巧. 这里 ...
- 如何在程序中执行动态生成的Delphi代码
如何在程序中执行动态生成的Delphi代码 经常发现有人提这类问题,或者提问内容最后归结成这种问题 前些阵子有位高手写了一个“执行动态生成的代码”,这是真正的高手,我没那种功力,我只会投机取巧. 这里 ...
- 记录工作中遇到的BUG,经典的数据库时区问题和字段类型tinyint(1)问题
记录工作中发现的相对而言经典的问题 [数据库时区问题] 我个人数据库配置为CST 如下 我们测试环境的数据库配置为UTC 如下 倘若我修改了测试环境数据库时区为CST.由此造成的问题是 系统读取到数据 ...
- 随机记录工作中常见的sql用法错误(一)
没事开始写博客,留下以前工作中常用的笔记,内容不全或者需要补充的可以留言,我只写我常用的. 网上很多类似动软生成器的小工具,这类工具虽然在表关系复杂的时候没什么软用,但是在一些简单的表结构关系还是很方 ...
- 个人工作记录---工作中遇到的sql查询语句解析
在工作中写了人生的第一个查询语句,虽然是在原有基础上改的,但仍然学到了不少知识 代码: select distinct m.id, (select z.jianc from model_zuzjg z ...
- vue中v-model动态生成的实例详解
每一行有一个input和一个select,其中行数是根据服务器返回的json数据动态变化的.那么问题来了,我们要怎样动态生成v-model? <template> <div> ...
- Ext.net中TreePanel动态生成
这个问题可以参考官网例子:http://examples2.ext.net/#/TreePanel/Basic/Built_in_CodeBehind/ 贴一段本人程序中用到的动态生成核心代码: Ex ...
- [前端] 记录工作中遇到的各种问题(Bug,总结,记录)
最近一年,在开发实践过程中遇到了不少问题,大多都能得到解决 部分知其原理,部分只能做到解决问题,而半年前遇到的问题,或多或少都忘得差不多了 是该记录一下一些问题,防止再遇到就得再查资料了 1. 浏览器 ...
随机推荐
- StudyAndroid.2 Activity生命周期
onCreate(): 当我们点击activity的时候,系统会调用activity的oncreate()方法,在这个方法中我们会初始化当前布局setContentLayout()方法. onStar ...
- 使用.Net Core CLI命令dotnet new创建自定义模板
文章起源来自一篇博客:使用 .NET CORE 创建 项目模板,模板项目,Template - DeepThought - 博客园 之前使用Abp的时候就很认同Abp创建模板项目的方式.想不到.Net ...
- [WPF自定义控件库] 关于ScrollViewr和滚动轮劫持(scroll-wheel-hijack)
1. 什么是滚动轮劫持 这篇文章介绍一个很简单的继承自ScrollViewer的控件: public class ExtendedScrollViewer : ScrollViewer { prote ...
- 12款好用超赞的国外搜索资源网站 ,开发者们的标配,你都知道吗?不知道就OUT了
简介 看了 看了网上有好多推荐插件的文章,很少有推荐搜索资源网站,于是今天决定推荐一波搜索资源网站.这些网站带给我开阔视眼增长知识.所以在这里整理一下,分享给朋友和博友们. 学习技术过程我们经常需要使 ...
- silverlight中递归构造无限级树treeview+checkbox
两个实体,其实一个实体也能构造出来,我这里是为了增加一个 checkbox //第一个实体 public class person { public int no { get; set; } publ ...
- Leetcode之深度优先搜索(DFS)专题-494. 目标和(Target Sum)
Leetcode之深度优先搜索(DFS)专题-494. 目标和(Target Sum) 深度优先搜索的解题详细介绍,点击 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S.现在 ...
- codeblocks中文乱码原因及解决办法
原因:(本地化做得不够好)默认情况下codeblocks编辑器保存源文件是保存为windows本地编码,就是WINDOWS-936字符集,即GBK:但CB的编辑器在默认编辑的时候是按照UTF-8来解析 ...
- 前端项目升级到React-router5中遇到的问题解决方案以及思路
我胡汉三有日子没回来写写文章了,最近一直再忙着将老项目升级,所以没时间来搞文章,今天突然感觉开了挂一样,爱因斯坦附体,把之前的bug都搞定了,在这里特意把升级中遇到的问题,记录下来,算是把这个坑填上. ...
- session一致性的解决方案
更多内容,欢迎关注微信公众号:全菜工程师小辉.公众号回复关键词,领取免费学习资料. 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文,这个相 ...
- redis六种内存淘汰策略学习
当客户端会发起需要更多内存的申请,Redis检查内存使用情况,如果实际使用内存已经超出maxmemory,Redis就会根据用户配置的淘汰策略选出无用的key; 当前Redis3.0版本支持的淘汰策略 ...