繁体   English   中英

试图从MassTransit消费者那里获取消息

[英]Trying to get the message from the MassTransit consumer

我正在使用Masstransit和RabbitMQ来发布事件(没有消费者,只能使用发布者),此刻,我正在尝试创建集成测试以验证消息是否已发布,如果要发布,我想检查是否正确的消息。 为此,我创建了一个使用者以使用队列中的消息,并将其与我的期望进行比较。 这里的问题是,我不能使用邮件。 该事件已成功发布,但无法获取消息。

这是负责连接消费者的类

public class ServiceBusHelper
{

    private IBusControl bus;
    private readonly string serviceBusQueueName = ConfigurationManager.AppSettings["ServiceBusQueuename"];
    private readonly string serviceBusEndpoint = ConfigurationManager.AppSettings["ServiceBusEndPoint"];
    private readonly string serviceBusUsername = ConfigurationManager.AppSettings["ServiceBusUsername"];
    private readonly string serviceBusPassword = ConfigurationManager.AppSettings["ServiceBusPassword"];

    public ConnectHandle HandleObserver { get; set; }

    public void ConnectRabbitMQ()
    {
        bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
        {
            var host = cfg.Host(
                new Uri(serviceBusEndpoint),
                h =>
                {
                    h.Username(serviceBusUsername);
                    h.Password(serviceBusPassword);
                });

            cfg.ReceiveEndpoint(
            serviceBusQueueName,
            e =>
            {

                e.Consumer<ServiceBusEventsHelper>();

            });
        });

        //Observer
        var observer = new PublishedObserverHelper();
        HandleObserver = bus.ConnectPublishObserver(observer);

    }


}

这是将使用消息的类

public class ServiceBusEventsHelper : IConsumer<ITransportCreatedEvent>
{
    public ITransportCreatedEvent Result { get; set; }


    public async Task Consume(ConsumeContext<ITransportCreatedEvent> context)
    {
        Result = await Task.FromResult(context.Message);

    }


}

在测试方法中我有这个

            ServiceBusEventsHelper eventHelper = new ServiceBusEventsHelper();
        ServiceBusHelper busHelper = new ServiceBusHelper();

        try
        {
            busHelper.ConnectRabbitMQ();
            transportResponseDto = await this.transportClient.CreateTransportAsync(transportRequest);
            handle = busHelper.HandleObserver;

            var eventResponse = eventHelper.Result;// Allways NULL
        }
        catch (Exception ex)
        {
            Assert.Fail(ex.GetDetailMessage());
        }

我试图得到这样的消息结果

var eventResponse = eventHelper.Result;// Allways NULL

但始终为空。

有人可以帮我吗?

我有一个服务,其中一个方法是CreateTransportAsync(),在该方法中,我称为Publish

public async Task<TransportResponseDto> CreateTransportAsync(TransportDto request){

    .
    .
    .
    await this.RaiseTransportCreatedEvent(transportResponseDto);
    }

    private async Task RaiseTransportCreatedEvent(TransportResponseDto transportResponseDto)
    {
        var evt = CreateTransportEvent(transportResponseDto);
        await this.serviceBus.Publish(evt).ConfigureAwait(false);
    }

public class ServiceBus<T> : IServiceBus<T> where T : class
{
    private readonly IBus bus;

    public ServiceBus(IBus bus)
    {
        this.bus = bus;
    }

    public Task Publish(T evt)
    {
        return bus.Publish(evt, evt.GetType());
    }
}

这就是我发布活动的方式,并且有效。 现在,我正在尝试在所有其他解决方案中使用集成测试来测试所有这些功能,在这里我试图创建使用者以使用队列中的消息。 然后,我想验证该消息(与json文件中的伪造消息进行比较),看一切是否正常。 问题是我无法收到该消息,我无法理解发生了什么。 PS:我不太理解您在第3点要说的内容。谢谢

  1. 您需要通过调用bus.Start()来启动总线。 您不执行此操作,因此一无所获。
  2. 目前尚不清楚transportClient.CreateTransportAsync功能。 谁在发布消息?
  3. 每个消耗的消息都会实例化使用者。 您在“测试”中所做的工作-实例化了使用者的一个实例,并保持对该实例的引用。 然后,您在某处发送消息。 MassTransit创建您的使用者的新实例 ,更新字段,然后处置该实例。 但是,您正在检查最初创建的实例的Result ,该实例从未收到任何消息。 它将始终为null
  4. 从发布者到消费者传递消息需要花费时间。 初始化总线后,您正在尝试直接检查结果。 我很确定,即使您修复(1),(2)和(3),您也永远不会这么快

我不确定您到底要测试什么。 使用MassTransit,发布和使用消息可在所有传输中使用。 您可以从Github中获取任何示例,进行构建,运行并查看其运行情况。

RabbitMQ传输也有许多测试,这些测试显示了如何创建类似的东西。 例如,检查ConsumerBind_Specs.cs文件。

此外,如果要使用一些现有的使用者实例,则可以按照文档“ 连接现有的使用者实例”中的说明将此实例连接到总线。 使用e.Instance代替e.Consumer将使您的测试工作正常进行,以等待Consume方法完成。 但是,这并不是真正流行的方法,因为您确实希望将使用者范围限制为仅一个消息处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM