在电商网站中,
订单的支付
作为直接与营销收入挂钩的一环,在业务流程中非 常重要。对于订单而言,为了正确控制业务流程,也
为了增加用户的支付意愿,网站一般会设置一个支付失效时间,超过一段时间不支付的订单就会被取消
。另外, 对于订单的支付,我们还应
保证用户支付的正确性,这可以通过第三方支付平台的交易数据来做一个实时对账
。
在电商平台中,最终创造收入和利润的是用户下单购买的环节;更具体一点, 是用户真正完成支付动作的时候。用户下单的行为可以表明用户对商品的需求,但在现实中,
并不是每次下单都会被用户立刻支付。当拖延一段时间后,用户支付的意愿会降低
。所以
为了让用户更有紧迫感从而提高支付转化率,同时也为了防范订 单支付环节的安全风险,电商网站往往会对订单状态进行监控,设置一个失效时间(比如15分钟),如果下单后一段时间仍未支付,订单就会被取消。
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.{DataStream, StreamExecutionEnvironment}
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, timestamp: Long) //txId 交易流水号
case class OrderResult(orderId: Long, resultMsg: String)
object OrderTimeout {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1)
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
val inputStream: DataStream[String] = env.readTextFile("D:\\Mywork\\workspace\\Project_idea\\UserBehaviorAnalysis0903\\OrderPayDetect\\src\\main\\resources\\OrderLog.csv")
val orderEventStream: KeyedStream[OrderEvent, Long] = inputStream.map { data =>
val arr = data.split(",")
OrderEvent(arr(0).toLong, arr(1), arr(2), arr(3).toLong)
}.assignAscendingTimestamps(_.timestamp * 1000L).keyBy(_.orderId)
//1. 定义一个Pattern
val orderPayPattern = Pattern
.begin[OrderEvent]("create").where(_.eventType == "create")
.followedBy("pay").where(_.eventType == "pay")
.within(Time.minutes(15))
//2. 将pattern应用到数据流上,进行模式检测
val patternStream = CEP.pattern(orderEventStream, orderPayPattern)
//3. 定义一个侧输出流标签,用于处理超时事件
val orderTimeoutTag = new OutputTag[OrderResult]("orderTimeout")
//4. 调用select方法,并提取处理匹配成功
val resultStream = patternStream.select(orderTimeoutTag, new OrderTimeoutSelect(), new OrderPaySelect())
resultStream.print("payed")
resultStream.getSideOutput(orderTimeoutTag).print("timeout")
env.execute()
}
}
class OrderTimeoutSelect() extends PatternTimeoutFunction[OrderEvent, OrderResult] {
override def timeout(map: util.Map[String, util.List[OrderEvent]], l: Long): OrderResult = {
val timeoutOrderId = map.get("create").iterator().next().orderId
OrderResult(timeoutOrderId, "timeout" + ": " + l)
}
}
class OrderPaySelect() extends PatternSelectFunction[OrderEvent, OrderResult] {
override def select(map: util.Map[String, util.List[OrderEvent]]): OrderResult = {
val payedOrderId = map.get("pay").iterator().next().orderId
OrderResult(payedOrderId, "payed successfully")
}
}
// 输出
payed> OrderResult(34729,payed successfully)
timeout> OrderResult(34767,timeout: 1558431849000)
payed> OrderResult(34766,payed successfully)