NServiceBus MSMQ,如何停止向错误队列传输消息
我正在使用NServiceBus进行概念验证。我将它与MSMQ一起使用。我有一个发送消息的Web应用程序。此消息将由订阅服务器或消息处理程序处理。当我关闭消息处理程序时,经过几次重试后,消息将被发送到错误队列 我不想将其发送到错误队列,我想将消息保留在输入队列中,只要处理程序再次联机,并从输入队列自动处理该消息。若由于任何错误而无法从处理程序处理消息,它必须将消息传输到错误队列 这是我在MVC应用程序Global.asax中的配置NServiceBus MSMQ,如何停止向错误队列传输消息,nservicebus,msmq,Nservicebus,Msmq,我正在使用NServiceBus进行概念验证。我将它与MSMQ一起使用。我有一个发送消息的Web应用程序。此消息将由订阅服务器或消息处理程序处理。当我关闭消息处理程序时,经过几次重试后,消息将被发送到错误队列 我不想将其发送到错误队列,我想将消息保留在输入队列中,只要处理程序再次联机,并从输入队列自动处理该消息。若由于任何错误而无法从处理程序处理消息,它必须将消息传输到错误队列 这是我在MVC应用程序Global.asax中的配置 private void ConfigureServiceBus
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));
}
private void ConfigureServiceBus()
{
var endpointConfiguration=newendpointconfiguration(“Samples.Mvc.Endpoint”);
endpointConfiguration.UseSerialization();
endpointConfiguration.UsePersistence();
endpointConfiguration.UseTransport();
endpointConfiguration.SendFailedMessageTo(“错误”);
endpointConfiguration.AuditProcessedMessageTo(“审核”);
var recoverability=endpointConfiguration.recoverability();
可恢复性。延迟(
延迟=>
{
延迟。重试次数(2);
延迟。时间增加(时间跨度从秒(2)开始);
});
endpointConfiguration.EnableInstallers();
endpoint=endpoint.Start(endpointConfiguration.GetAwaiter().GetResult();
//var endpointInstance=Endpoint.Start(endpointConfiguration).ConfigureAwait(false);
var mvcContainerBuilder=new ContainerBuilder();
mvcContainerBuilder.RegisterInstance(端点);
//注册MVC控制器。
mvcContainerBuilder.RegisterController(类型化(MVCAPApplication.Assembly));
var mvcContainer=mvcContainerBuilder.Build();
SetResolver(新的AutofacDependencyResolver(mvcContainer));
}
这是控制器中向端点发送消息的部分
[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();
}
[HttpPost]
公共异步任务联系人(ContactModel c)
{
if(ModelState.IsValid)
{
尝试
{
var message=新联系人消息()
{
注释,
电子邮件,
FirstName=c.FirstName,
LastName=c.LastName,
transactionId=Guid.NewGuid()
};
wait endpoint.Send(“Samples.Mvc.endpoint”,message).configurewait(false);
返回视图(“成功”);
}
捕获(例外情况除外)
{
返回视图(“错误”);
}
}
返回视图();
}
我的目标是,只要消息处理程序未恢复工作,就将未处理的消息保留在输入队列中。当前,若消息处理程序关闭,它将在重试后将消息发送到错误队列
我正在使用NServiceBus 6.x
提前感谢这正是应该发生的事情。您能否同时提供“处理程序”端的代码和配置?如果您通过电子邮件向特定的.net提供支持,我很乐意与您联系并帮助您进行POC,请将电子邮件发送给Sean FarmarI,他认为您可以使用重试机制。我也经历过这个问题。如果传输是MSMQ,我们总是使用QueueExplorer在不同的批中重播消息。