使用 Azure 服务总线创建队列的 MassTransit 3
MassTransit 3 with Azure Service Bus creating queues
我正在将一个应用程序从使用 MT3 和 RabbitMQ 转换为使用 Azure 服务总线,MassTransit 在 Azure 中配置队列的方式与它在 RMQ 中的配置方式不同,并且文档在光面 (here) 我想看看是否有其他人解决了这个问题
我正在为 TokenProvider 使用 MT 3.4 和 Microsoft.ServiceBus 3.0,我有一个实用程序 class 创建总线(在这个 example 之后):
public static IBus CreateBus()
{
var busControl = Bus.Factory.CreateUsingAzureServiceBus(sbc =>
{
var host = sbc.Host(new Uri("sb://<sbname>.servicebus.windows.net/"), h =>
{
h.OperationTimeout = TimeSpan.FromSeconds(5);
h.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("<KeyName>", "<Key>");
});
sbc.ReceiveEndpoint(host, "command_queue", ep =>
{
ep.SubscribeMessageTopics = true;
ep.UseRetry(Retry.Incremental(5, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(5)));
});
});
return busControl;
}
我有一个 Web API 控制器,它使用总线将命令发布到队列:
[RoutePrefix("customer")]
public class CustomerController : ApiController
{
private readonly IBus _serviceBus;
public CustomerController()
{
_serviceBus = AzureServiceBusUtils.CreateBus();
}
[HttpPost, Route("register")]
public async Task<HttpResponseMessage> Register()
{
var command = JsonConvert.DeserializeObject<RegisterNewCustomerCommand>(Encoding.ASCII.GetString(Request.Content.ReadAsByteArrayAsync().Result));
await _serviceBus.Publish(command);
return Request.CreateResponse(HttpStatusCode.OK);
}
}
RegisterNewCustomerCommand 只是一个简单的名称、地址等。C# class:
namespace AZSB.Commands
{
public class RegisterNewCustomerCommand
{
public string Name { get; }
...
public RegisterNewCustomerCommand(...) {...}
}
}
现在,当我发送一条消息时,会在 Azure (AZSB.Commands/RegisterNewCustomerCommand) 上创建一个主题,但这并没有像我期望的那样链接到 command_queue,并添加到它,当我在 Azure 门户中单击主题时,详细信息面板只是挂起(因此我无法手动将其配置为手动创建的队列)
我错过了什么吗?
阿拉斯泰尔
您需要在接收端点中为该类型添加消息使用者。上面的代码没有消费者,所以没有类型绑定。
class YourConsumer :
IConsumer<RegisterNewCustomerCommand>
{}
cfg.ReceiveEndpoint("your_queue", x =>
{
x.Consumer<YourConsumer>();
});
然后您将拥有一个接受该消息类型的消费者,这将导致 MassTransit 将主题绑定到队列。
我正在将一个应用程序从使用 MT3 和 RabbitMQ 转换为使用 Azure 服务总线,MassTransit 在 Azure 中配置队列的方式与它在 RMQ 中的配置方式不同,并且文档在光面 (here) 我想看看是否有其他人解决了这个问题
我正在为 TokenProvider 使用 MT 3.4 和 Microsoft.ServiceBus 3.0,我有一个实用程序 class 创建总线(在这个 example 之后):
public static IBus CreateBus()
{
var busControl = Bus.Factory.CreateUsingAzureServiceBus(sbc =>
{
var host = sbc.Host(new Uri("sb://<sbname>.servicebus.windows.net/"), h =>
{
h.OperationTimeout = TimeSpan.FromSeconds(5);
h.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("<KeyName>", "<Key>");
});
sbc.ReceiveEndpoint(host, "command_queue", ep =>
{
ep.SubscribeMessageTopics = true;
ep.UseRetry(Retry.Incremental(5, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(5)));
});
});
return busControl;
}
我有一个 Web API 控制器,它使用总线将命令发布到队列:
[RoutePrefix("customer")]
public class CustomerController : ApiController
{
private readonly IBus _serviceBus;
public CustomerController()
{
_serviceBus = AzureServiceBusUtils.CreateBus();
}
[HttpPost, Route("register")]
public async Task<HttpResponseMessage> Register()
{
var command = JsonConvert.DeserializeObject<RegisterNewCustomerCommand>(Encoding.ASCII.GetString(Request.Content.ReadAsByteArrayAsync().Result));
await _serviceBus.Publish(command);
return Request.CreateResponse(HttpStatusCode.OK);
}
}
RegisterNewCustomerCommand 只是一个简单的名称、地址等。C# class:
namespace AZSB.Commands
{
public class RegisterNewCustomerCommand
{
public string Name { get; }
...
public RegisterNewCustomerCommand(...) {...}
}
}
现在,当我发送一条消息时,会在 Azure (AZSB.Commands/RegisterNewCustomerCommand) 上创建一个主题,但这并没有像我期望的那样链接到 command_queue,并添加到它,当我在 Azure 门户中单击主题时,详细信息面板只是挂起(因此我无法手动将其配置为手动创建的队列)
我错过了什么吗? 阿拉斯泰尔
您需要在接收端点中为该类型添加消息使用者。上面的代码没有消费者,所以没有类型绑定。
class YourConsumer :
IConsumer<RegisterNewCustomerCommand>
{}
cfg.ReceiveEndpoint("your_queue", x =>
{
x.Consumer<YourConsumer>();
});
然后您将拥有一个接受该消息类型的消费者,这将导致 MassTransit 将主题绑定到队列。