日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用trackBy启动流程

發布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用trackBy启动流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

仍然沿用Corda Services的趨勢,我還有其他一些技巧可幫助您的CorDapp順利工作。 這次,我們將重點關注使用trackBy從服務內部啟動流以及如果您不小心可能會引起的離散問題。

這應該是一個相對簡短的職位,因為我可以依靠之前的職位: Corda Services 101和Corda Services的 異步流程調用 。 在Corda Services的“異步流”調用中找到的內容與此帖子非常相關,并且將包含此帖子中未包含的其他信息。

這篇文章適用于Corda Open Source和Enterprise。 撰寫本文時的版本為Open Source 3.2和Enterprise 3.1 。

trackBy簡介

trackBy允許您編寫在包含指定類型的狀態的事務完成時執行的代碼。 無論將它們作為輸入還是輸出,代碼仍將觸發。

在這里,您可以決定要執行的操作。 也許很簡單,例如記錄已收到狀態的日志。 或者,也許更有趣的事情,例如啟動新流程。 此用例對該功能非常有意義。 節點接收到新狀態或消耗新狀態后,便可以啟動代表流程中下一個邏輯步驟的新流程。

此外,還有trackBy兩個版本。 一是我一直提到的trackBy ,可以在CorDapp中使用。 另一個vaultTrackBy是使用RPC從節點外部調用的。

本文中提出的問題僅在CorDapp版本trackBy 。 因此,在本文的其余部分中,我們將不包括vaultTrackBy 。

這個離散的問題是什么?

僵局。 當我這樣說時,它不是很離散。 但是,它的發生方式相當微妙,需要對將要解決的問題有一個很好的了解。 如前所述,此問題與Corda Services的異步流調用中詳細介紹的問題非常相似。 此外,當我在項目中遇到此問題時,R3再次大喊大叫以診斷此問題,我確信他們會解決這個問題。 在此之前,如果您遇到相同的問題,這篇文章應該可以省去一些麻煩。

我將引用我在上一篇文章中寫的內容,因為它的解釋僅缺少關于該帖子的一點。

“ Flow Worker隊列負責執行Flow執行的順序,并在Flow添加和完成時填充并為空。 該隊列對于協調節點內流的執行至關重要。 當涉及到多線程Flows本身時,這也是痛苦的根源。”

“我為什么要談論這個隊列? 好吧,我們需要格外小心,不要將無法完成的流程填滿隊列。

怎么會這樣 通過在正在執行的流程中啟動流程,然后流程等待其完成。 直到隊列的線程池中的所有線程都遇到這種情況,這才不會引起問題。 一旦發生,它將使隊列陷入僵局。 沒有流程可以完成,因為它們都依賴于排隊的多個流程來完成。”

那標志著我的復制面的終結。 我會繼續說這句話,實際上,我建議您通讀Corda Services的異步流調用,以對該主題進行徹底的解釋。

這與trackBy有什么關系? 從服務調用trackBy將在Flow Worker線程上運行每個可觀察的事件。 換句話說,每個事件都占據隊列中的一個位置。 從此處啟動Flow將向隊列添加另一個項目,并掛起當前線程,直到Flow完成。 它將一直保留在隊列中,直到那個時候。 如果您遇到的情況是隊列中的所有位置都由可觀察的事件而不是實際的流程所占據,那么我為您提供了一個詞。 僵局。 這與我之前詳細介紹過的情況完全相同,只是從不同的震中開始。

從好的方面來說,解決方案是小菜一碟(這句話從何而來?)。

解決問題的部分

現在您知道了問題所在。 將“中斷”版本更改為可避免死鎖的版本,僅需要幾行。

讓我們看一些與導致我踏上這個地雷的代碼非常相似的代碼:

每當節點收到新的MessageState時,此Service就會使用trackBy啟動新的Flow。 由于前面提到的所有原因,此代碼可能會死鎖。 我們不知道什么時候發生,或者是否會發生。 但是,可以。 因此,我們可能應該在問題解決之前對其進行整理。

下面的代碼將做到這一點:

我添加了一些注釋以使更改更清晰,因為僅添加了幾行。

所有這些更改所做的就是在新線程上啟動Flow。 然后,這將允許當前線程結束。 請記住,這很重要,因為該線程保持在隊列中的某個位置。 允許它結束,為接下來發生的事情騰出空間。 它是來自trackBy還是Flow的另一個可觀察事件。 不要緊。 只要釋放線程,就不會由于該代碼而發生死鎖。

從此線程釋放您

請花一點時間來欣賞我在本節標題中所做的雙關語的榮耀。 也許不是很好,但我仍然為此感到自豪。

總之,在Corda Service中使用trackBy非常適合根據已保存到節點的信息來啟動新流程。 但是,從trackBy觀察開始新流程時,您需要小心。 這是由于可觀察到的保持在Flow Worker線程上,因此是隊列中的一個點。 如果吞吐量達到更高的數量,則可能會出現節點死鎖的風險。 您可能會遇到以下情況:隊列被所有線程都阻塞,這些線程都在等待流完成,但隊列中沒有實際的流。 通過將Flow調用移動到與可觀察線程不同的線程上。 您可以釋放隊列中曾經保留的位置。 現在,您的trackBy代碼不再可能導致死鎖。

這篇文章中使用的代碼可以在我的GitHub上找到 。

如果您認為這篇文章有幫助,可以在Twitter上@LankyDanDev關注我,以跟上我的新文章。

翻譯自: https://www.javacodegeeks.com/2018/10/starting-flows-trackby.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的使用trackBy启动流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。