MassTransit请求/响应场景中发布消息超时

MassTransit请求/响应场景中发布消息超时,masstransit,Masstransit,我正在尝试设置一个MassTransit请求/响应场景。问题在于信息从未到达消费者。我在PublishRequest上收到“等待响应超时”错误。日志文件中没有显示其他错误。正在msmq中创建消息 例外信息: 异常类型:TargetInvocationException 异常消息:调用目标已引发异常。在System.RuntimeTypeHandle.CreateInstance(RuntimeType 类型、布尔publicOnly、布尔noCheck、布尔和canBeCached、, Runt

我正在尝试设置一个MassTransit请求/响应场景。问题在于信息从未到达消费者。我在PublishRequest上收到“等待响应超时”错误。日志文件中没有显示其他错误。正在msmq中创建消息

例外信息:

异常类型:TargetInvocationException 异常消息:调用目标已引发异常。在System.RuntimeTypeHandle.CreateInstance(RuntimeType 类型、布尔publicOnly、布尔noCheck、布尔和canBeCached、, RuntimeMethodHandleInternal&ctor、Boolean&bNeedSecurityCheck)位于 System.RuntimeType.CreateInstanceSlow(布尔publicOnly,布尔型 skipCheckThis、布尔填充缓存、堆栈爬网标记和堆栈标记)位于 System.RuntimeType.CreateInstanceDefaultCtor(仅限布尔值), 布尔skipCheckThis、布尔填充缓存、堆栈爬网标记和堆栈标记)
位于的System.Activator.CreateInstance(类型,布尔非公共) 位于的System.Activator.CreateInstance(类型) System.Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext requestContext,类型controllerType)

等待响应超时,请求ID: 08cfa243-4a88-ba3a-20cf-307F5491000 at 中的MassTransit.RequestResponse.RequestImpl
1.Wait()
d:\BuildAgent-03\work\8d1373c869590c5b\src\masstTransit\RequestResponse\RequestImpl.cs:line
124 at
MassTransit.RequestResponseExtensions.PublishRequest[TRequest](IServiceBus
总线、TRequest消息、操作(配置回调)
d:\BuildAgent-03\work\8d1373c869590c5b\src\MassTransit\RequestResponseExtensions.cs:line
31在中的Producer.Website.Controllers.AccountController..ctor()处
c:\Users\rick\Documents\Visual Studio
2012\Projects\ConsumerTest1\Producer.Website\Controllers\AccountController.cs:line
56

生产商设置:

            _bus = ServiceBusFactory.New(sbc =>
            {
                sbc.UseMsmq();
                sbc.VerifyMsmqConfiguration();

                sbc.UseMulticastSubscriptionClient();
                sbc.SetNetwork("Test");

               sbc.ReceiveFrom("msmq://localhost/consumer_test_1");

            });
生产者发送消息:

                var message = new AccountNewMessage()
                {
                    CorrelationId = CombGuid.Generate(),
                    UserName = “blah blah”,
                    Password = “yada yada”
                };

                this._bus.PublishRequest(message, r =>
                    {
                        r.SetTimeout(30.Seconds());

                        r.Handle<AccountNewMessageResponse>(m =>
                            {
                                var response = m;
                            });
                    });
消费者:

public class AccountNewMessageConsumer : Consumes<AccountNewMessage>.Context
{
    public void Consume(IConsumeContext<AccountNewMessage> context)
    {
        context.Respond(new AccountNewMessageResponse()
        {
            CorrelationId = context.Message.CorrelationId,
            ErrorCode = "1",
            UserId = new Random().Next(1, 10000).ToString()
        });
    }
}
公共类AccountNewMessageConsumer:Consumes.Context
{
公共void消费(IConsumeContext上下文)
{
Respond(newaccountnewmessageresponse()
{
CorrelationId=context.Message.CorrelationId,
ErrorCode=“1”,
UserId=new Random().Next(11000).ToString()
});
}
}
信息:

[Serializable]
public class AccountNewMessage : CorrelatedBy<Guid>
{
    public Guid CorrelationId { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
}

[Serializable]
public class AccountNewMessageResponse : CorrelatedBy<Guid>
{
    public Guid CorrelationId { get; set; }
    public string UserId { get; set; }
    public string ErrorCode { get; set; }
}
[可序列化]
公共类AccountNewMessage:CorrelatedBy
{
公共Guid CorrelationId{get;set;}
公共字符串用户名{get;set;}
公共字符串密码{get;set;}
}
[可序列化]
公共类AccountNewMessageResponse:CorrelatedBy
{
公共Guid CorrelationId{get;set;}
公共字符串用户标识{get;set;}
公共字符串错误代码{get;set;}
}

我做错了什么?谢谢。

您必须告诉MassTransit如何存储其订阅信息(针对MSMQ)

有两种选择:
MSMQ多播
,它将订阅信息保存在内存中;和
MSMQ运行时服务
,它将订阅信息存储在数据库中,因此它在会话之间保持不变

您选择使用哪个将取决于您是否需要永久订阅或临时订阅-来自:

永久订阅表示您希望拥有的订阅 即使您的进程已关闭(可能您正在执行 升级,并且不想错过消息)。需要临时订阅 用于您不在乎是否错过信息的情况 当你关机的时候

您没有理由不能在开发/PoC期间使用多播并在以后切换到运行时服务。docs页面还显示了如何在配置中设置每一个,当然,对于RuntimeServices,您还必须设置一个数据库

(请注意,多播可能需要一段时间来进行自我设置,因此在开始通过测试系统发送消息之前,您可能需要暂停测试系统进行预热。)

编辑:我附加了两个验证订阅和使用者的例程:在设置订阅时(即在sbc.Subscribe期间)调用第一个例程,在配置总线后调用第二个例程。也许他们会帮助发现问题

private void ValidateSubscriptions(Configurator configurator)
{
    var errors = configurator.Validate();

    Console.WriteLine("Subscription Validation");
    Console.WriteLine("-----------------------");

    foreach (var err in errors.Where(e => string.IsNullOrEmpty(e.Value) == false))
    {
        Console.WriteLine("Type: {0} Message: {1} Key: {2} Value: {3}",
            err.Disposition, err.Message, err.Key, err.Value);
    }
}

private static void ValidateBus(Configurator bus)
{
    var errors = bus.Validate();

    Console.WriteLine("Consumer Validation");
    Console.WriteLine("-------------------");

    foreach (var err in errors.Where(e => string.IsNullOrEmpty(e.Value) == false))
    {
        Console.WriteLine("Type: {0} Message: {1} Key: {2} Value: {3}",
            err.Disposition, err.Message, err.Key, err.Value);
    }
}    

您正在运行哪个版本的MT?另外,在日志文件中,我没有看到任何消息显示。只有我自己的。我将就此发布另一个问题。我们正在使用2.7.2(与RabbitMQ一起),请求/响应正在为我们工作。当MassTransit在内部生成请求id时,我们不使用CorrelationId。我已经尝试在生产者和消费者中使用UseMulticastSubscriptionClient()和SetNetwork(“test”),但行为没有改变;它仍然会在PublishRequest()时超时。我更新了我的问题,包括异常的详细信息和设置订阅存储的调用。这两个函数是相同的。。。两人都没有表现出任何错误。
private void ValidateSubscriptions(Configurator configurator)
{
    var errors = configurator.Validate();

    Console.WriteLine("Subscription Validation");
    Console.WriteLine("-----------------------");

    foreach (var err in errors.Where(e => string.IsNullOrEmpty(e.Value) == false))
    {
        Console.WriteLine("Type: {0} Message: {1} Key: {2} Value: {3}",
            err.Disposition, err.Message, err.Key, err.Value);
    }
}

private static void ValidateBus(Configurator bus)
{
    var errors = bus.Validate();

    Console.WriteLine("Consumer Validation");
    Console.WriteLine("-------------------");

    foreach (var err in errors.Where(e => string.IsNullOrEmpty(e.Value) == false))
    {
        Console.WriteLine("Type: {0} Message: {1} Key: {2} Value: {3}",
            err.Disposition, err.Message, err.Key, err.Value);
    }
}