欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
學(xué)習jpdl

下面開(kāi)始接觸JBPMJPDL部分:

jpdl參考手冊中主要介紹了processdefinition.xml文件的格式(schema

一、Process archive:

如前面所描述的,process archive是商務(wù)流程的規則描述。它被打成jar包,通常以擴展名.par結束,jbpm識別一個(gè)流程需要三種類(lèi)型的文件數據:

1、  業(yè)務(wù)流程的正式聲明:在jpdl中,是以processdefinition.xml文件來(lái)表達。這一章節我們就來(lái)解析這個(gè)文件的格式。

2、  設計邏輯:在流程上加上規劃邏輯這些也是在processdefinition.xml中給予描述的,在process archive中可以嵌套java-classes。所有在process archive中的classes應該放在子目錄/classes中。

3、  其他資源文件。作為工作流引擎的客戶(hù)端,在運行時(shí)你可能想要在流程中包含一些資源文件的變量。例如。窗體(form)的描述與某人執行任務(wù)相關(guān)聯(lián)。Jbpm不能在你想要包含在一個(gè)流程定義中的資源文件的類(lèi)型上做任何手腳。

二、version機制(此處versioning可以大致理解為:一個(gè)process archive部署后轉變成過(guò)程定義的過(guò)程。)(此部分需要參考原文理解。感覺(jué)不對勁)

作為最最基本的,jbpm的翻譯機制遵從下面原理:

l     每次process archive部署的時(shí)候,一個(gè)新的流程定義就在jbpm數據庫中被創(chuàng )建。

l     在部署的時(shí)候,jbpm 安排一個(gè)version號碼(數字)給過(guò)程定義。只有當過(guò)程名與被定義的號相同時(shí)候才會(huì )執行Process archives。為了實(shí)現安排version號碼,如果它是第一個(gè)version jbpm采取1+(the highest version number of the current process definitions with the same name)或者1。從jbpm-api中可以通過(guò)一個(gè)給定的name查找最近的過(guò)程定義。

l     在一個(gè)給定的定義執行某一個(gè)過(guò)程實(shí)例,過(guò)程實(shí)例將會(huì )(等到同個(gè)定義結束前)一直在這個(gè)定義中保持執行狀態(tài)。

l     通過(guò)這種方式能通過(guò)最近定義啟動(dòng)過(guò)程并且在相同定義中的完整的生命周期中保持運行狀態(tài)。

l     注意:jbpm可以把一個(gè)設計的程序邏輯與一個(gè)過(guò)程相關(guān)聯(lián)起來(lái)。通過(guò)在process archive中包含類(lèi)文件,jbpm將會(huì )對于每個(gè)過(guò)程定義把classes分離出來(lái)。

 

三、Processdefinition.xml格式

 

文檔類(lèi)型定義:

<!DOCTYPE process-definition PUBLIC

  "-//jBpm/jBpm Mapping DTD 2.0 beta3//EN"

  "http://jbpm.org/dtd/processdefinition-2.0-beta3.dtd">

the document type definition of processdefinition.xml

 

過(guò)程定義:

<!ELEMENT process-definition (  description?,

                                swimlane*,

                                type*,

                                start-state,

                                ( state |

                                  milestone |

                                  process-state |

                                  decision |

                                  fork |

                                  join

                                )*,

                                end-state,

                                action*  ) >

<!ATTLIST process-definition name CDATA #REQUIRED >

dtd fragment for process-definition

 

狀態(tài):

<!ELEMENT state ( description?, assignment?, action*, transition+ ) >

<!ATTLIST state name  CDATA #REQUIRED >

dtd fragment for a state

 

JBPM中,狀態(tài)(state)這個(gè)術(shù)語(yǔ)與FSM(有限狀態(tài)機)和UML狀態(tài)圖中有著(zhù)同樣的意思。

對商務(wù)流程進(jìn)行建模的目的就是創(chuàng )建一個(gè)軟件系統。我們考慮到過(guò)程定義是軟件系統建立的一部分。所以jbpm中的狀態(tài)術(shù)語(yǔ)是以一個(gè)軟件系統的角度來(lái)解釋的。

狀態(tài)是jbpm的核心概念。在jbpm中當開(kāi)始模仿一個(gè)流程,首要需要考慮的事情就是過(guò)程的狀態(tài)。狀態(tài)將成為你所設計的過(guò)程的基本框架。

以狀態(tài)概念為核心的另外一個(gè)特殊原因是:狀態(tài)在程序語(yǔ)言中沒(méi)有容易重復混淆的概念。一個(gè)軟件程序或者運行或者不運行。一個(gè)有代表性的商業(yè)過(guò)程都會(huì )與被分別執行的所設計的邏輯部分關(guān)聯(lián)。Jbpm允許在相關(guān)聯(lián)的程序邏輯中對狀態(tài)建模。

Jpdl也在狀態(tài)之間定義了變遷,決定,分支,合并,milestoneflow)。需要注意的,控制流定義在狀態(tài)與狀態(tài)之間。無(wú)論什么情況下,一個(gè)正常的設計邏輯是更合適的,過(guò)程開(kāi)發(fā)人員就能夠在一個(gè)過(guò)程事件上指定一個(gè)action。Jbpl與其他過(guò)程定義語(yǔ)言如bpel等之間的區別之一是,jpdl具備以狀態(tài)管理方式對java進(jìn)行擴展和與程序語(yǔ)言最小交疊性的能力。

委派(assignment):

 

<ELEMENT assignment EMPTY >

<!ATTLIST assignment swimlane CDATA #IMPLIED

                     assignment (optional|required) #IMPLIED

                     authentication (optional|required|verify) #IMPLIED >

dtd fragment for an assignment

 

當一個(gè)流程執行到某種狀態(tài)時(shí)候,工作流引擎將會(huì )等到一個(gè)外部的trigger(通過(guò)調用jbpmapi,ExecutionService.endOfState(…))。在這個(gè)方法里面,jbpm將會(huì )算出流程實(shí)例的下一個(gè)狀態(tài)。

所以一個(gè)狀態(tài)能夠依賴(lài)于一個(gè)外部參與者。外部參與者可以是一個(gè)人也可以是某個(gè)系統。有許多種方式來(lái)實(shí)現業(yè)務(wù)流程中的狀態(tài)與任務(wù)相關(guān)聯(lián)。這些任務(wù)基本上可以分為兩組:

1、            基于客戶(hù)端的委派

在這種策略中,jbpm的用戶(hù)管理他們自己用戶(hù)的任務(wù)列表。在這種情況,jbpm只是用一個(gè)執行引擎來(lái)控管有限狀態(tài)機。Jbpm的職責是計算并且追蹤過(guò)程執行中的狀態(tài),然而客戶(hù)端的職責就是確保每個(gè)人知道做了什么。然后客戶(hù)端一般就是在一個(gè)給定的狀態(tài)中找到過(guò)程實(shí)例(或者說(shuō)tokens

2、            基于流程的委派

(在jbpm2.0 beta3之前支持這種委派策略)

在這種委派策略中,jbpm將會(huì )擔負給參與者安排狀態(tài)并且追蹤任務(wù)列表的職責。在jbpm中,流程在執行過(guò)程中是以一個(gè)token來(lái)進(jìn)行跟蹤的。一個(gè)token有一個(gè)指針來(lái)指向狀態(tài)和一個(gè)參與者。在jbpm中一個(gè)參與者總是引用java.lant.string。為了詳細說(shuō)明jbpm如何必須安排tokens給參與者們,一些事件與此相關(guān)。接下來(lái)一個(gè)一個(gè)介紹:

只要一個(gè)客戶(hù)端啟動(dòng)一個(gè)過(guò)程實(shí)例或者發(fā)出結束狀態(tài)的信號,jbpm都會(huì )計算過(guò)程實(shí)例的下一個(gè)狀態(tài)。

首要的事情是關(guān)于這些api方法中的第一個(gè)參數:參與者。這個(gè)參與用來(lái)識別誰(shuí)來(lái)執行。

在啟動(dòng)一個(gè)新的過(guò)程實(shí)例的情況下,一個(gè)root-token在開(kāi)始狀態(tài)中被創(chuàng )建好。在結束一個(gè)狀態(tài)的情況下,一個(gè)tokenid需要以一個(gè)某種狀態(tài)中的參數形式指定。然后,jbpm將會(huì )開(kāi)始為token計算下一個(gè)新?tīng)顟B(tài)。為了簡(jiǎn)單起見(jiàn),我們忽略并發(fā)這種情況。Token將會(huì )經(jīng)歷變遷和節點(diǎn),然后抵達下一個(gè)狀態(tài)節點(diǎn)。在那時(shí),一個(gè)token需要安排一個(gè)參與者。選擇一個(gè)參與者之后,jbpm將通過(guò)token和調用的方法(開(kāi)始過(guò)程實(shí)例或者結束狀態(tài))的返回值進(jìn)行關(guān)聯(lián)選擇的參與者

所以當一個(gè)狀態(tài)中的token具備有一個(gè)參與者時(shí),那就意味著(zhù)過(guò)程實(shí)例的執行是在等待這個(gè)參與者提供一個(gè)外部triggerjbpm引擎。在這種情形下,過(guò)程中的狀態(tài)對應一個(gè)用戶(hù)的任務(wù),jbpm通過(guò)檢索所有已經(jīng)安排給指定的參與者的tokens計算任務(wù)列表?,F在,參與者能夠從列表中選擇一個(gè)token和發(fā)出結束狀態(tài)信號量。

Assignmentn(委派)有許多屬性:assignmentauthentication。Assingement屬性可以有兩個(gè)值:optionalrequired。Required意思指當執行到某一個(gè)狀態(tài)時(shí),jbpm將會(huì )檢測是否把一個(gè)token安排了一個(gè)參與者。如果非法則會(huì )拋出AssignmentException的異常。如果assingmentoptional=default),當到達一個(gè)狀態(tài)時(shí)jbpm就允許離開(kāi)一個(gè)未安排的token。屬性authentication指定約束條件來(lái)限定哪個(gè)參與者可以發(fā)出結束狀態(tài)的信號。參與者通過(guò)endOfState方法中的參數actorid來(lái)指定。如果optional=default意思指對于指定誰(shuí)來(lái)?yè)斀Y束狀態(tài)并不是必須的。Required意味著(zhù)一個(gè)參與者需要被指定。Vertify意味著(zhù)結束狀態(tài)只可以安排給已經(jīng)安排token的參與者。

更多信息請查看群組委派。查看faqs。

Swimlane

<!ELEMENT swimlane ( description?, delegation? ) >

<!ATTLIST swimlane name CDATA  #REQUIRED >

dtd fragment for swimlane

非常典型的情況,一個(gè)人具備一個(gè)流程中多個(gè)狀態(tài)的職責。在jbpm中通過(guò)創(chuàng )建一個(gè)swimlane并且通過(guò)swimlane安排狀態(tài)給參與者(actor)。一個(gè)業(yè)務(wù)流程中的swimlane可以被看做為一個(gè)針對參與者的角色名字。Jbpmswimlane的解釋與UML1.5中的術(shù)語(yǔ)swimlane解釋一致。首次執行到達一個(gè)狀態(tài),給定一個(gè)swimlane,就會(huì )算出參與者。

public interface AssignmentHandler {

  String selectActor( AssignmentContext assignerContext );

}

the AssignmentHandler interface

swimalne中的delegation標簽指向一個(gè)AssignmentHandler的具體實(shí)現。

然后那個(gè)參與者(actor)以swimlane中同名的方式被存儲為過(guò)程變量。下次當一個(gè)process archives在一個(gè)狀態(tài),利用swimlane,jbpm引擎將會(huì )檢測變量并且安排token給參與者(存儲在變量中的)

計算的結果是存儲一個(gè)swimlane同名的過(guò)程變量。所以當下一個(gè)狀態(tài)到達相同的swimlane時(shí),狀態(tài)就會(huì )安排給相同的actor,而不再用AssignmentHandler 。因為在swimlane和參與者之間的關(guān)聯(lián)已經(jīng)存儲在變量中,而且可以通過(guò)更新變量來(lái)改變swimlane參與者(actor)之間的關(guān)聯(lián)關(guān)系。

變量和類(lèi)型:

 

<!ELEMENT type ( description?, (delegation|transient), variable* ) >

<!ATTLIST type java-type CDATA #IMPLIED >

<!ELEMENT transient EMPTY >

 

<!ELEMENT variable EMPTY >

<!ATTLIST variable name CDATA #REQUIRED >

dtd fragment for type and variable

一個(gè)是變量是一種key-value對。它與過(guò)程實(shí)例(一次過(guò)程執行)相關(guān)聯(lián)。Keyjava.lang.string,value是任何java類(lèi)型的任何pojo。所以任何是java類(lèi)型,即使不給jbpm知道也能被應用到變量中。

變量存儲過(guò)程實(shí)例的上下文信息(context)。變量可以通過(guò)下面幾種方式進(jìn)行設置讀?。?span lang="EN-US">

  • ExecutionService.startProcessInstance( String actorId, Long definitionId, Map variables, String transitionName )

  • ExecutionService.endOfState( String actorId, Long tokenId, Map variables, String transitionName )

  • ExecutionService.setVariables( String actorId, Long tokenId, Map variables )

  • ExecutionContext.setVariable( String name, Object value )

  • ExecutionService.getVariables( String actorId, Long tokenId )

  • ExecutionContext.getVariable( String name )

當設計變量時(shí)候,jbpm盡量模仿java.util.map的語(yǔ)義。這一點(diǎn)可以通過(guò)jbpm-api來(lái)了解。也就是說(shuō)一個(gè)變量只能當它被插入時(shí)被賦值,任何java類(lèi)型都可以作為變量中的value。

 

一個(gè)type描述jbpm如何存儲變量的值到數據庫中。Jbpm有一個(gè)文本域用來(lái)存儲值,中間以serializer來(lái)實(shí)現文本和對象之間的轉換。

public interface Serializer {

  String serialize( Object object );

  Object deserialize( String text );

}

the Serializer interface

一個(gè)type 可以被看做一個(gè)serializer的引用。Jbpm包含了一些默認serializer的實(shí)現,其中包括下面java類(lèi)型:

java.lang.String

java.lang.Long

java.lang.Double

by default supported java-types

 

變量類(lèi)型匹配:

Java類(lèi)型聲明的變量已經(jīng)被默認支持,而不用在processdefinition.xml聲明。Jbpm有個(gè)自動(dòng)轉換機制:當一個(gè)變量初始化后,jbpm按照下面步驟,首先檢測java類(lèi)型。如果它默認被java支持,那么就可以正常使用,否則,jbpm檢查聲明的類(lèi)型是否與processdefinition.xmljava-type屬性定義的變量是否一致。在匹配過(guò)程中jbpm也考慮變量值的父類(lèi)。如果沒(méi)有找不到這種類(lèi)型,jbpm就把這樣的變量作為transient(瞬間)變量對待。為了避免jbpm不得不執行匹配過(guò)程,你可以把變量指定到它各自類(lèi)型中去。

Transient(瞬間)變量:

一些變量并不需要做持久層處理存儲在數據庫中,jbpm支持瞬時(shí)變量。這樣的變量不存儲到數據庫中并且只可以在jbpm-api的方法中使用。換句話(huà)說(shuō),瞬時(shí)變量的使用范圍是:jbpm-api的方法。

開(kāi)始狀態(tài):

<!ELEMENT start-state ( description?, transition+ ) >

<!ATTLIST start-state name  CDATA #REQUIRED

                      swimlane CDATA #IMPLIED >

dtd fragment for start-state

開(kāi)始狀態(tài)是一個(gè)過(guò)程中的唯一狀態(tài),所有的過(guò)程實(shí)例從這里開(kāi)始,注意在過(guò)程實(shí)例開(kāi)始的時(shí)刻你能夠把變量放在過(guò)程當中了。另外重點(diǎn)的概念是你能夠有多個(gè)從開(kāi)始狀態(tài)出發(fā)的變遷,這樣的話(huà),就需要你指定哪個(gè)變遷是你啟動(dòng)過(guò)程實(shí)例時(shí)候需要執行的。

milestone

<!ELEMENT milestone ( description?, action*, transition ) >

<!ATTLIST milestone name  CDATA #REQUIRED>

dtd fragment for a milestone

 

一個(gè)milestone是一種特殊的狀態(tài),它用來(lái)處理兩個(gè)并發(fā)事件中的同步的作用。一個(gè)milestone可以被應用在下面情形:一條執行路徑需要等待另外一個(gè)執行路徑上的事件。如果milestone沒(méi)有到達,接下來(lái)的執行就必須在milestone處等待,知道另外一個(gè)并發(fā)路徑到達的時(shí)候,才可繼續執行。如果milestone已經(jīng)到達了(條件具備了),接下來(lái)的執行就是通過(guò)這個(gè)milestone狀態(tài)。關(guān)于milestone的更多信息和圖形請參看工作流模式。一個(gè)milestone與一或多個(gè)actions(用信號通知milestones到達)相關(guān)聯(lián)。那些actions能夠用默認ActionHandlerorg.jbpm.delegation.action.MilestoneReachdActionHandler在流程中建模。所以actions(發(fā)信號給jbpm引擎告訴它一個(gè)milestone已經(jīng)到達)能夠像下面這樣在processdefition.xml中調度:

  ...

  <milestone name="theMilestone">

    <transition to="stateAfterMilestone" />

  </milestone>

  ...

  <state name="stateBeforeReachingMilestone" swimlane="initiator">

    <transition to="stateAfterReachingMilestone">

      <action>

          <delegation class="org.jbpm.delegation.action.MilestoneReachedActionHandler">theMilestone</delegation>

      </action>

    </transition>

  </state>

  ...

modelling a milestone in the processdefinition.xml

 

process-state:

<!ELEMENT process-state ( description?, delegation, action*, transition+ ) >

<!ATTLIST process-state name CDATA #REQUIRED>

dtd fragment for a process-state

一個(gè)process-state符合父過(guò)程的invocation。父過(guò)程執行到一個(gè)procee-state時(shí)候就開(kāi)始一個(gè)子過(guò)程的執行。過(guò)程殘留在process-state中用以子過(guò)程的持續。當一個(gè)子過(guò)程完成后,就從一個(gè)process-state中離開(kāi)了。

Decision:

<!ELEMENT decision ( description?, delegation, action*, transition+ ) >

<!ATTLIST decision name CDATA #REQUIRED>

dtd fragment for a decision

一個(gè)decision用以決定在多個(gè)執行路徑中哪個(gè)才可以被執行。如果你是一個(gè)程序員,把它可以理解成if-then=else結構即可,當然。一個(gè)decision能夠具有許多離開(kāi)的變遷。

需要注意的是一個(gè)decision對某個(gè)情況建模,在這里工作流引擎根據上下文(=variables)和一些其他外部資源決定哪個(gè)路由可以被接受。作為可供選擇的(可以替代的做法),你設計從一個(gè)狀態(tài)出發(fā)具備多個(gè)變遷。在那種情況下,jbpm客戶(hù)端必須通過(guò)調用以一個(gè)選擇變遷名字作為一個(gè)參數的endOfState方法決定哪個(gè)變遷被執行。

Fork(分支):

<!ELEMENT fork ( description?, delegation?, action*, transition+ ) >

<!ATTLIST fork name               CDATA #REQUIRED

               corresponding-join CDATA #IMPLIED>

dtd fragment for a fork

這個(gè)比較好理解,定義一般普通的fork行為一般是通過(guò)ForkHandler接口。但是默認行為(當在fork中沒(méi)有delegetion時(shí)候)是fork的每個(gè)變遷都將獲得一個(gè)子token。所以?xún)H僅對一些高級外來(lái)的并發(fā),你才需要實(shí)現ForkHandler.

一般情況下,一個(gè)fork會(huì )有一個(gè)相關(guān)的join。這個(gè)join定義個(gè)并發(fā)的block。默認下forkjoin僅支持嚴格的嵌套,并且默認情況不支持繞過(guò)并發(fā)block邊界的變遷。

public interface ForkHandler {

  void fork( ForkContext forkContext ) throws ExecutionException;

}

the ForkHandler interface

 

join

<!ELEMENT join ( description?, delegation?, action*, transition ) >

<!ATTLIST join name               CDATA #REQUIRED

               corresponding-fork CDATA #IMPLIED>

dtd fragment for a join

 

一個(gè)fork joins用于多條路徑執行,用JoinHandler接口指定普通的join行為。但是默認情況下(沒(méi)有delegation)是所有fork上的子token合并。最后token到達join將會(huì )觸發(fā)父token最后引發(fā)join上的離開(kāi)變遷。所以?xún)H僅高級外來(lái)的并發(fā)你才需要實(shí)現JoinHandler.

約束:一個(gè)join只能有一個(gè)離開(kāi)變遷。

public interface JoinHandler {

   void join( JoinContext joinContext ) throws ExecutionException;

}

the JoinHandler interface

 

結束狀態(tài):

<!ELEMENT end-state EMPTY >

<!ATTLIST end-state name CDATA #REQUIRED>

dtd fragment for end-state

一個(gè)過(guò)程定義有一個(gè)精確的結束狀態(tài)。當一個(gè)過(guò)程實(shí)例執行到一個(gè)結束狀態(tài)時(shí)候,這個(gè)過(guò)程實(shí)例就結束了。

 

變遷(transition):

<!ELEMENT transition ( action* )>

<!ATTLIST transition name CDATA #IMPLIED

                     to   CDATA #REQUIRED>

dtd fragment for a transition

變遷用來(lái)指定節點(diǎn)之間的連接。變遷元素應該放在node里面,那么這個(gè)變遷就會(huì )從這個(gè)節點(diǎn)出離開(kāi)。

 

Action

<!ELEMENT action ( delegation ) >

<!ATTLIST action event-type (process-start|process-end|

                             state-enter|state-leave|state-after-assignment|

                             milestone-enter|milestone-leave|

                             decision-enter|decision-leave|

                             fork-enter|fork-every-leave|

                             join-every-enter|join-leave|

                             transition) #IMPLIED>

dtd fragment for an action

一個(gè)action是一段java代碼。在過(guò)程執行期間在一些事件基礎之上action在工作流引擎上執行。

Action總是被定義成一個(gè)過(guò)程定義元素(process-definition, state, transition, decision, ...)的子元素。當action執行的時(shí)候,父元素會(huì )在過(guò)程執行時(shí)候外加一些事件類(lèi)型來(lái)定義精確時(shí)刻??梢韵胂蟮玫?,一個(gè)action的可能事件類(lèi)型依賴(lài)于action被包含進(jìn)去的元素。事件類(lèi)型名字(event-type-names)被暗示出是他們應用到的元素(理解有誤)。javadoc中有事件類(lèi)型,可以進(jìn)行查看。

 

public interface ActionHandler {

  void execute( ExecutionContext executionContext );

}

the ActionHandler interface

 

delegation

<!ELEMENT delegation ( #PCDATA ) >

<!ATTLIST delegation class CDATA #REQUIRED>

dtd fragment for a delegation

解釋在約束元素和delegation 類(lèi)必須實(shí)現的接口之間的關(guān)聯(lián)。

四、其他process archive文件

當一個(gè)process archive被部署,processdefinition.xml將被解析并且把信息存儲到jbpm數據庫中去。所有其他的文件或者被存儲在數據庫中或者文件系統,與被創(chuàng )建的過(guò)程定義相關(guān)聯(lián)。作為一jbpm api的客戶(hù)端你能夠通過(guò)ExecutionReadService.getFile( Long processDefinitionId, String fileName )訪(fǎng)問(wèn)這些文件。

一個(gè)process archive和一個(gè)過(guò)程定義(process definition)之間的區別參看versioning mechanism。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Jbpm用戶(hù)指南翻譯:第11章 任務(wù)管理
Java版工作流實(shí)現技術(shù)大比拼
jbpm學(xué)習心得
第八章. 上下文
JBPM流程通過(guò)Aciton動(dòng)態(tài)創(chuàng )建TaskInstance來(lái)實(shí)現“會(huì )簽”
jbpm 4.4 表結構
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久