中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

揭秘WebSphere Process Server中SCA組件的事務(wù)實(shí)現(xiàn)機(jī)制

2019-02-26    來(lái)源:多智時(shí)代

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

SCA作為一種新的編程模型,自然也需要提供完整的事務(wù)支持。所幸的是WPS本身是基于WebSphere Application Server的,所以底層天然就具有了強(qiáng)大的事務(wù)處理能力。因此在SCA層次上只需要考慮事務(wù)的語(yǔ)法是什么,然后在合適的階段把它映射到WAS的事務(wù)上就可以了。本文從SCA容器開始說(shuō)起,然后介紹SCA的事務(wù)模型極其和J2EE事務(wù)的映射規(guī)則,最后給出一個(gè)簡(jiǎn)單的例子來(lái)看整個(gè)運(yùn)作是如何運(yùn)作的。

要了解SCA的事務(wù)是如何運(yùn)作的,首先得先知道SCA容器是如何工作的。

和大部分的容器一樣,SCA容器的設(shè)計(jì)也是基于責(zé)任鏈的——在請(qǐng)求被路由到真正的服務(wù)實(shí)現(xiàn)之前,無(wú)論是是在調(diào)用端還是服務(wù)提供端都有多個(gè)handler來(lái)先對(duì)請(qǐng)求進(jìn)行處理。同理在產(chǎn)生響應(yīng)消息后,結(jié)果也是經(jīng)過(guò)多個(gè)消息處理器后才返回給調(diào)用者的。這些消息處理器各司其責(zé),有的處理安全、有的對(duì)消息進(jìn)行驗(yàn)證,有的則處理事務(wù)等等。這種設(shè)計(jì)模式在AXIS架構(gòu)中得到了充分的體現(xiàn)。

揭秘WebSphere Process Server中SCA組件的事務(wù)實(shí)現(xiàn)機(jī)制

而SCA容器提供的的編程風(fēng)格和Web服務(wù)的動(dòng)態(tài)調(diào)用也很類似。例如在調(diào)用一個(gè)Web服務(wù)時(shí),個(gè)典型的Web服務(wù)的動(dòng)態(tài)調(diào)用代碼如下:

以下是引用片段:

Serviceservice=factory.createService(newQName(qnameService));

Callcall=service.createCall(port);

Stringresult=(String)call.invoke(params);

而在SCA中,對(duì)應(yīng)的代碼如下:

以下是引用片段:

Serviceservice=ServiceManager.INSTANCE.locateService(referencename);

Stringresult=(String)service.invoke("targetmethodname",parameters);

無(wú)論是Web服務(wù)調(diào)用時(shí)候面對(duì)的Call還是SCA調(diào)用時(shí)候的Service,他們都只是服務(wù)的一個(gè)代理,這個(gè)代理通過(guò)調(diào)用預(yù)先配置好的消息處理器對(duì)請(qǐng)求消息進(jìn)行處理,然后把消息傳遞給本地或者遠(yuǎn)程的服務(wù)實(shí)現(xiàn)端的代理,服務(wù)實(shí)現(xiàn)端的代理執(zhí)行類似的操作后調(diào)用服務(wù)實(shí)現(xiàn)。。。

在Web服務(wù)編程模型中,除了系統(tǒng)預(yù)定義的消息處理器,我們還可以加入用戶自定義的消息處理器來(lái)實(shí)現(xiàn)特定的功能。但在目前的WPS的SCA實(shí)現(xiàn)中,目前沒(méi)有提供公開的接口來(lái)支持自定義的消息處理器:

如下圖所示,在SCA的世界中,一個(gè)SCA組件是由接口、服務(wù)實(shí)現(xiàn)和引用(可選)三個(gè)部分構(gòu)成:

揭秘WebSphere Process Server中SCA組件的事務(wù)實(shí)現(xiàn)機(jī)制

其中接口部分表示該組件能提供的業(yè)務(wù)能力;實(shí)現(xiàn)則是實(shí)現(xiàn)了該接口的組件;而引用則表示在服務(wù)實(shí)現(xiàn)中需要調(diào)用到的其他服務(wù)。

在事務(wù)方面,SCA通過(guò)在三個(gè)部分(接口、服務(wù)實(shí)現(xiàn)和引用)分別提供不同的限定符(qualifier)的方式來(lái)完成事務(wù)的定制。

接口部分的限定符有:

Join Transaction. 可以取值true或者false。這個(gè)限定符表示該組件是否愿意加入到調(diào)用方的事務(wù)中。

Join Activity Session. 可以取值true或者false。這個(gè)限定符表示該組件是否愿意加入到調(diào)用方的Activity session中。

實(shí)現(xiàn)部分的限定符有:

Transaction。可以取值Global、Local或者Any。這個(gè)限定符表示該組件對(duì)運(yùn)行環(huán)境的需求。global表示需要運(yùn)行在一個(gè)全局事務(wù)中,這樣SCA容器必須保證在調(diào)用該服務(wù)實(shí)現(xiàn)時(shí)總是有一個(gè)活動(dòng)的全局事務(wù)。lobal則表示要運(yùn)行在本地事務(wù)中。容器必須掛起當(dāng)前活動(dòng)的全局事務(wù),并負(fù)責(zé)啟動(dòng)一個(gè)本地事務(wù)。any 則表示該實(shí)現(xiàn)既可以運(yùn)行在一個(gè)已有的全局事務(wù)中也可以運(yùn)行在本地事務(wù)中。如果選擇了any,容器如果發(fā)現(xiàn)當(dāng)前沒(méi)有活動(dòng)的事務(wù),就會(huì)建立一個(gè)本地事務(wù)。

Activity session:可以取值true、false或者any。

引用部分的限定符有:

Suspend transaction。取值為true或者false。用來(lái)表示在調(diào)用這個(gè)目標(biāo)服務(wù)時(shí)是否需要把當(dāng)前的全局事務(wù)掛起(但目標(biāo)服務(wù)是否能加入到這個(gè)事務(wù)中還取決于目標(biāo)服務(wù)的事務(wù)配置)。如果選擇true,則表示當(dāng)前服務(wù)的事務(wù)不會(huì)被傳播給所調(diào)用的服務(wù)。這個(gè)限定符只針對(duì)同步調(diào)用有效。

Suspend activity session。和suspend transaction類似,是否需要掛起當(dāng)前的activity session。這個(gè)限定符只針對(duì)同步調(diào)用有效。

Asynchronous invocation。取值為commit或者call。這是用來(lái)表示在通過(guò)異步的方式調(diào)用這個(gè)目標(biāo)服務(wù)時(shí),請(qǐng)求的JMS消息是否立即提交還是和當(dāng)前的事務(wù)一起提交。當(dāng)調(diào)用的目標(biāo)服務(wù)時(shí)雙向的請(qǐng)求時(shí),這兒必須選擇為commit,否則會(huì)造成死鎖。

通過(guò)這三個(gè)部分的組合就可以實(shí)現(xiàn)細(xì)粒度的事務(wù)控制?梢钥吹絊CA提供的事務(wù)描述比EJB的事務(wù)粒度更細(xì)。這樣也就能對(duì)各個(gè)組件實(shí)現(xiàn)更為精確的事務(wù)控制。

下面具體給一個(gè)例子。

比如一個(gè)SCA組件有如下的事務(wù)需求:

在運(yùn)行時(shí)候需要有全局事務(wù)但不能加入到已有的全局事務(wù)中

該組件需要調(diào)用到其他的服務(wù),希望其他的服務(wù)也能加入到自己的事務(wù)中

那么在設(shè)計(jì)上:

接口的事務(wù)限定符應(yīng)該設(shè)置為join transaction=false,這樣就防止了該組件加入到上游的事務(wù)中。

實(shí)現(xiàn)上的事務(wù)限定符應(yīng)該設(shè)置為transaction=global。這樣SCA容器在調(diào)用該實(shí)現(xiàn)之前就會(huì)啟動(dòng)一個(gè)全局事務(wù)。

引用上的事務(wù)限定符應(yīng)該設(shè)置為suspend transaction=false。這樣組件實(shí)現(xiàn)的事務(wù)就被允許傳播到被調(diào)用的服務(wù)。

在開始我們就提到WPS是建立在WAS上的,所以雖然這兒它提出了不同于J2EE的事務(wù)的限定符,但最終它還是會(huì)被映射到J2EE的事務(wù)上。這種映射如下表所示:

那么接下來(lái)的問(wèn)題就是這種映射是如何發(fā)生的呢?

這個(gè)秘密就在自動(dòng)生成的EJB部署描述符中。我們可以在WID里面做一個(gè)簡(jiǎn)單的SCA模塊,Build后看自動(dòng)生成的EJB項(xiàng)目,通過(guò)查看其EJB部署描述符可以看到在container-transaction部分有如下的一些方法的聲明:

以下是引用片段:

Module

Local

transactionNotSupportedActivitySessionNotSupported

Module

Local

transactionNotSupportedActivitySessionRequired

Module

Local

transactionNotSupportedActivitySessionSupports

NotSupported

根據(jù)SCA模塊中事務(wù)限定符的配置的不同,你所能看到的方法也不太一樣,但總共就只有九種組合。

揭秘WebSphere Process Server中SCA組件的事務(wù)實(shí)現(xiàn)機(jī)制

到這大家基本上都能知道SCA的這些限定符是如何被映射到J2EE的世界里面的了。沒(méi)錯(cuò),這兒就是利用了WAS提供的容器管理器的事務(wù)(CMT)的方式來(lái)把SCA世界的事務(wù)和J2EE的事務(wù)聯(lián)系在了一起。在運(yùn)行的時(shí)候,SCA容器中的事務(wù)消息處理器首先根據(jù)消息所處的階段,比如是在接口、實(shí)現(xiàn)還是在引用,查找到對(duì)應(yīng)的事務(wù)限定符,然后發(fā)起一次EJB調(diào)用,調(diào)用的方法就是上述的這些方法。這些方法因?yàn)橛写_定的事務(wù)屬性,所以EJB容器在接收到調(diào)用后就知道如何處理事務(wù)。在下面一小節(jié)中我們將通過(guò)一個(gè)實(shí)例來(lái)驗(yàn)證這兒的推斷。

下面我們通過(guò)一個(gè)簡(jiǎn)單例子,通過(guò)真正的代碼調(diào)用的軌跡來(lái)看是SCA的事務(wù)是如何運(yùn)作的。

揭秘WebSphere Process Server中SCA組件的事務(wù)實(shí)現(xiàn)機(jī)制

在上面的場(chǎng)景中,component1的事務(wù)需求是需要運(yùn)行在全局事務(wù)中并且可以加入到已有的事務(wù);component2則只能運(yùn)行在自己的全局事務(wù)中;而component3則只能運(yùn)行在本地事務(wù)中。具體配置如下:

  • Stand-alone Reference的引用上面設(shè)置的事務(wù)限定符Suspend transaction為false。
  • Component1接口上的事務(wù)限定符Join transaction為true。
  • Component1實(shí)現(xiàn)上的事務(wù)限定符Transaction為Global。
  • Component1到Component2上的事務(wù)限定符Suspend transaction為false。
  • Component1到Component3上的事務(wù)限定符Suspend transaction為true。
  • Component2接口上的事務(wù)限定符Join transaction為false。
  • Component2實(shí)現(xiàn)上的事務(wù)限定符Transaction為Global。
  • Component3接口上的事務(wù)限定符Join transaction為false。
  • Component3實(shí)現(xiàn)上的事務(wù)限定符Transaction為L(zhǎng)ocal。

前面通過(guò)一個(gè)JSP來(lái)調(diào)用這個(gè)stand-alone reference,在各個(gè)component的實(shí)現(xiàn)中打印當(dāng)前的Thread.currentThread().getStackTrace()?梢钥吹饺缦碌妮敵觯

在component1實(shí)現(xiàn)中的 輸出中我們可以看到如下的EJB方法被調(diào)用到.這表示了component1運(yùn)行在一個(gè)全局事務(wù)中。

以下是引用片段:

transactionRequiredActivitySessionNotSupported

下面是component2實(shí)現(xiàn)中的輸出。

以下是引用片段:

transactionRequiredActivitySessionNotSupported

transactionNotSupportedActivitySessionNotSupported

transactionRequiredActivitySessionNotSupported

可以看到有三次EJB調(diào)用,第一次是transactionRequiredActivitySessionNotSupported,這對(duì)應(yīng)了對(duì) component2引用上的事務(wù)限定符為suspend transaction=false,表示調(diào)用時(shí)候需要把當(dāng)前事務(wù)傳播到下游的服務(wù)中。第二次是 transactionNotSupportedActivitySessionNotSupported,表示掛起當(dāng)前的事務(wù),這對(duì)應(yīng)了 component2接口上面的jointransaction為false,第三次是重新啟動(dòng)一個(gè)新的全局事務(wù) transactionRequiredActivitySessionNotSupported,這對(duì)應(yīng)了component2的實(shí)現(xiàn)上的事務(wù)限定符 transaction為global。

component3實(shí)現(xiàn)中的輸出。

以下是引用片段:

transactionNotSupportedActivitySessionNotSupported

transactionRequiredActivitySessionNotSupported

這由于component1對(duì)component3引用上的事務(wù)限定符suspend transaction為false,所以這兒沒(méi)有EJB調(diào)用(因?yàn)閃AS默認(rèn)會(huì)自動(dòng)在當(dāng)前線程上傳播事務(wù))。然后由于接口上聲明不參加上游事務(wù),所以產(chǎn)生了一次EJB調(diào)用,調(diào)用的方法是transactionRequiredActivitySessionNotSupported,從而為該SCA組件建立了一個(gè)新的事務(wù);但由于該組件實(shí)現(xiàn)需要運(yùn)行在本地事務(wù)中,因此再次發(fā)生EJB調(diào)用,方法是 transactionNotSupportedActivitySessionNotSupported,在上面的EJB描述符中可以看到該方法對(duì)應(yīng)的事務(wù)屬性是NotSupported。

至此,我們可以得出如下的結(jié)論:

1. WPS的SCA的事務(wù)實(shí)現(xiàn)時(shí)給予WAS的聲明式事務(wù)。

2. WPS通過(guò)一系列的消息處理器來(lái)實(shí)現(xiàn)不同的事務(wù)需求。

由此我們可以得到當(dāng)執(zhí)行如下的服務(wù)調(diào)用時(shí)所經(jīng)歷的事務(wù)處理步驟為:

以下是引用片段:

Serviceservice=ServiceManager.INSTANCE.locateService(referencename);

Stringresult=(String)service.invoke("targetmethodname",parameters);

1. 調(diào)用端SCA容器調(diào)用負(fù)責(zé)處理事務(wù)的消息處理器,該消息處理器根據(jù)引用上面定義的事務(wù)限定符決定是否需要調(diào)用EJB方法來(lái)掛起事務(wù)。

2. 在結(jié)果一系列處理后消息被傳遞到服務(wù)提供端,然后SCA容器調(diào)用處理接口事務(wù)的消息處理器,消息處理器根據(jù)接口上定義的事務(wù)限定符決定是否要調(diào)用發(fā)起一次EJB調(diào)用來(lái)掛起當(dāng)前的事務(wù)。

3. SCA容器接著調(diào)用負(fù)責(zé)處理服務(wù)實(shí)現(xiàn)的事務(wù)處理器,該處理器根據(jù)實(shí)現(xiàn)上配置的事務(wù)限定符決定是否調(diào)用EJB方法來(lái)啟動(dòng)一個(gè)本地事務(wù)。

揭秘WebSphere Process Server中SCA組件的事務(wù)實(shí)現(xiàn)機(jī)制

揭秘WebSphere Process Server中SCA組件的事務(wù)實(shí)現(xiàn)機(jī)制SCA開發(fā):開發(fā)示例SCA應(yīng)用程序

揭秘WebSphere Process Server中SCA組件的事務(wù)實(shí)現(xiàn)機(jī)制SCA開發(fā):開發(fā)示例 SCA 應(yīng)用程序(一)

揭秘WebSphere Process Server中SCA組件的事務(wù)實(shí)現(xiàn)機(jī)制SCA開發(fā):開發(fā)示例 SCA 應(yīng)用程序(二)

揭秘WebSphere Process Server中SCA組件的事務(wù)實(shí)現(xiàn)機(jī)制SCA開發(fā):開發(fā)示例 SCA 應(yīng)用程序(三)

揭秘WebSphere Process Server中SCA組件的事務(wù)實(shí)現(xiàn)機(jī)制深入剖析SCA異步調(diào)用模式(二)

揭秘WebSphere Process Server中SCA組件的事務(wù)實(shí)現(xiàn)機(jī)制深入剖析SCA異步調(diào)用模式(一)

揭秘WebSphere Process Server中SCA組件的事務(wù)實(shí)現(xiàn)機(jī)制Forrester指出2010年應(yīng)用開發(fā)方面的變化

揭秘WebSphere Process Server中SCA組件的事務(wù)實(shí)現(xiàn)機(jī)制揭秘WebSphere Process Server中SCA組件的事務(wù)實(shí)現(xiàn)機(jī)制

在不久的將來(lái),云計(jì)算一定會(huì)徹底走入我們的生活,有興趣入行未來(lái)前沿產(chǎn)業(yè)的朋友,可以收藏云計(jì)算,及時(shí)獲取人工智能、大數(shù)據(jù)、云計(jì)算和物聯(lián)網(wǎng)的前沿資訊和基礎(chǔ)知識(shí),讓我們一起攜手,引領(lǐng)人工智能的未來(lái)!

標(biāo)簽: 安全 大數(shù)據(jù) 代碼 云計(jì)算

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:Eyefi完全開放其云存儲(chǔ)和同步照片服務(wù)

下一篇:Hadoop架構(gòu)替代數(shù)據(jù)倉(cāng)庫(kù) 云計(jì)算虛擬技術(shù)提升存儲(chǔ)能力