//基于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)
}
}
}
1100

被折叠的 条评论
为什么被折叠?



