我使用的是NSB版本6.2和RabbitMQ版本4。 我正在使用RabbitMQTransport。我的RabbitMQ服务器位于Azure中的虚拟机中。当我发送消息时,有时我会丢失消息而没有任何错误。
这是我的NService总线配置。
EndpointConfiguration config = null;
string endpointName = ConfigurationManager.AppSettings.Get("NServiceBus.EndpointName");
config = configEndPoint.IsNullOrDefault() ? new EndpointConfiguration(endpointName) : configEndPoint;
int maximumConcurrencyLevel = ConfigurationManager.AppSettings.Get("NServiceBus.TransportConfig.MaximumConcurrencyLevel").ToInt();
config.LimitMessageProcessingConcurrencyTo(maximumConcurrencyLevel);
int numberOfRetries = ConfigurationManager.AppSettings.Get("NServiceBus.TransportConfig.NumberOfRetries").ToInt();
var recoverability = config.Recoverability();
recoverability.Immediate(
customizations: immediate =>
{
immediate.NumberOfRetries(numberOfRetries);
});
DefaultFactory defaultFactory = LogManager.Use<DefaultFactory>();
defaultFactory.Directory(this.DatabusDirectory);
defaultFactory.Level(LogLevel.Error);
config.IdealinkJsonSerializer();
config.UsePersistence<InMemoryPersistence>();
config.SendFailedMessagesTo("error");
config.AuditProcessedMessagesTo("audit");
// configure transport
config.UseTransport<RabbitMQTransport>().Transactions(TransportTransactionMode.ReceiveOnly);
var endpointInstance = Endpoint.Start(endpointConfiguration).GetAwaiter().GetResult();
答案 0 :(得分:4)
使用exception of persistence配置端点看起来很好。
持久性用于本机不支持底层传输的功能。对于RabbitMQ,没有本机机制来发送延迟消息。直到版本4.3持久性用于存储超时。如果使用InMemoryPersistence
,则在端点重新启动后不会保留任何信息。 Recoverability feature, specifically delayed retries需要超时。 From version 4.3 and above,超时不需要持久性,但仍然不应使用InMemoryPersistence
。您可以根据手头的技术和方案选择other persistences。
请注意,版本4.0.0不在supported versions下。您应该更新到4.3.x或4.4.x并验证行为以查看是否发现了邮件丢失。如果您仍然丢失消息,我建议提供更多详细信息,例如日志文件和处理程序代码。如果您无法公开分享,submit a support case。
希望有所帮助。