关于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. jsonp的原理及应用

    https://blog.csdn.net/u011897301/article/details/52679486

  2. 实战项目——获取图片中的GPS位置信息和拍摄时间

    今天突然看到有人写过获取图片中位置信息的程序.我觉得很有趣,也就自己实践了一下,研究了一下 话不多说,先上代码 #!/usr/bin/env python3 # -*- coding: utf-8 - ...

  3. RNQOJ 开心的金明

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N 元钱就行”.今 ...

  4. 【转】手动写一个Behavior Designer任务节点

    http://blog.csdn.net/qq_33747722/article/details/53539532 自己手写一个类似于CanSeeObject.Seek等任务节点并不是一件难事 下面我 ...

  5. POJ 2217:Secretary(后缀数组)

    题目大意:求两个字符串的公共子串. 分析: 模板题,将两个字符串接起来用不会出现的字符分割,然后求分属两个字符串的相邻后缀lcp的最大值即可. 代码: program work; type arr=. ...

  6. [NOI2014][bzoj3670] 动物园 [kmp+next数组应用]

    题面 传送门 思路 首先,这题最好的一个地方,在于它给出的关于$next$的讲解实在是妙极......甚至可以说我的kmp是过了这道题以后才脱胎换骨的 然后是正文: 如何求$num$数组? 这道题的输 ...

  7. [canvas入坑2]模糊效果

    查看效果请到 http://philippica.github.io/  点击blur 模糊效果比较好的应该是高斯模糊,一个点的值变成了以该点为圆心的一个圆内所有像素的加权平均,权重由二维正态分布计算 ...

  8. bzoj3694最短路

    bzoj3694最短路 Description 给出一个n个点m条边的无向图,n个点的编号从1~n,定义源点为1.定义最短路树如下:从源点1经过边集T到任意一点i有且仅有一条路径,且这条路径是整个图1 ...

  9. 0-Broadcast机制原理简要介绍

    Broadcast机制简要介绍 来源: http://blog.csdn.net/luoshengyang/article/details/6730748 导语 广播机制在Android系统中,也不算 ...

  10. Codeforces Round #363 (Div. 2) C dp或贪心 两种方法

    Description Vasya has n days of vacations! So he decided to improve his IT skills and do sport. Vasy ...