关于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. 使用make构建c程序

    1.Targets, Prerequisites, Commands Targets: 大意是生成的可执行文件. Prerequisites: 生成可执行文件的目标文件或C 语言源文件. Target ...

  2. Ubuntu安装nginx(复制)

    gcc.g++依赖库 apt-get install build-essential apt-get install libtool 安装 pcre依赖库(http://www.pcre.org/) ...

  3. ci日志记录

    log_message($level, $message) 参数: $level (string) -- Log level: 'error', 'debug' or 'info' $message  ...

  4. 记一次 pip list --outdated 错误

    在 Windows CMD 执行 pip list --outdated,出现如下错误:" [WinError 10061] 由于目标计算机积极拒绝,无法连接",原因是我之前用的源 ...

  5. mrpt安装

    1.mrpt2.0参 See PPA for mrpt 2.0 branch (for mrpt 1.5.* read here). sudo add-apt-repository ppa:josel ...

  6. 设置pycharm的python版本

    http://blog.csdn.net/github_35160620/article/details/52486986

  7. 对计算属性中get和set的理解

    原文参考:https://blog.csdn.net/xiaxiaoxian/article/details/79304004

  8. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛部分题解

    A 跳台阶 思路:其实很简单,不过当时直接dp来做了 AC代码: #define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include& ...

  9. 百度云中有关IE浏览器的源码

    <!--[if lt IE 9]>   <div class="topbar">百度云控制台不支持当前所使用的浏览器,推荐安装 <a href=&qu ...

  10. 此时不应有 \Microsoft (转)

    原文转自 http://www.tuicool.com/articles/J7RFRz 下载boost库后,在cmd中运行bootstrap.bat ,输出 "此时不应有 \Microsof ...