Events Rebus-订阅ASP.NET Core中的事件

Events Rebus-订阅ASP.NET Core中的事件,events,.net-core,rebus,Events,.net Core,Rebus,我有两个应用程序在ASP.NET MVC Core中使用REBS 我可以使用Bus.send(…)在两个应用程序之间发送消息。我所不能做的是在创建后发布CustomerCreated这样的事件,以便其他应用程序可以执行操作 我已经按如下方式配置了应用程序 public void ConfigureServices(IServiceCollection services) { services.AutoRegisterHandlersFromAssemblyOf<Handl

我有两个应用程序在ASP.NET MVC Core中使用REBS 我可以使用Bus.send(…)在两个应用程序之间发送消息。我所不能做的是在创建后发布CustomerCreated这样的事件,以便其他应用程序可以执行操作

我已经按如下方式配置了应用程序

public void ConfigureServices(IServiceCollection services)
{    
     services.AutoRegisterHandlersFromAssemblyOf<Handler1>();
     services.AddRebus(configure => configure
            .Logging(l => l.Use(new MSLoggerFactoryAdapter(_loggerFactory)))
            .Transport(t=>t.UseRabbitMq("amqp://guest:guest@localhost:5672", "rebus_rabbit_first"))
                    .Sagas(x => x.StoreInSqlServer("Data Source=.;Initial Catalog=RebusDBRabbit;User ID=student;Password=student;", "Sagas", "SagaIndex"))
                    .Options(o =>
                    {
                        o.SetNumberOfWorkers(10);
                        o.SetMaxParallelism(20);
                        o.HandleMessagesInsideTransactionScope();
                        o.SimpleRetryStrategy(errorQueueAddress: "somewhere_else", maxDeliveryAttempts: 10, secondLevelRetriesEnabled: true);

                     })

                    .Routing(r => r.TypeBased()
                    .MapAssemblyOf<CreateStudent>("rebus_rabbit_second")));


            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }
CreateStudent student = new CreateStudent { StudentID="90008", StudentName="Amour Rashid Hamad",DateOfBirth=DateTime.Parse("1974-03-18") };
_bus.Send(student).Wait();
这没关系。 现在我的问题是发布一个事件,向其他相关方广播该事件

 _bus.Publish(new StudentCreated { StudentID="90008",Remarks="Hurray We have been Successfully"});

如何根据我的配置订阅事件。我看过一些样品,但我不能理解它们。最好添加到我的实现中。

看起来您正在使用
等待总线。正确发送(…)

正如您可能已经了解的,
Send
查找目标队列并发送到该队列(并且仅发送到该队列),然后从端点映射(您当前正在将所有消息类型映射到名为
rebus\u second
的队列)进行查找

当您想
等待bus.Publish(…)
时,需要有人相应地
等待bus.Subscribe()
。在封面下,Rebus将使用.NET类型作为主题,因此如果

wait bus.Subscribe();
在一个应用程序中,以及

wait bus.Publish(new SomeEvent());
在另一种情况下,您的订户将接收事件

TL;DR:您需要

wait bus.Subscribe();
在希望接收类型为
StudentCreated
的已发布事件的应用程序中


顺便说一句,您应该使用C对调用异步方法的支持

等待巴士。发送(你的信息);
或者调用Rebus的同步API来完成您的工作:

var-syncBus=bus.Advances.syncBus;
syncBus.Send(yourMessage);//<返回无效

Rebus的同步方法不会使线程死锁,例如,如果您是从ASP.NET或WCF调用它们。

在服务配置中,我执行了以下操作:

app.ApplicationServices.UseRebus(async bus => {
  await bus.Subscribe<StudentCreated>();
            });
app.ApplicationServices.UseRebus(异步总线=>{
等待公共汽车。订阅();
});
然后创建了一个处理程序

public class StudentCreatedEventHandler : IHandleMessages<StudentCreated>, IHandleMessages<IFailed<StudentCreated>>
    {
        readonly IBus _bus;

        public StudentCreatedEventHandler(IBus bus)
        {
            _bus = bus;
        }

        public async Task Handle(StudentCreated student)
        {
            // do stuff that can fail here...
            var remarks = $"Remarks on RebusWithRabbit1 : {student.Remarks}";

        }

        public async Task Handle(IFailed<StudentCreated> failedMessage)
        {
            await _bus.Advanced.TransportMessage.Defer(TimeSpan.FromSeconds(30));
        }
}
public class StudentCreatedEventHandler:IHandleMessages,IHandleMessages
{
只读IBus总线;
公立学生创建Deventhandler(IBus总线)
{
_总线=总线;
}
公共异步任务句柄(StudentCreated student)
{
//做一些可能会失败的事情。。。
var备注=$“关于Rebuswitrabbit1的备注:{student.备注}”;
}
公共异步任务句柄(IFailed failedMessage)
{
wait_bus.Advanced.TransportMessage.Defer(TimeSpan.FromSeconds(30));
}
}
这可以处理已发布的事件。 我只是想确定这是否是正确的做法

然而,我注意到一件事。如果有多个端点订阅事件,则只通知一个端点。我预计可能需要通知多个端点,并且每个端点可能会从同一事件执行不同的进程

有没有办法改变这种行为。我记得在MassTransit中,这是默认的行为。
谢谢

当您将主题分包到事件时,您将主题绑定到订阅者的输入队列。如果您有两个不同的订阅者,它们应该具有不同的输入队列名称,然后它们将各自获得事件的副本。