trackby_使用trackBy启动流程
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
總結
以上是生活随笔為你收集整理的trackby_使用trackBy启动流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联通卡怎么注销 联通卡注销的方法
- 下一篇: apache spark_Apache