介绍

Fig 是为了简化多线程开发和多台服务器间实现数据多流水线运行的平台(需要redis进行多服务器的数据共享)通过Fig可以加快数据的处理速度 尤其适合开发多线程爬虫程序 Fig 在开发多线程程序时 ,需要继承Fig类,并在需要执行的方法上声明@task注解 (Fig 还支持使用JavaScript,jython,Groovy,clojure开发Fig任务模块,使用脚本语言开发模块时,脚本语言中的函数名为任务名,Groovy脚本除外)接下来通过一个demo讲解一下Fig框架在java中的具体使用方法。

Fig git地址 : https://gitee.com/iproject/fig

Fig 的 Demo 讲解
    我们先看一下具体的代码:

package com.github.test.price;import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;import com.github.taomus.fig.core.engine.Data;
import com.github.taomus.fig.core.engine.Fig;
import com.github.taomus.fig.core.engine.FigEngine;
import com.github.taomus.fig.core.engine.Scheduler;
import com.github.taomus.fig.core.engine.Task;//定义个Fig模块类 该类必须继承Fig类才能被FigEngine运行引擎识别
public class PriceComparison extends Fig {public static void main(String[] args) throws InterruptedException {//向FigEngine引擎注册运行模块FigEngine fig = new FigEngine();fig.addModule(PriceComparison.class);Scheduler scheduler = new Scheduler(fig);//通过调取器传入需要执行的第一个任务来触发整个任务的执行,如果有Fig模块类有个多个同名的任务都会被同时触发执行List<Data> res = scheduler.run(Data.create("start","铅笔"));System.out.println(res);}//定义一个任务用来从 当当网采集数据@Task("start")public Data dd(Data value) {String dangdang = "http://search.dangdang.com/?key=";String productName = (String) value.getData();String url = StringUtils.join(Arrays.asList(dangdang, productName), "");List<String> res = new Vector<String>();for (int i = 0; i < 10; i++) {try {if (i > 0) {url = StringUtils.join(Arrays.asList(dangdang, productName, "&act=input&page_index=", i + 1), "");}Document document = Jsoup.connect(url).timeout(5000).get();Elements uls = document.select("ul[class=bigimg cloth_shoplist]");Iterator<Element> ulIter = uls.iterator();while (ulIter.hasNext()) {Element ul = ulIter.next();Elements lis = ul.select("li");Iterator<Element> liIter = lis.iterator();while (liIter.hasNext()) {Element li = liIter.next();Elements price = li.select("p[class=price]>span");String productPrice = price.html().replaceAll("&yen;", "");Elements title = li.select("p[class=name]>a");String productName2 = title.attr("title");res.add(String.join(",", Arrays.asList(productName2, productPrice)));}}} catch (Exception e) {e.printStackTrace();}}//将采集到的数据 通过Data数据类型将包装传递给calc任务进行处理return Data.create("calc", res);}//定义一个任务用来从京东采集数据@Task("start")public Data jd(Data value) {String jdurl = "http://search.jd.com/Search?keyword=";List<String> res = new Vector<String>();try {String productName = (String) value.getData();String url = jdurl + productName;for (int i = 0; i < 10; i++) {try {if (i > 0) {url = StringUtils.join(Arrays.asList(jdurl,"&enc=utf-8&page=",i+1),"");}Document document = Jsoup.connect(url).timeout(5000).get();Elements uls = document.select("ul[class=gl-warp clearfix]");Iterator<Element> ulIter = uls.iterator();while (ulIter.hasNext()) {Element ul = ulIter.next();Elements lis = ul.select("li[data-sku]");Iterator<Element> liIter = lis.iterator();while (liIter.hasNext()) {Element li = liIter.next();Element div = li.select("div[class=gl-i-wrap]").first();Elements title = div.select("div[class=p-name p-name-type-2]>a");String productName2 = title.attr("title"); // 得到商品名称Elements price = div.select(".p-price>strong>i");String productPrice = price.text(); // 得到商品价格res.add(String.join(",", Arrays.asList(productName2, productPrice)));}}} catch (Exception e) {e.printStackTrace();}}} catch (Exception e) {}//将采集到的数据 通过Data数据类型将包装传递给calc任务进行处理return Data.create("calc", res);}//定义一个calc任务,因为采集到的京东和当当的数据都是由start任务进行触发执行的,所以在调用calc任务的时候会将京东和当当的数据已集合的方式合并传递到calc任务@Taskpublic Data calc(Data value) {//这个方法我没有写具体的处理方法,直接将数据类型设置为RESULTS,这样就会将结果直接返回并供调用端使用,调用端现在是将数据打印到控制台显示了value.setType(Data.Type.RESULTS);return value;}
}

执行结果


[Data [name = "calc"data = Vector (Vector (",5.00","【得力618,精品文具不止5折】倾情相伴,不负热爱。,16.60","【得力618,精品文具不止5折】倾情相伴,不负热爱。,9.00","中华绿杆经典2B铅笔,优质铅芯,涂卡考试美术素描好选择,9.20","中华红黑经典款,书写流畅,易写不易断,7.90","【得力618,精品文具不止5折】倾情相伴,不负热爱。,19.90",",9.90","三角笔杆,握笔凹洞引导正确握姿,优质铅芯,专为儿童设计推荐:黄杆铅笔,68.00","【3件7折!晨光618!青春加油战!】\n优质石墨铅芯,涂写顺滑,木杆材质,耐压耐摔更多钜惠满减单品点击抢购,24.50",...),Vector (" 猫太子洞洞笔 铅笔小学生无毒2BHB三角杆初学者矫正握姿幼儿园小学学习文具儿童2b考试铅笔48支装,8.90"," 晨光洞洞铅笔HB/2H/2B三角六角形考试铅笔美术绘图书写铅笔50/桶,6.90"," 洞洞铅笔矫正握姿得力优+小学生铅笔学生铅笔HB三角杆洞洞笔儿童铅笔幼儿园铅笔初学者一二年级,16.50"," 铅笔小学生专用HB红杆带橡皮擦头铅笔无铅无毒一年级初学者铅笔考试原木铅笔不易断铅六角儿童学习文具用品,9.00"," 【每满100减50】得力s928六角铅笔HB小学生书写铅笔 儿童用写字铅笔50支桶装,46.80",...))source = nulltype = RESULTSpriority = 1timestamp = 1623552642212
]]

Fig (无花果)任务流水线式 多线程框架使用相关推荐

  1. ucontext实现的用户级多线程框架3(实现echo服务器)

    前面一篇文章实现了一个抢先式的用户级多线程框架,现在用那个框架编写一个echo服务, 因为只是个实验,所以代码写得比较杂乱,还有很多可能出错的情况也没有处理,这些在今后的进一 步研究中都会慢慢修改,下 ...

  2. 【Unity3D插件】UniRx(基于Unity的响应式编程框架)插件学习

    一.介绍UniRx插件 UniRx是一种基于Unity3D的响应式编程框架. UniRx就是Unity版本的Rx响应式扩展,响应式就是观察者和定时器,扩展指的是LINQ的操作符.Rx响应式扩展的特点就 ...

  3. 【Unity3D插件】UniRx(基于Unity的响应式编程框架)插件教程

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  4. 反应式编程框架设计:如何使得程序调用不阻塞等待

    前言: 程序在高并发的情况下,程序容易崩溃.主要的原因是:在高并发的情况下,有大量用户请求需要程序计算处理,而目前的处理方式是,为每个用户请求分配一个线程,当程序内部因为访问数据库等原因造成线程阻塞时 ...

  5. Linux C实现用户态协作式多线程!

    皮鞋?湿,不会胖,下雨也不怕!但皮鞋老板不让老湿说协程,那老湿就不说了,毕竟也真的不懂. 前天半夜写下一篇文章作为对九年前一个疑问的回应: Linux C实现纯用户态抢占式多线程!: https:// ...

  6. Storm 流式计算框架介绍

    文章目录 1.Storm简介 1.1 DAG(有向无环图) 1.2 Storm介绍 1.2.1 Storm 简介 1.2.2 Storm的优点 1.2.3 Storm的特性 1.3 Storm与Had ...

  7. Android应用设计之实现多线程框架

    Android应用设计之实现多线程框架 做了Android开发满2年了,感觉在开发中用的很多的就是多线程了:由于在现代的计算机中CPU核数越来越多,因此操作系统底层就向多线程方向发展.因此为了跟上时代 ...

  8. Data Artisans发布支持ACID事务的流式处理框架Streaming Ledger

    data Artisans宣布推出Streaming Ledger,它扩展了Apache Flink,提供了跨表.键和事件流执行可序列化ACID事务的功能.这项正在申请专利的技术是Flink的专有附加 ...

  9. 设计师不应该错过的响应式设计框架(含优缺点分析)

    Ethan Marcotte称响应式设计是基于网格建立一个网站.Marcotte定义这项技术后,响应式设计框架开始出现,主要是css和JavaScript的结合.许多框架都是开源的,可以免费下载和快速 ...

最新文章

  1. 当统计信息不准确时,CBO可能产生错误的执行计划,并在10053 trace中找到CBO出错的位置示例...
  2. warnings.filterwarnings(ignore)
  3. 设计模式-简单工厂模式
  4. 231 Power of Two 2的幂
  5. wordpress学习笔记
  6. CSS Margin(外边距)
  7. 解决VS2010自带的C/C++编译器CL找不到mspdb100.dll的问题
  8. Python之魔法方法详解
  9. JDK 13 的 12 个新特性,真心厉害和好用
  10. CrossApp应用源码集合贴
  11. 计算机网络基础知识总结,就这一篇了
  12. 明尼苏达大学Transportation Research Data Lab (TDRL)交通数据读取
  13. Linux配置ip地址
  14. 编程训练4-统计单词平均长度
  15. Opus:IETF低延迟音频编解码器:API和操作手册
  16. VR中的9轴传感器(重力加速度/陀螺仪/磁力计)
  17. 六款自适应引导页HTML源码
  18. hibernate一对一主键关联映射(单向关联Person-----IdCard)
  19. Ehabs Last Corollary
  20. GraphPad Prism 列联表教程

热门文章

  1. python飞机游戏视频教程_10分钟教你用Python做个打飞机小游戏超详细教程
  2. Linux学习之路_8.搜索查找类
  3. 用计算机怎么弹赢在江湖,赢在江湖-姜鹏-和弦谱-《弹吧》官网tan8.com-和弦谱大全,学吉他,秀吉他...
  4. 表示数字 C语言实现
  5. 佛罗里达州的最新的野生动物保护区
  6. 【Unity】Obi插件系列(四)—— Distance Fields、Particle attachments、Particle rendering
  7. java 实现异地登陆_Java实现用户异地登陆踢人操作
  8. 聊聊我遇到的那些贵人
  9. 分享几个有意思的游戏
  10. 好用到爆!IDEA 版 Postman 面世了,功能真心强大