opipe是一个“命令”管道,其设计思路与linux的命令管道一致。不同的是,linux的命令管道串联了一组命令,命令间是以输入、输出流串联在一起的。而opipe实际为一个操作(函数)的管道,操作间以返回值及调用参数的方式串联在一起,即opipe会用前一个操作的返回值作为输入参数调用后一个操作,并重复这样的调度直到整个管道中的所有操作都执行完成。opipe是由短语operation pipe变化而来。其中operation在opipe中被表示为一个函数形式;多个operation用符号”|”进行串联构成一个管道,格式如下:

“operation1 | operation2 | ……”

operation实现时采用了moql的Function技术,每个operation其实就是一个Function。但由于Function技术只接受EntityMap类型的参数,故opipe方法重新定义了一个接口operation,该接口可以接受一个Object类型的参数,这样方便使用者根据需要去扩展operation的实现。但需要注意的是,使用者需要确保管道中的operation的返回值能够成功作为下一个operation的调用参数。

public interface Operation {Object operate(Object in);
}

opipe中有两种采用了moql Function技术的概念。一种是operation;一种是function。operation实现了Operation接口,能够通过管道符串接为一个调用管道;而function不能进行串联,它被视为一种opipe能力的有效补充。因为function实现的返回值没有特定的约束,所以它有更广泛的应用环境,它可以在operation中被嵌套调用,如:对某个operation的输入参数进行特殊的预处理等。如下:

assignment(ipAndPort, strFormat('%s:%s', ip, port))

assignment是一个operation,而strFormat是一个function。

下面是关于opipe的一个完整的示例:

String s = "2019-10-26 192.1.32.4:8081";
String pipeline ="regParse('data','(?<time>[^\\s]+)\\s(?<ip>[^:]+):(?<port>\\d+)') "
- "| assignment(ipAndPort, strFormat('%s:%s', ip, port)) "
- "| printOut(strFormat('%s %s', ipAndPort, time))";
try {Opipe opipe = OpipeBuilder.createOpipe(pipeline);EntityMap entityMap = new EntityMapImpl();entityMap.putEntity("data", s);opipe.operate(entityMap);
} catch (MoqlException e) {e.printStackTrace();
}

在例子中regParse、assignment以及printOut三个operation被串接为一个管道。regParse的功能为将输入的字符串按照正则表达式的描述捕获为一个EntityMap;示例中该EntityMap内包含4个键值对,它们的key分别为time、ip、port及data。assignment为赋值操作,参数1为待赋值变量的名字,参数2为值,赋值完成后,它们将作为一个键值对写入输入的EntityMap中并返回;strFormat为字符串格式化函数(参见:JDK关于String.format的相关说明)。示例中assignment执行后EntitMap中会多出一个名为ipAndPort,值为192.1.32.4:8081的键值对。printOut为一个打印输出操作,它将输入的对象打印输出到控制台。示例最后的输出为“192.1.32.4:8081 2019-10-26”。

opipe项目只提供了几个简单的操作实现,主要是为了方便开发者理解这个设计思路。开发者可以在理解后,根据自己的应用需要去扩展operation或function。并可通过调用OpipeBuilder的registFunction注册自己的operation或function。

opipe的项目路径:https://github.com/colorknight/opipe

opipe--一款基于java的自定义“命令”管道相关推荐

  1. QQRobot一款基于Java的娱乐qq机器人

    QQRobot一款基于Java的娱乐qq机器人 git地址:https://gitee.com/tysong1/QQRobot/tree/master AD:上QQ群214580864购买服务器享优惠 ...

  2. JAVA套料程序_Nest4J是一款基于Java作为开发语言的Nest算法包

    Nest4J Nest4J是一款基于Java作为开发语言的Nest算法包.可以看做一款能在服务端进行运行计算的Nest算法库. 基于SVGNest进行了Java化的改造. 同样这也作为了我本科的毕业设 ...

  3. java 幻影_幻影(Phantom)消息平台,是一款基于Java实现的即时通讯(IM)系统

    Phantom-Platform 介绍 幻影(Phantom)消息平台,是一款基于Java实现的即时通讯(IM)系统. 提供支持单聊.群聊.SDK等通用的技术通讯组件,开箱即用. 软件架构 构建 项目 ...

  4. H2:一款基于 Java 的嵌入式关系型数据库

    文章目录 H2 简介 下载安装 执行 SQL 语句 查看帮助 运行 SQL 脚本 生成 DDL 语句 断开数据库连接 连接模式 命令行客户端 Maven 依赖 资源文档 总结 大家好,我是只谈技术不剪 ...

  5. 一款基于 Java 的可视化 HTTP API 接口开发神器

    今天推荐的 5 个项目是: magic-api :一款基于 Java 的可视化 HTTP API 接口开发神器. LanguageTool : 一款基于 Java 语言编写的开源语言校正工具. toB ...

  6. 一款基于ExoPlayer的自定义播放器(已开源)

    一.基于ExoPlayer 自定义播放器 JPlayer支持功能: 1 ExoUserPlayer 基本播放. 2 GestureVideoPlayer 增加手势 亮度,音量,快进,等手势. 3 Ma ...

  7. 基于java调用adb命令安卓shell里面Read-only file system 问题解决

    当我们在安卓内部使用shell命令的时候会出现Read-only file system 我是root权限但是还是不行.如何解决? 1|rk3368_box:/system/app $ cp -f / ...

  8. 一款基于java的超级棒的开源支付系统(用来毕设也不错),国内首款开源的互联网支付系统

    最近年初刚开始了,小编想着应该会有很多公司开始冲一波今年的业绩,既然是冲业绩,就离不开我们的支付系统,所以小编就去网上给大家找到了一款超级棒的开源支付系统!帮助大家从头到尾了解清楚这其中的逻辑! 所以 ...

  9. 基于java语言轻量级实时风控引擎

    介绍: radar是一款基于java语言,使用Springboot + Mongodb + Groovy + Es等框架搭建的轻量级实时风控引擎,适用于反欺诈应用场景,极简的配置,真正做到了开箱即用. ...

最新文章

  1. 尹伊:我眼中的Datawhale
  2. php自动轮播图代码,JavaScript如何实现动态轮播图效果?(代码示例)
  3. python如何打开文件编辑界面_Python-PyQt5-图形可视化界面(5)--打开文件或文件夹--QFileDialog...
  4. eclipse - unresolved inclusion: stdio.h
  5. 为什么要设置Java环境变量(详解)
  6. 网络软文发布软件_星浪中合网软文写出爆款汽车营销软文的特点是什么?
  7. 罗格斯大学电子与计算机系排名,罗格斯大学美国大学排名及专业排名汇总(USNEWS美国大学排名版)...
  8. 关于数组方面的算法分析
  9. css a4纸_一把刀、一张2毛钱的纸,刻出的动物太逼真,一幅卖上千美元
  10. # 2017-2018-1 20155224 《信息安全系系统设计基础》第四周MyOD
  11. 2015蓝桥杯C++A:牌型种数(分配问题)
  12. Java+jquery+jsonp实现跨域
  13. 大白话聊聊Java并发面试问题之谈谈你对AQS的理解?
  14. Quartz配置文件quartz.properties加载
  15. python为什么被称为胶水语言_为什么Python被称为“胶水语言”?
  16. 上班划水,给男朋友做个数字炸弹游戏
  17. NULL, '\0',0 '0'的区别
  18. 基于STC89C51单片机,CH340芯片的下载电路
  19. JavaEE项目实战_流程审批之二
  20. spring cloud alibaba整合sentinel

热门文章

  1. [C#-Util]-读写文件汉字乱码
  2. 如何增加虚拟机ubuntu的硬盘
  3. Tensorflow(r1.4)API--tf.nn.max_pool
  4. 《高质量C/C++编程指南》学习笔记
  5. python 多线程 异步_python 多线程异步
  6. defender 报备_微软Defender获AV-TEST杀软评测最高分
  7. springboot主线程_springboot中的多线程.md
  8. ios 数字键盘左下角添加按钮_ios数字键盘添加完成按钮
  9. python程序设计常见运算符号_python常用运算符
  10. python json操作_Python读取JSON数据操作实例解析