filnk订单超时
import java.util
import org.apache.flink.cep.{
PatternSelectFunction, PatternTimeoutFunction}
import org.apache.flink.cep.scala.CEP
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
case class OrderEvent(orderId: Long, eventType: String, txId: String, eventTime: Long)
case class OrderResult(orderId: Long, resultMsg: String)
object order_timeout {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
env.setParallelism(1)
val dataStream = env.readTextFile("F:\\user_behavior_analysis\\order_pay_analysis\\src\\main\\resources\\OrderLog.csv")
.map(data => {
val a = data.split(",")
OrderEvent(a(0).trim.toLong, a(1).trim, a(2).trim, a(3).trim.toLong)
}
)
.assignAscendingTimestamps(_.eventTime * 1000)
.keyBy(_.orderId)
val orderPattern: Pattern[OrderEvent, OrderEvent] = Pattern.begin[OrderEvent]("begin").where(_.eventType == "create")
.followedBy("follow").where(_.eventType == "pay")
.within(Time.minutes(15))
val patternStream = CEP.pattern(dataStream, orderPattern)
val orderTimeOutTag = new OutputTag[OrderResult]("orderTimeOut")
val resultStream = patternStream.select(orderTimeOutTag,
new OrderTimeoutSelect(),
new OrderPaySelect())
resultStream.print("pay successed")
resultStream.getSideOutput(orderTimeOutTag).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 timeoutID = pattern.get("begin").iterator().next().orderId
OrderResult(timeoutID, "pay failed")
}
}
class OrderPaySelect() extends PatternSelectFunction[OrderEvent, OrderResult]() {
override def select(pattern: util.Map[String, util.List[OrderEvent]]): OrderResult = {
val payedId = pattern.get("follow").iterator().next().orderId
OrderResult(payedId, "pay successed")
}
}