Rebus - 如何注册处理程序的实例
Rebus - how to register an instance of a handler
我正在尝试在 C# 中使用 Rebus
作为 Java 的 org.greenrobot.eventbus.EventBus
的替代方法。无法弄清楚如何动态注册处理程序的实例。
目标:
- 启动总线
- 在运行时动态注册处理程序实例(例如,当用户按下按钮时添加新的实例)
- 收到这些处理程序的一些消息
- 停车
当前代码:(NUnit) 它只打印 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}"); });
}
}
代码
[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));
}
我正在尝试在 C# 中使用 Rebus
作为 Java 的 org.greenrobot.eventbus.EventBus
的替代方法。无法弄清楚如何动态注册处理程序的实例。
目标:
- 启动总线
- 在运行时动态注册处理程序实例(例如,当用户按下按钮时添加新的实例)
- 收到这些处理程序的一些消息
- 停车
当前代码:(NUnit) 它只打印 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}"); });
}
}
代码
[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));
}