es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tiempo de espera en CreateRequestClient en el volumen de prueba después de la actualización de MassTransit.

Acabo de actualizar de MassTransit 6.3.2 a 7.2.4. Estoy utilizando .Net Core 5.

La siguiente prueba unitaria funcionaba bien antes de la actualización, pero falla después.

using var harness = new InMemoryTestHarness();

harness.Consumer(() => new MockedxxxService(), xxxEndPoint);

harness.Start().Wait();

IBus endpoint = harness.Bus;

var tasks = new System.Collections.Concurrent.ConcurrentBag<><string>>();
var result = Parallel.For(0, 100, index =>
{
    var sut = new xxxRetriever(..., endpoint, ...);
    tasks.Add(sut.Getxxx(paramx));
});

Assert.True(result.IsCompleted);

await Task.WhenAll(tasks);

El código en la clase xxxRetriever se ve así.

public async Task<string> Getxxx(string paramx)
{

   try
   {
      var serviceAddress = new Uri("queue:" + ...);

      var xxxService = _busService.CreateRequestClient<xxxcontract>(serviceAddress, TimeSpan.FromMilliseconds(xxx));
      var xxxResponse = await xxxService.GetResponse<xxxresultcontract>(new
      {
          ...
      }).ConfigureAwait(false);

     ....
   }
}

El punto final se inyecta en la clase como un IBus.

El servicio simulado se ve así.

public class MockedxxxService : IConsumer<xxxcontract>
{

    public async Task Consume(ConsumeContext<xxxcontract> context)
    {
        await context.RespondAsync<xxxresultcontract>(new { ... });
    }
}

Las pruebas se ejecutan bien cuando limitamos el número de tareas a alrededor de 30. Pero por encima de eso, falla consistentemente con el mensaje “Timeout waiting for response, RequestId: …”.

Se agradecería cualquier ayuda.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Problema con la actualización de MassTransit 7.2.4 y timeout en la prueba unitaria

    Después de actualizar de MassTransit 6.3.2 a 7.2.4, una prueba unitaria que funcionaba correctamente ahora falla consistentemente con un error de timeout cuando el número de tareas es mayor a 30.

    El código en la prueba crea un entorno de prueba en memoria, lo inicia y configura un consumidor para un servicio simulado. El bucle Parallel.For crea una nueva instancia de la clase xxxRetriever y llama a su método Getxxx, pasando un parámetro y el punto final IBus inyectado.

    El método Getxxx crea una nueva Uri para la dirección del servicio, configura un cliente de solicitud usando el método CreateRequestClient e intenta obtener una respuesta usando el método GetResponse.

    El servicio simulado es un simple IConsumer que responde con un falso xxxResultContract.

    El problema parece estar relacionado con el número de tareas que se ejecutan en paralelo. Cuando el número de tareas se limita a alrededor de 30, la prueba se ejecuta correctamente, pero si es mayor, ocurre un error de timeout.

    Se agradecerían sugerencias sobre cómo resolver este problema.

Comments are closed.