1

我有一個運行RunAsync方法內的後臺進程的無狀態服務。Azure服務結構如何在完成時重新運行RunAsync方法?

此後臺進程必須永久運行。它所做的是無關的,但它實際上每60秒輪詢一次數據庫。

與Worker角色或WebJob不同,Service Fabric服務中的RunAsync方法可以運行至完成,服務實例將保持運行狀態。

當Service Fabric發出傳遞給RunAsync的取消令牌時,會發生這種情況。

一旦Service Fabric決定從RunAsync方法優雅地返回,如何再次重新運行我的輪詢例程?

而我該如何確定爲什麼Service Fabric信號取消令牌在第一位?

我目前的解決方法是拋出異常,以便服務被強制重啓。

public class Stateless1 : StatelessService 
    {  
     protected override async Task RunAsync(CancellationToken cancellationToken) 
     { 
       try 
       { 
        await Start(cancellationToken); 
       } 
       catch(OperationCanceledException ex) 
       { 
        throw; 

    //If an OperationCanceledException escapes from 
    //RunAsync(CancellationToken) and Service Fabric runtime has requested 
    //cancellation by signaling cancellationToken passed to 
    //RunAsync(CancellationToken), Service Fabric runtime handles this exception and 
    //considers it as graceful completion of RunAsyn(CancellationToken).      

       } 
       catch(Exception ex) 
       { 
        // log error 
        throw; 
// force service to restart, If an exception of any other type escapes from 
// RunAsync(CancellationToken) then the process that is hosting this service 
// instance is brought down 
       } 

     } 

     private async Task Start(CancellationToken cancellationToken) 
     { 
      while(true) 
      { 
        cancellationToken.ThrowIfCancellationRequested(); // honour cancellation token 
       try 
       { 


        await PollDatabase(); 
       } 

       catch(Exception ex) 
       { 
        // log error 
        throw; 
       } 
       finally 
       { 
        for (var i = 0; i < 12; i++) 
        { 
         cancellationToken.ThrowIfCancellationRequested(); // honour cancellation token 

         await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); 
        } 
       } 

      }    
     } 
    } 
+0

我應該補充一點,當Service Fabric信號取消時,PollDatabase()中沒有發生異常 – puri

+0

有一個'CloseAsync',但是'RunAsync'獲取'CancellationToken'和'CloseAsync'這個事實令人困惑。你爲什麼需要兩個? –

回答

0

一旦服務織物決定正常從RunAsync方法返回,我怎麼能再次運行我的查詢程序?

據我所知,一旦它返回,RunAsync將被再次調用。 在Reliable services lifecycle overview上,您可以閱讀以下內容。

對於有狀態的可靠服務如果服務從主服務器降級後升級爲主服務器,則會再次調用RunAsync()。

您還可以在那裏閱讀正在降級和升級的主副本的生命週期,其中不包括OnCloseAsync。

我該如何確定爲什麼Service Fabric發信號通知取消令牌?

恐怕你需要搜索拋出的異常。請注意,我不確定這個答案,這只是我的懷疑。

相關問題