10

MassTransit と RabbitMQ とキューイングについて理解を深めようとしています (1 日目)

私が持っている質問は、「MT でキューイングが機能するためにコンシューマーが必要かどうかです。私が尋ねる理由は、最初にドメインとプロデューサーを作成しましたが、RabbitMQ 管理ウィンドウにキューに入れられたアイテムが表示されなかったからです。」

コンシューマ キューが作成されると、メッセージがキューに入れられていることがわかります。

私の理解では、Producer は Consumer を認識していないのに、MassTransit がメッセージの発行を開始するために Consumer キューを必要としたのはなぜですか?

プロデューサー

using MassTransit;

namespace Producer
{
    class Program
    {
        static void Main(string[] args)
        {
            Bus.Initialize(sbc =>
            {
                sbc.UseRabbitMq();         //1
                sbc.UseControlBus();
                sbc.EnableMessageTracing();
                sbc.EnableRemoteIntrospection();
                sbc.ReceiveFrom("rabbitmq://localhost/MT.Producer");
                sbc.UseControlBus();
            });

            Bus.Instance.Publish(new NewOrderMessage { OrderName = "Hello World" });
        }
    }
}

アプリケーション

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MassTransit;
using Topshelf;

namespace Consumer
{
    class Program
    {
        static void Main(string[] args)
        {
            Bus.Initialize(sbc =>
            {
                sbc.UseRabbitMq();
                sbc.UseRabbitMqRouting();
                sbc.ReceiveFrom("rabbitmq://localhost/MT.ConsumerService");
            });

            var cfg = HostFactory.New(c =>
            {
                c.SetServiceName("MT.ConsumerService");
                c.SetDisplayName("MT.ConsumerService");
                c.SetDescription("MT.ConsumerService");

                //c.BeforeStartingServices(s => {});

                c.Service<ConsumerService>(a =>
                {
                    a.ConstructUsing(service => new ConsumerService());
                    a.WhenStarted(o => o.Start());
                    a.WhenStopped(o => o.Stop());
                });

            });

            try
            {
                cfg.Run();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw;
            }
        }
    }
}

メッセージ

namespace Domain
{
    public class NewOrderMessage
    {
        public NewOrderMessage()
        {
            OrderId = Guid.NewGuid();
        }
        public Guid OrderId { get; set; }
        public string OrderName { get; set; }
    }
}

消費者サービス

namespace Consumer
{
    class ConsumerService
    {
        readonly IServiceBus _bus;

        public ConsumerService()
        {
            _bus = Bus.Instance;
        }

        public void Start()
        {
            _bus.SubscribeHandler<NewOrderMessage>(CreateOrder);

            Console.WriteLine("Starting....");
        }

        public void Stop()
        {    
            Console.WriteLine("Stopping....");
        }

        public void CreateOrder(NewOrderMessage command)
        {
            Console.WriteLine("Creating Order: {0}  with Id: {1}", command.OrderName, command.OrderId);
        }
    }
}

コードは Web 上の例を使用して作成されました。

編集また、すべての名前空間が異なるプロジェクトであることを追加したい ドメイン プロデューサー コンシューマー

よろしく、

3月

4

1 に答える 1

8

masstransit-discus に関する次の回答は本当に役に立ちました。

Google グループから masstransit-discuss

... MassTransit の問題点は、実際にキューに発行するのではなく、交換に発行し、その交換でメッセージを購読している他のキューにそのメッセージを渡すように設定することです。コンシューマーがいないため、誰もあなたのメッセージに関心を示していないため、単に無視されます。

したがって、コンシューマーをセットアップして、「rabbitmq://localhost/B」をリッスンするだけです。初めて実行すると、必要な交換とそれらの間のリンクが作成され、メッセージは B という名前のキューに渡されます。

アンダース

バスは、すべての交換、キュー、およびサービスの集合体です。バスで発行すると、そのバスに登録されているすべてのコンシューマーがそれを受け取ります。

Exchange は、これを機能させるための RabbitMQ 実装です。

トラヴィス

于 2013-03-18T22:20:48.873 に答える