Ребус - как зарегистрировать экземпляр обработчика - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь использовать Rebus в C# как альтернативу Java s org.greenrobot.eventbus.EventBus. Не могу понять, как динамически зарегистрировать выход обработчика.


Цель:

  • Запуск шины
  • Динамически регистрируйте значения обработчиков во время выполнения (например, добавляйте новые, когда пользователь нажимает кнопку)
  • Получение некоторых сообщений этими обработчиками
  • Остановка шины

Текущий код: (NUnit) Он выводит только некоторые диагностические c выходные данные самого Rebus, но не сообщения.

using System;
using System.Threading.Tasks;
using Rebus.Config;
using Rebus.Transport.InMem;
using NUnit.Framework;
using Rebus.Activation;
using Rebus.Handlers;

[TestFixture]
public class RebusTests
{
    BuiltinHandlerActivator activator = new BuiltinHandlerActivator();
    InMemNetwork network = new InMemNetwork(true);
    private string inputQueueName = "inputQueue";

    [SetUp]
    public void Setup() {
        Configure.With(activator)
            .Transport(t => t.UseInMemoryTransport(network, inputQueueName))
            .Start();
    }

    [TearDown]
    public void Cleanup() {
        activator.Dispose();
    }

    [Test]
    public void TestHandlingStrings() {
        var h1 = new StringHandler("handler 1");
        var h2 = new StringHandler("handler 2");

        int workersCount = activator.Bus.Advanced.Workers.Count;
        activator.Bus.Advanced.Workers.SetNumberOfWorkers(0);
        activator.Register(() => h1);
        activator.Register(() => h2);
        activator.Bus.Advanced.Workers.SetNumberOfWorkers(workersCount);

        activator.Bus.Advanced.SyncBus.SendLocal("Good day, sir.");
    }
}

public class StringHandler : IHandleMessages<string> {
    public readonly string handlerName;

    public StringHandler(string handlerName) {
        this.handlerName = handlerName;
    }

    public Task Handle(string message) {
        Console.WriteLine($"1) Handler [{handlerName}] got: {message}");
        return Task.Run(() => { Console.WriteLine($"2) Handler [{handlerName}] got: {message}"); });
    }
}

1 Ответ

1 голос
/ 29 января 2020

Код

[Test]
public void TestHandlingStrings() {
    var h1 = new StringHandler("handler 1");
    var h2 = new StringHandler("handler 2");

    int workersCount = activator.Bus.Advanced.Workers.Count;
    activator.Bus.Advanced.Workers.SetNumberOfWorkers(0);
    activator.Register(() => h1);
    activator.Register(() => h2);
    activator.Bus.Advanced.Workers.SetNumberOfWorkers(workersCount);

    activator.Bus.Advanced.SyncBus.SendLocal("Good day, sir.");
}

выйдет почти сразу, поэтому, скорее всего, автобус никогда не получит ничего.

Если вы добавите немного Thread.Sleep(TimeSpan.FromSeconds(2)); в конце тест, держу пари, ваше сообщение будет получено:

[Test]
public void TestHandlingStrings() {
    var h1 = new StringHandler("handler 1");
    var h2 = new StringHandler("handler 2");

    int workersCount = activator.Bus.Advanced.Workers.Count;
    activator.Bus.Advanced.Workers.SetNumberOfWorkers(0);
    activator.Register(() => h1);
    activator.Register(() => h2);
    activator.Bus.Advanced.Workers.SetNumberOfWorkers(workersCount);

    activator.Bus.Advanced.SyncBus.SendLocal("Good day, sir.");

    Thread.Sleep(TimeSpan.FromSeconds(2));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...