1

I'm trying to test whether the connection string is null using Polly. If it is null, I want to try three times using the CircuitBreaker and the message should be outputted in the Console window.

Policy policy = null;
   
// Break the circuit after the specified number of exceptions
// and keep circuit broken for the specified duration.
policy = Policy
               .Handle<NullReferenceException>()
               .CircuitBreaker(3, TimeSpan.FromSeconds(30)); 
try
{
    string connected = policy.Execute(() => repository.GetConnectionString());
}       
catch (Exception ex)
{
    Console.WriteLine("{0}",ex.Message);               
}     

and the GetConnectionString method is:

public string GetConnectionString()
{
     SqlConnection conn = new SqlConnection();
     conn.ConnectionString = ConfigurationManager.ConnectionStrings["Test1"].ConnectionString;
     return conn.ConnectionString;
}

In order to test this, in the App.config I have changed the connection string name.

<connectionStrings>
    <add name="Testconnectionstring" connectionString="Data Source=(Local);Initial Catalog=Test;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
</connectionStrings>

However it doesn't seem to handle NullReferenceException.

When I debug the application - It opens CircuitBreakerEngine.cs not found and prints only

"Object reference not set to an instance of an object".

Expected : To print Object reference not set to an instance of an object thrice and teh message from the BrokenCircuitException

Peter Csala
  • 17,736
  • 16
  • 35
  • 75
Dev
  • 1,451
  • 20
  • 30

1 Answers1

5

I believe you have misunderstood what the CircuitBreaker policy does, as described at this similar question: Polly framework CircuitBreakerAsync does not retry if exception occur

A circuit-breaker does not of itself orchestrate any retries. Rather, it exists to measure the rate of faults on delegates executed through it - and trip the circuit if the fault rate becomes too high. As its purpose is only as a measuring-and-breaking device, it indeed rethrows exceptions from delegates executed through it: hence the NullReferenceException you are seeing rethrown.

EDIT: This behaviour of the circuit-breaker, and its difference from retry, is also clearly described in the Polly wiki, at: https://github.com/App-vNext/Polly/wiki/Circuit-Breaker

To do what I think you want to do, you need to combine retry policy with circuit breaker policy as described at Polly framework CircuitBreakerAsync does not retry if exception occur. Polly now offers PolicyWrap to make combining policies easy.

Community
  • 1
  • 1
mountain traveller
  • 7,591
  • 33
  • 38