关于sparkStreaming的测试Drools框架结合版

package com.dinpay.bdp.rcp.service;

import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date; import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;
import org.apache.spark.api.java.function.VoidFunction2;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.Time;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaPairDStream;
import org.apache.spark.streaming.api.java.JavaReceiverInputDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession; import com.dinpay.bdp.rcp.metaq.MetaQReceiver;
import com.dinpay.bdp.rcp.streaming.StreamingUtil;
import com.dinpay.bdp.rcp.util.CodisUtil;
import com.dinpay.bdp.rcp.util.Constant;
import com.dinpay.dpp.rcp.po.Order; import redis.clients.jedis.Jedis;
import scala.Tuple2; /**
* 同卡号单日最大交易金额测试
* @author ll-t150
*
*/
public class SparkDroolsTest { public static Logger logger = Logger.getLogger(SparkDroolsTest.class);
public static final DateFormat df = new SimpleDateFormat("yyyyMMdd"); public static void main(String[] args) {
String zkConnect=Constant.METAZK;
String zkRoot="/meta";
String topic=Constant.ORDERTOPIC;
String group=Constant.STREAMGROUP;
//屏蔽日志
Logger.getLogger("org.apache.spark").setLevel(Level.OFF);
logger.info("metaq configuration:"+zkConnect+"--"+topic+"--"+group);
SparkConf sparkConf = new SparkConf().setAppName("SparkDroolsTest").setMaster("local[2]");
JavaStreamingContext ssc = new JavaStreamingContext(sparkConf, Durations.seconds(1));
//从metaq取消息
JavaReceiverInputDStream<Order> lines = ssc.receiverStream(new MetaQReceiver(zkConnect,zkRoot,topic,group)); JavaDStream<Order> words = lines.flatMap(new FlatMapFunction<Order, Order>() {
@Override
public Iterable<Order> call(Order order) throws Exception {
return Arrays.asList(new Order[]{order});
}
}); //同卡号单日交易最大次数 统计包括成功和未成功的订单
JavaPairDStream<String, Integer> cardCntPairs = getCardJavaPair(words);
save2Codis(cardCntPairs);
ssc.start();
ssc.awaitTermination();
ssc.close();
} @SuppressWarnings({ "unchecked", "serial" })
public static <T> JavaPairDStream<String, T> getCardJavaPair(JavaDStream<Order> words){
JavaPairDStream<String, T> pairs = null;
//次数统计
pairs = (JavaPairDStream<String, T>) words.mapToPair(new PairFunction<Order, String, Integer>() {
@Override
public Tuple2<String, Integer> call(Order order) {
Jedis jedis = CodisUtil.getJedisPool().getResource();
String cardCntkey = order.getSystemId()+"_CNT_"+order.getPayerCardNo()+"_"+df.format(new Date());
//拼接key,先到codis里面查找对应的key是否存在,若存在就直接取对应的值,然后取值加1
String value = jedis.get(cardCntkey);
if (StringUtils.isEmpty(value)) {
return new Tuple2<String, Integer>(cardCntkey, 1);
} else {
return new Tuple2<String, Integer>(cardCntkey, Integer.parseInt(value) + 1);
}
}
});
return pairs;
} /**
* 将计算出的数据保存到codis中
* @param pair
*/
@SuppressWarnings("serial")
public static <T> void save2Codis(JavaPairDStream<String, T> pair) {
pair.foreachRDD(new VoidFunction2<JavaPairRDD<String,T>,Time>() {
@Override
public void call(JavaPairRDD<String, T> rdd, Time time) throws Exception {
rdd.foreach(new VoidFunction<Tuple2<String,T>>() {
@Override
public void call(Tuple2<String, T> tp) throws Exception {
Jedis jedis = CodisUtil.getJedisPool().getResource();
jedis.set(tp._1(), String.valueOf(tp._2()));
logger.info(tp._1() + ">>>" + tp._2()+",保存到Codis完成!");
KieServices kieServices = KieServices.Factory.get();
KieContainer kieContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieContainer.newKieSession("helloworld");
ChannAmount objectChannel = new ChannAmount();
objectChannel.setAmount(Integer.parseInt(String.valueOf(tp._2())));
objectChannel.setChannel(tp._1());
kieSession.insert(objectChannel);
kieSession.fireAllRules();
if(jedis !=null){
jedis.close();
}
}
});
}
});
} }

关于配置文件的设置

kmodule.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<kbase name="rules" packages="rules">
<ksession name="helloworld"/>
</kbase>
<kbase name="dtables" packages="dtables">
<ksession name="ksession-dtables"/>
</kbase>
<kbase name="process" packages="process">
<ksession name="ksession-process"/>
</kbase>
</kmodule>

riskMonitor.drl内容

package rules;

import com.dinpay.bdp.rcp.service.ChannAmount;
//其中m为对象objectChannel 的引用
rule "channel"
when
ChannAmount(amount>2)
then
System.out.println("Drools规则实现:该渠道最近5分钟交易金额超过2次 ");
end

测试OK!

SparkStreaming和Drools结合的HelloWord版的更多相关文章

  1. C#.NET开源项目、机器学习、商务智能

    所以原谅我,不能把所有的都发上来,太杂了,反而不好. 1..NET时间周期处理组件 这个组件很小,主要是对时间日期,特别是处理时间间隔以及时间范围非常方便.虽然.NET自带了时间日期的部分功能,但可能 ...

  2. 规则引擎 - drools 使用讲解(简单版) - Java

    drools规则引擎 项目链接 现状: 运维同学(各种同学)通过后台管理界面直接配置相关规则,这里是通过输入框.下拉框等完成输入的,非常简单: 规则配置完毕后,前端请求后端,此时服务端根据参数(即规则 ...

  3. Drools的HelloWord例子

    添加drools框架运行的依赖 <!--Drools 规则相关 --> <dependency> <groupId>org.drools</groupId&g ...

  4. Drools规则引擎入门指南(三)——使用Docker部署Workbench

    其实本来我也是打算使用Tomcat来部署Workbench的,但是在网上看了几篇文章,超级繁琐的配置.各种版本.实在看不下去了索性就直接使用Docker来部署了.本次部署的版本是最新稳定版,对应dro ...

  5. Drools 规则学习

    Drools 规则学习 在 Drools 当中,一个标准的规则文件就是一个以“.drl”结尾的文本文件,由于它是一个标准的文本文件,所以可以通过一些记事本工具对其进行打开.查看和编辑.规则是放在规则文 ...

  6. spark发行版笔记9

    感谢DT大数据梦工厂支持提供技术支持,DT大数据梦工厂专注于Spark发行版定制. 本期概览: 1 Receiver生命全周期 首先,我们找到数据来源的入口,入口如下 Receiver的设计是极其巧妙 ...

  7. spark发行版笔记4Spark Streaming事务处理彻底掌握

    Spark Streaming事务处理彻底掌握 感谢DT大数据梦工厂支持提供以下内容,DT大数据梦工厂专注于Spark发行版定制. 内容概括: 1Exactly once 2 输出不重复 1 正如银行 ...

  8. Android环境配置及运行helloWord案例

      Android的环境搭建步骤,以及输出一个helloWorder 1:下载Android开发环境   及是: SDK adt-bundle-windows-x86_64-20140702 此时的版 ...

  9. Java面试宝典2013版(超长版)

    一. Java基础部分......................................................................................... ...

随机推荐

  1. Leetcode 587.安装栅栏

    安装栅栏 在一个二维的花园中,有一些用 (x, y) 坐标表示的树.由于安装费用十分昂贵,你的任务是先用最短的绳子围起所有的树.只有当所有的树都被绳子包围时,花园才能围好栅栏.你需要找到正好位于栅栏边 ...

  2. rsync 使用小记

    工作中遇到了有关rsync使用的问题,在这里记录下供有同样需求的人参考一下 先说下环境 服务端配置 pid file = /rsyncdata/rsyncd.pid port = 873 addres ...

  3. ubuntu--基础环境瞎搞集合

    安装ubuntu系统后有很多东西需要自己瞎搞一下,这里把一些瞎搞的过程记录在这里,方便以后重新装系统后重新配置. 一.安装. 可以在windows下制作启动盘(软碟通),然后开机u盘启动即可安装,预留 ...

  4. POJ 1941 The Sierpinski Fractal ——模拟

    只需要开一个数组,记录一下这个图形. 通过一番计算,发现最大的面积大约是2k*2k的 然后递归下去染三角形. 需要计算出左上角的坐标. 然后输出的时候需要记录一下每一行最远延伸的地方,防止行末空格过多 ...

  5. ext2 与 ext3

    http://linux.vbird.org/linux_basic/1010appendix_B.php https://baike.baidu.com/item/Ext2/822106?fr=al ...

  6. 获取所有querystring变量名

    原文发布时间为:2009-12-04 -- 来源于本人的百度文章 [由搬家工具导入] protected void Page_Load(object sender, EventArgs e)    { ...

  7. div两侧的boder断开 消失 奇怪

    原文发布时间为:2009-11-06 -- 来源于本人的百度文章 [由搬家工具导入] 解决方法: 设定外层DIV的宽度即可,如 width:99% ========================== ...

  8. 【传输文件】文件传输协议FTP、SFTP和SCP

    网络通信协议分层 应用层: HTTP(Hypertext Transfer Protocol 超文本传输协议,显示网页) DNS(Domain Name System) FTP(File Transf ...

  9. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---51

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  10. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---16

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: