EasyNetQ Подписаться не работает с TopShelf - PullRequest
0 голосов
/ 27 февраля 2019

Я новичок в этой комбинации RabbitMQ, EasyNetQ, TopShelf.На данный момент я не использую DI.

Я пытаюсь подписать очередь, используя EasyNetQ.Подписаться работает с этим консольным приложением, код

class Program
{
    static void Main(string[] args)
    {
        using (var bus = RabbitHutch.CreateBus("host=localhost"))
        {
            bus.Subscribe<Entity>("entity", Handler);
            Console.ReadLine();

        }
    }

    private static void Handler(Entity obj)
    {
        Console.WriteLine($"{obj.ID}, {obj.Name}");
    }
}

С TopShelf он не затрагивает метод Handler.TopShelf или EasyNetQ

class Program
{
    static void Main(string[] args)
    {
        HostFactory.Run(config =>
        {
            config.Service<TestEasyNet>(service =>
            {
                service.ConstructUsing(s => new TestEasyNet());
                service.WhenStarted(s => s.Start());
                service.WhenStopped(s => s.Stop());
            });

            config.SetServiceName("TestSubscribe");
            config.SetDisplayName("Test Subscribe");
            config.SetDescription("Test Subscribe");
        });
    }
}

class TestEasyNet
{
    public void Start()
    {
        using (var bus = EasyNetQ.RabbitHutch.CreateBus("host=localhost"))
        {
            bus.Subscribe<Entity>("entity", Handler);
        }
    }

    private void Handler(Entity obj)
    {
        Console.WriteLine("Subscribing");
        Console.WriteLine($"{obj.ID}, {obj.Name}");
    }

    public void Stop()
    { }
}

не сообщают об ошибке, сообщающей код публикации

class Program
{
    static void Main(string[] args)
    {
        HostFactory.Run(c =>
        {
            c.Service<Hosting>(service =>
            {
                service.ConstructUsing(s => new Hosting());
                service.WhenStarted(s => s.Start());
                service.WhenStopped(s => s.Stop());
            });
            c.SetServiceName("TempService");
            c.SetDisplayName("Temp Service");
            c.SetDescription("Temp Service");
        });
    }
}

public class Hosting
{
    public void Start()
    {
        var entity = new Entity()
        {
            ID = 1,
            Name = "Entity 1"
        };

        var entity2 = new Entity()
        {
            ID = 2,
            Name = "Entity 2"
        };

        var entity3 = new Entity()
        {
            ID = 3,
            Name = "Entity 3"
        };

        using (var bus = RabbitHutch.CreateBus("host=localhost"))
        {
            bus.Publish<Entity>(entity);
            bus.Publish<Entity>(entity2);
            bus.Publish<Entity>(entity3);
        }
    }

    public void Stop()
    {             
    }
}

Я не могу понять, где я ошибаюсь!

1 Ответ

0 голосов
/ 28 февраля 2019

Здесь:

using (var bus = EasyNetQ.RabbitHutch.CreateBus("host=localhost"))
{
    bus.Subscribe<Entity>("entity", Handler);
}

код удаляет соединение с EasyNetQ сразу после подписки - что приведет к отключению и прекращению подписки снова.Согласно документации EasyNetQ :

Стандартной практикой является создание одного экземпляра IBus на весь срок службы вашего приложения.Утилизируйте его, когда ваше приложение закрывается.

В этом случае вы, вероятно, захотите связать жизненный цикл шины EasyNetQ с сервисом, который запускается или останавливается через TopShelf.Итак:

private IBus bus;

public void Start()
{
    bus = EasyNetQ.RabbitHutch.CreateBus("host=localhost"));
    bus.Subscribe<Entity>("entity", Handler);
}

public void Stop()
{
    bus?.Dispose();
    bus = null;
}
...