1

私のインフラストラクチャ:

  • メイン - ServiceStack の自己ホスト型コンソール アプリ。「メイン」はメッセージを MQ に送信します。
  • 背景 - ServiceStack セルフ ホスト コンソール アプリ。「バックグラウンド」は MQ からメッセージを受け取ります。
  • ローカルにインストールされた Redis

「メイン」AppHost で、Redis マネージャーを構成します。

container.Register<IRedisClientsManager>(
    new PooledRedisClientManager("localhost:6379"));

次に、サービスのどこかでこのコードを実行します。

using (var client = new RedisMessageQueueClient(TryResolve<IRedisClientsManager>()))
{
    client.Publish(new TestMessage { Value = "From ping" });
}

すべてがうまく機能し、「背景」でメッセージを受け取ることができます。しかし、このコードをクラスにラップすると問題が発生します。

public class MessageQueuePublisher : IMessageQueuePublisher
{
    public void Publish(object message)
    {
        using (var client = new RedisMessageQueueClient(
            EndpointHost.AppHost.TryResolve<IRedisClientsManager>()))
        {
            client.Publish(message);
        }
    }
} 

前のコードが実行されたのとまったく同じ場所から MessageQueuePublisher.Publish メソッドを呼び出すと、正しく動作しているように見えますが (例外はスローされません)、メッセージは「バックグラウンド」に到達しません。

これでよろしいですか?

4

1 に答える 1

2

解決策を見つけました。私の「バックグラウンド」では、タイプ TestMessage のメッセージを期待しています

mqService.RegisterHandler<TestMessage>(ServiceController.ExecuteMessage);

しかし、MessageQueuePublisher.Publishを使用すると、メッセージはオブジェクト型であり、 オブジェクトキューに送られ、処理されませんでした。

したがって、この問題を解決するには、Publish メソッドを汎用にする必要があります。

public void Publish<T>(T message)

メソッドの呼び出し方法は変わりませんが、コードを見ると、ジェネリックが使用されている理由が明確ではないため、コードはあまり良くありません。しかし、少なくともそれは機能します。

于 2013-08-29T18:47:43.653 に答える