2

サーバー (Windows Server 2008) で EasyNetQ の要求/応答パターンを使用しているときに問題が発生しました。現時点では、ローカルで再現することはできません。

セットアップでは、EasyNetQ の要求/応答パターンを介して接続された 2 つの Windows サービス (テスト用のコンソール アプリケーションとして実行) があります。これは、要求がタイムアウトするまで要求側が応答を「消費」しないサーバーで、最近まで期待どおりに機能していました。

EasyNetQ のコンソール ログを含むペーストビンへの 2 つのリンクを含めました。これにより、問題がもう少し明確になることを願っています。

リクエスト側

応答側

それに加えて、私のリクエストコードは次のようになります。

var request = new foobar(); 
var response = _bus.Request<foobar, foobar2>(request);

そして応答側で:

var response = new response();
_bus.Respond<foobar, foobar2>(request =>
       {                    
            try
            {
                ....
                return response;
            }
            catch (Exception e)
            {
                ....
                return response;
            }
        });

私が言ったように、要求側は期待どおりに要求を送信し、応答側はそれを消費/キャッチします。これは正常に機能しますが、応答側が処理を完了して応答すると (メッセージは RabbitMQ 管理で確認できます)、要求がタイムアウトになるまで、要求は応答を消費/キャッチしません (デフォルトのタイムアウトは 10 秒です。同様に 60 秒に設定してみましたが、違いはありません)。これは、RequestSide に表示されるように、上記のリンクのログでも明らかであり、以前にタイムアウトした応答キューから 5 つほどのメッセージが受信されています。

処理に時間がかかりすぎて何かが台無しになった場合に備えて、RespondAsync を使用してみましたが、役に立ちませんでした。RespondAsync と RequestAsync の両方を使用してみましたが、すべてがさらに台無しになりました (おそらく、リクエストで何か間違ったことをしていたのでしょう :))。

何かが欠けているかもしれませんが、ここから何を試したらよいかわかりません。

編集:何かを台無しにしたことに気づきました。以下のコンテキストを追加するだけでなく、

要求/応答に使用される IBus が作成され、Ninject で注入されます。

class FooModule : NinjectModule
    {
        public override void Load()
        { 
            Bind<IBus>().ToMethod(ctx => RabbitHutch.CreateBus("host=localhost", x => x.Register<IEasyNetQLogger>(_ => logger))).InSingletonScope();
        }
    }

そして、それはすべて、Topshelf と Ninject を使用して構築されているサービスによって次のように結び付けられています。

static void Main(string[] args)
        {
            HostFactory.Run(x =>
            {
                x.UseNinject(new FooModule());
                x.Service<FooService>(s =>
                {
                    s.ConstructUsingNinject();
                    s.WhenStarted((service, control) => service.Start(control));
                    s.WhenStopped((service, control) => service.Stop(control));
                });
                x.RunAsLocalSystem();
            });
        }

Topshelf のセットアップはすべてかなり徹底的にテストされており、意図したとおりに機能し、要求/応答の問題には実際には関係ありませんが、もう少しコンテキストを提供すると思いました.

4

1 に答える 1

0

私はこれと同じ問題を抱えていました。私の問題は、リクエスト側ではなく応答でのみタイムアウトを設定したことでした.両方でタイムアウトを設定した後、たとえば. host=hostname;timeout=120;virtualHost=myhost;username=myusername;passw ord=mypassword

于 2015-07-05T08:20:08.817 に答える