我使用NServiceBus进行概念验证。我正在使用它与MSMQ。我有一个发送消息的Web应用程序。此消息将由订阅者或消息处理程序处理。当我关闭消息处理程序时,消息将在几次重试后发送到Error Queue。
我不想将其发送到错误队列,只要Handler再次联机,我想在输入队列中保留消息,并自动从输入队列处理此消息。如果由于任何错误而无法从处理程序处理消息,则必须将消息传输到错误队列。
这是我在MVC应用程序Global.asax
中的配置private void ConfigureServiceBus()
{
var endpointConfiguration = new EndpointConfiguration("Samples.Mvc.Endpoint");
endpointConfiguration.UseSerialization<JsonSerializer>();
endpointConfiguration.UsePersistence<InMemoryPersistence>();
endpointConfiguration.UseTransport<MsmqTransport>();
endpointConfiguration.SendFailedMessagesTo("error");
endpointConfiguration.AuditProcessedMessagesTo("audit");
var recoverability = endpointConfiguration.Recoverability();
recoverability.Delayed(
delayed =>
{
delayed.NumberOfRetries(2);
delayed.TimeIncrease(TimeSpan.FromSeconds(2));
});
endpointConfiguration.EnableInstallers();
endpoint = Endpoint.Start(endpointConfiguration).GetAwaiter().GetResult();
//var endpointInstance = Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
var mvcContainerBuilder = new ContainerBuilder();
mvcContainerBuilder.RegisterInstance(endpoint);
// Register MVC controllers.
mvcContainerBuilder.RegisterControllers(typeof(MvcApplication).Assembly);
var mvcContainer = mvcContainerBuilder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(mvcContainer));
}
这是Controller中我向终端发送消息的部分。
[HttpPost]
public async Task<ActionResult> Contact(ContactModel c)
{
if (ModelState.IsValid)
{
try
{
var message = new ContactMessage()
{
Comment = c.Comment,
Email = c.Email,
FirstName = c.FirstName,
LastName = c.LastName,
TransectionId = Guid.NewGuid()
};
await endpoint.Send("Samples.Mvc.Endpoint", message).ConfigureAwait(false);
return View("Success");
}
catch (Exception ex)
{
return View("Error");
}
}
return View();
}
我的目标是只要消息处理程序没有恢复工作,就将未处理的消息保留在输入队列中。目前,如果消息处理程序已关闭,它将在重试到错误队列后发送消息。
我正在使用NServiceBus 6.x
提前致谢