filnk订单超时

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 resource = getClass.getResource("./OrderLog.csv")
    // 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)

    //2.定义匹配模式
    val orderPattern: Pattern[OrderEvent, OrderEvent] = Pattern.begin[OrderEvent]("begin").where(_.eventType == "create")
      .followedBy("follow").where(_.eventType == "pay")
      .within(Time.minutes(15))

    //3.把模式英语打stream上,得到patternStream
    val patternStream = CEP.pattern(dataStream, orderPattern)

    //4.调用select方法,提取事件序列。超时的事件做报警提示
    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")
  }
}

猜你喜欢

转载自blog.csdn.net/weixin_44429965/article/details/108066483