Flink_CEP关于订单超时事件的处理

//基于CEP 实现对订单事件监测 对于超过一定时间下了订单未支付的用户语义处理

package com

import java.util

import org.apache.flink.cep.{PatternSelectFunction, PatternTimeoutFunction}
import org.apache.flink.cep.scala.{CEP, PatternStream}
import org.apache.flink.cep.scala.pattern.Pattern
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time

//订单超时事件处理 超时事件报警
object OrderTimeout {
//输入样例类

case class OrderEvent(orderId:Long,enentType:String,txId:String,timestamp:Long)
//输出样例类 orderID 输出消息
case class OrderResult(orderId:Long,resultMsg:String)
def main(args: Array[String]): Unit = {
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1)
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
val dataStream: DataStream[String] = env.readTextFile(“F:\UserBehaviorAnalysis\OrderPayDetect\src\main\resources\OrderLog.csv”)
val orderStream: KeyedStream[OrderEvent, Long] = dataStream.map(data => {
val arr: Array[String] = data.split(",")
OrderEvent(arr(0).toLong, arr(1), arr(2), arr(3).toLong)
}).assignAscendingTimestamps(.timestamp * 1000L)
.keyBy(
.orderId)
//主要处理下单完后没有付款的
val orderPattern: Pattern[OrderEvent, OrderEvent] = Pattern
.beginOrderEvent.where(.enentType == “create”)
//非严格紧邻 创建订单后可以有其他操作
.followedBy(“pay”).where(
.enentType == “pay”)
.within(Time.minutes(5))
val patternStream: PatternStream[OrderEvent] = CEP.pattern(orderStream,orderPattern)
//3.定义侧输出流 超时事件
val orderTimeOut = new OutputTagOrderResult
val resultStream: DataStream[OrderResult] = patternStream.select(
orderTimeOut,
new OrderTimeoutSelect(), //用于侧输出流的未匹配成功的事件
new OrderPaySelect() //匹配到的事件
)
resultStream.print(“payed”)
resultStream.getSideOutput(orderTimeOut).print(“timeOut”)
env.execute(“order timeout job”)
}
//未匹配成功的事件放入侧输出流
class OrderTimeoutSelect() extends PatternTimeoutFunction[OrderEvent,OrderResult]{
override def timeout(pattern: util.Map[String, util.List[OrderEvent]], timeoutTimestamp: Long): OrderResult = {
val event: OrderEvent = pattern.get(“create”).iterator().next() //只能提取到create事件 不能pay
OrderResult(event.orderId,“timeout”+event.timestamp)
}
}
//匹配成功的输出
class OrderPaySelect() extends PatternSelectFunction[OrderEvent,OrderResult]{
override def select(pattern: util.Map[String, util.List[OrderEvent]]): OrderResult = {
val creatEevent: OrderEvent = pattern.get(“create”).iterator().next()
val orderEvent: OrderEvent = pattern.get(“pay”).iterator().next()
OrderResult(orderEvent.orderId,“下单时间”+creatEevent.timestamp+“支付世间”+orderEvent.timestamp)
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值