3

MassTransit リクエスト/レスポンス シナリオを設定しようとしています。問題は、メッセージが消費者に届かないことです。PublishRequest で「応答待ちタイムアウト」エラーが発生します。ログ ファイルに他のエラーは表示されません。msmq でメッセージが作成されています。

例外情報:

例外の種類: TargetInvocationException 例外メッセージ: 呼び出しのターゲットによって例外がスローされました。System.RuntimeTypeHandle.CreateInstance (RuntimeType タイプ、ブール型 publicOnly、ブール型 noCheck、ブール型 & canBeCached、RuntimeMethodHandleInternal & ctor、ブール型 & bNeedSecurityCheck) で System.RuntimeType.CreateInstanceSlow (ブール型 publicOnly、ブール型 skipCheckThis、ブール型 fillCache、StackCrawlMark & stackMark) で System.RuntimeType.CreateInstanceDefaultCtor (Boolean publicOnly、Boolean skipCheckThis、Boolean fillCache、StackCrawlMark& stackMark)
System.Activator.CreateInstance(Type 型、Boolean nonPublic) で System.Activator.CreateInstance(Type 型) で System.Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext requestContext、型 controllerType) で

応答待ちのタイムアウト、RequestId: MassTransit.RequestResponse.RequestImpl 1 configureCallback での 08cfa243-4a88-ba3a-20cf-307f54910000 1.Wait() in d:\BuildAgent-03\work\8d1373c869590c5b\src\MassTransit\RequestResponse\RequestImpl.cs:line 124 at MassTransit.RequestResponseExtensions.PublishRequest[TRequest](IServiceBus bus, TRequest message, Action(d:\BuildAgent-03\work\8d1373c869590c5b\src\MassTransit\RequestResponseExtensions.cs: プロデューサーの 31 行目)。 c:\Users\rick\Documents\Visual Studio 2012\Projects\ConsumerTest1\Producer.Website\Controllers\AccountController.cs:line 56 の Website.Controllers.AccountController..ctor()

プロデューサーのセットアップ:

            _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;
                            });
                    });

消費者設定:

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

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

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

                sbc.Subscribe(subs => subs.Instance(new AccountNewMessageConsumer()));
            });

消費者:

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()
        });
    }
}

メッセージ:

[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; }
}

私は何を間違っていますか?ありがとうございました。

4

1 に答える 1

0

サブスクリプション情報を保存する方法を MassTransit に指示する必要があります (MSMQ 用)。

2 つの選択肢があります。MSMQ Multicastサブスクリプション情報をメモリに保持する方法とMSMQ Runtime Services、サブスクリプション情報をデータベースに格納してセッション間で永続化する方法です。

どちらを使用するかの選択は、永続的なサブスクリプションと一時的なサブスクリプションのどちらが必要かによって異なります - ドキュメントから:

永続的なサブスクリプションは、プロセスがシャットダウンされた場合でも維持したいサブスクリプションを表します (アップグレードを行っていて、メッセージを見逃したくない場合など)。一時的なサブスクリプションは、シャットダウン中にメッセージを見逃してもかまわない場合に使用されます。

開発/PoC 中にマルチキャストを使用し、後で RuntimeServices に切り替えることができない理由はありません。docs ページには、構成でそれぞれをセットアップする方法も示されています。もちろん、RuntimeServices では、データベースもセットアップする必要があります。

(マルチキャストのセットアップには少し時間がかかる場合があるため、メッセージの送信を開始する前に、テスト システムを一時停止してウォームアップする必要がある場合があることに注意してください。)

編集: サブスクリプションとコンシューマーを検証するルーチンをいくつか追加しました。1 つ目はサブスクリプションのセットアップ中 (つまり、sbc.Subscribe 中) に呼び出し、2 つ目はバスの構成時に呼び出します。おそらく、彼らは問題を見つけるのに役立つでしょうか?

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);
    }
}    
于 2012-12-06T17:13:41.983 に答える