前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从四个java源码构文件建一个机票预定业务的规则引擎(下篇)

从四个java源码构文件建一个机票预定业务的规则引擎(下篇)

作者头像
魏新宇
发布2018-06-25 15:25:59
5070
发布2018-06-25 15:25:59
举报

一、前言

本文仅代表作者的个人观点;

本文的内容仅限于技术探讨,不能作为指导生产环境的素材;

本文素材是红帽公司产品技术和手册;

本文分为上篇和下篇两部分,本文是下篇;

二、一个飞机购票程序源码解析

我们继续上一篇的案例,看一个kjar:kie-server-lab-kjar。

Kjar和普通jar不同的地方是,它把规则打包起来。

我们看一下kie-server-lab-kjar的目录结构:

通过IDE工具打开:查看订票流程定义文件:

我们查看这个kjar的三个源码文件,这其实是三个数据对象:

第一个:Applicant.java,这个代码主要是获取买票申请人的个人信息:

先看外部结构:

package org.specialtripsagency;

/**

* This class was automatically generated by the data modeler tool.

*/

public class Applicant implements java.io.Serializable

{

static final long serialVersionUID = 1L;

private java.lang.String name;

private java.lang.String emailAddress;

private java.lang.Integer numberOfTravelers;

private java.lang.String otherDetails;

public Applicant()

{

}

public java.lang.String getName()

{

return this.name;

}

public void setName(java.lang.String name)

{

this.name = name;

}

public java.lang.String getEmailAddress()

{

return this.emailAddress;

}

public void setEmailAddress(java.lang.String emailAddress)

{

this.emailAddress = emailAddress;

}

public java.lang.Integer getNumberOfTravelers()

{

return this.numberOfTravelers;

}

public void setNumberOfTravelers(java.lang.Integer numberOfTravelers)

{

this.numberOfTravelers = numberOfTravelers;

}

public java.lang.String getOtherDetails()

{

return this.otherDetails;

}

public void setOtherDetails(java.lang.String otherDetails)

{

this.otherDetails = otherDetails;

}

public Applicant(java.lang.String name, java.lang.String emailAddress,

java.lang.Integer numberOfTravelers, java.lang.String otherDetails)

{

this.name = name;

this.emailAddress = emailAddress;

this.numberOfTravelers = numberOfTravelers;

this.otherDetails = otherDetails;

}

}

这个源码的外部结构:

第二个:BookingObject.java,这个主要是预定的对象:

package org.specialtripsagency;

/**

* This class was automatically generated by the data modeler tool.

*/

public class BookingObject extends java.lang.Object implements java.io.Serializable

{

static final long serialVersionUID = 1L;

private org.specialtripsagency.Applicant applicant;

private String bookingId;

private org.specialtripsagency.Flight flight;

public BookingObject()

{

}

public org.specialtripsagency.Applicant getApplicant()

{

return this.applicant;

}

public void setApplicant(org.specialtripsagency.Applicant applicant)

{

this.applicant = applicant;

}

public java.lang.String getBookingId()

{

return this.bookingId;

}

public void setBookingId(java.lang.String bookingId)

{

this.bookingId = bookingId;

}

public org.specialtripsagency.Flight getFlight()

{

return this.flight;

}

public void setFlight(org.specialtripsagency.Flight flight)

{

this.flight = flight;

}

public BookingObject(org.specialtripsagency.Applicant applicant,

java.lang.String bookingId, org.specialtripsagency.Flight flight)

{

this.applicant = applicant;

this.bookingId = bookingId;

this.flight = flight;

}

}

再看第三个:Flight.java,这个主要是航班信息相关内容:

package org.specialtripsagency;

/**

* This class was automatically generated by the data modeler tool.

*

*/

public class Flight extends java.lang.Object implements java.io.Serializable

{

static final long serialVersionUID = 1L;

private java.lang.String carrier;

private java.lang.String flightNr;

private java.lang.Integer priceDiscount;

private java.lang.Integer ratePerPerson;

private java.lang.String returnDate;

private java.lang.String startCity;

private java.lang.String targetCity;

private java.lang.String travelDate;

private java.lang.String travelClass;

private java.lang.String bookingStatus;

private java.lang.String bookingId;

public Flight()

{

}

public java.lang.String getCarrier()

{

return this.carrier;

}

public void setCarrier(java.lang.String carrier)

{

this.carrier = carrier;

}

public java.lang.String getFlightNr()

{

return this.flightNr;

}

public void setFlightNr(java.lang.String flightNr)

{

this.flightNr = flightNr;

}

public java.lang.Integer getPriceDiscount()

{

return this.priceDiscount;

}

public void setPriceDiscount(java.lang.Integer priceDiscount)

{

this.priceDiscount = priceDiscount;

}

public java.lang.Integer getRatePerPerson()

{

return this.ratePerPerson;

}

public void setRatePerPerson(java.lang.Integer ratePerPerson)

{

this.ratePerPerson = ratePerPerson;

}

public java.lang.String getReturnDate()

{

return this.returnDate;

}

public void setReturnDate(java.lang.String returnDate)

{

this.returnDate = returnDate;

}

public java.lang.String getStartCity()

{

return this.startCity;

}

public void setStartCity(java.lang.String startCity)

{

this.startCity = startCity;

}

public java.lang.String getTargetCity()

{

return this.targetCity;

}

public void setTargetCity(java.lang.String targetCity)

{

this.targetCity = targetCity;

}

public java.lang.String getTravelDate()

{

return this.travelDate;

}

public void setTravelDate(java.lang.String travelDate)

{

this.travelDate = travelDate;

}

public java.lang.String getTravelClass()

{

return this.travelClass;

}

public void setTravelClass(java.lang.String travelClass)

{

this.travelClass = travelClass;

}

public java.lang.String getBookingStatus()

{

return this.bookingStatus;

}

public void setBookingStatus(java.lang.String bookingStatus)

{

this.bookingStatus = bookingStatus;

}

public java.lang.String getBookingId()

{

return this.bookingId;

}

public void setBookingId(java.lang.String bookingId)

{

this.bookingId = bookingId;

}

public Flight(java.lang.String carrier, java.lang.String flightNr,

java.lang.Integer priceDiscount, java.lang.Integer ratePerPerson,

java.lang.String returnDate, java.lang.String startCity,

java.lang.String targetCity, java.lang.String travelDate,

java.lang.String travelClass, java.lang.String bookingStatus,

java.lang.String bookingId)

{

this.carrier = carrier;

this.flightNr = flightNr;

this.priceDiscount = priceDiscount;

this.ratePerPerson = ratePerPerson;

this.returnDate = returnDate;

this.startCity = startCity;

this.targetCity = targetCity;

this.travelDate = travelDate;

this.travelClass = travelClass;

this.bookingStatus = bookingStatus;

this.bookingId = bookingId;

}

}

在BPM中打开Kjar

查看数据对象:

再看business流程:

选择org.specialtripsagency package.

接下来看一下流程建模,本流程是审核机票预订流程的定义。

我们分步骤查看,整体上,就是订票,输入信息,然后付款,付款成功订票成功;否则取消:

第一步Prepare WS Data的脚本:

/* Populating Applicant object */

org.specialtripsagency.Applicant _applicant = new org.specialtripsagency.Applicant();

_applicant.setName(applicantName);

/* Populating Flight object */

org.specialtripsagency.Flight _flight = new org.specialtripsagency.Flight();

_flight.setCarrier(flight_carrier);

_flight.setFlightNr(flight_flightNr);

_flight.setTravelClass(flight_travelClass);

/* Populating BookingObject object */

org.specialtripsagency.BookingObject _booking = new org.specialtripsagency.BookingObject();

_booking.setApplicant(_applicant);

_booking.setFlight(_flight);

kcontext.setVariable("booking", _booking);

/* FlightService : Booking */

org.acme.specialtripsagency.flightservice.Booking _flightBooking = new org.acme.specialtripsagency.flightservice.Booking();

_flightBooking.setCarrier(_flight.getCarrier());

_flightBooking.setFlightNr(_flight.getFlightNr());

_flightBooking.setTravelClass(_flight.getTravelClass());

_flightBooking.setType("PREBOOKING");

kcontext.setVariable("flightBooking", _flightBooking);

第二步:flight pre-booking:

这步主要做的数据重定向:

第三步:处理订票数据:

/* Populate BookingObject with data from flight booking */

org.specialtripsagency.BookingObject _booking = (org.specialtripsagency.BookingObject)kcontext.getVariable("booking");

org.acme.specialtripsagency.flightservice.BookingResponse _flightBookingResponse = (org.acme.specialtripsagency.flightservice.BookingResponse)kcontext.getVariable("flightBookingResponse");

_booking.getFlight().setBookingId(_flightBookingResponse.getBooking());

_booking.getFlight().setBookingStatus(_flightBookingResponse.getStatus());

_booking.setBookingId(_flightBookingResponse.getBooking());

第四步:Payment Instructions STUB

System.out.println("Flight Booking Process: Payment Instructions Sent to Customer");

第五步:Process payment

选择1:Prepare Data for confirmation

org.specialtripsagency.BookingObject _booking = (org.specialtripsagency.BookingObject) kcontext.getVariable("booking");

org.specialtripsagency.Flight _flight = _booking.getFlight();

/* FlightService : Booking */

org.acme.specialtripsagency.flightservice.Booking _flightBooking = new org.acme.specialtripsagency.flightservice.Booking();

_flightBooking.setCarrier(_flight.getCarrier());

_flightBooking.setFlightNr(_flight.getFlightNr());

_flightBooking.setTravelClass(_flight.getTravelClass());

_flightBooking.setType("BOOKING");

_flightBooking.setBooking(_flight.getBookingId());

kcontext.setVariable("flightBooking", _flightBooking);

订票成功:

选择2:订票取消:

org.specialtripsagency.BookingObject _booking = (org.specialtripsagency.BookingObject) kcontext.getVariable("booking");

org.acme.specialtripsagency.flightservice.BookingCancellation _flightCancellation = new org.acme.specialtripsagency.flightservice.BookingCancellation();

_flightCancellation.setBooking(_booking.getFlight().getBookingId());

kcontext.setVariable("flightCancellation", _flightCancellation);

机票取消:

三、源码的构建与部署

选择构建和部署:

增加web container:

查看部署在KIE服务器上的容器:

四、流程模拟

点击下图start:

提示输入信息:购票人、航空公司、航班号、仓位:

处理任务:

提交以后:

这个时候,流程已经走到了:

处理支付:

魏新宇

  • "大魏分享"运营者、红帽资深解决方案架构师
  • 专注开源云计算、容器及自动化运维在金融行业的推广
  • 拥有MBA、ITIL V3、Cobit5、C-STAR、TOGAF9.1(鉴定级)等管理认证。
  • 拥有红帽RHCE/RHCA、VMware VCP-DCV、VCP-DT、VCP-Network、VCP-Cloud、AIX、HPUX等技术认证。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大魏分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档