Конечные точки NServiceBus только для отправки, не генерирующие сердцебиения

Я использую NServiceBus.Core v6.4.3 а также NServiceBus.Heartbeat v2.0.0

У меня есть консольное приложение, работающее как запланированная задача, оно извлекает данные и отправляет команды конечной точке для обработки.

Консольное приложение настроено как конечная точка SendOnly.

Мой код выглядит следующим образом:

Главный

// Local NServiceBus Configuration
var endpointConfiguration = EndpointConfiguration();
// Global NServiceBus & Ninject configuration
var conventions = new NServiceBusConventions();
conventions.Customize(endpointConfiguration);
// Create and start endpoint
var endpointInstance = await Endpoint.Start(endpointConfiguration).ConfigureAwait(false);

EndpointConfiguration

private static EndpointConfiguration EndpointConfiguration()
{
    var configuration = new EndpointConfiguration("EndpointName");

    // To ensure OctopusDeploy doesn't cause ServicePulse to think multiple services have been deployed
    // http://docs.particular.net/nservicebus/hosting/override-hostid
    configuration.UniquelyIdentifyRunningInstance()
        .UsingNames("EndpointName", Environment.MachineName);

    configuration.SendOnly();

    return configuration;         
}

Условные обозначения

public class NServiceBusConventions
{
    public IKernel Kernel;

    public void Customize(EndpointConfiguration configuration)
    {
        // Custom Logging Factory implementation
        LogManager.UseFactory(new NServiceBusTraceLoggerFactory());

        Kernel = NinjectCommon.Start();

        configuration.UseContainer<NinjectBuilder>(b => b.ExistingKernel(Kernel));
        configuration.UsePersistence<NHibernatePersistence>();
        configuration.UseSerialization<JsonSerializer>();
        configuration.UseTransport<MsmqTransport>();
        var transport = configuration.UseTransport<MsmqTransport>();
        // Enabled by default in MsmqTransport, but to ensure we have it
        transport.Transactions(TransportTransactionMode.TransactionScope);

        configuration.DefineCriticalErrorAction(NServiceBusOnCriticalError.OnCriticalError);    

        configuration.EnableInstallers();
        configuration.Conventions()
            .DefiningCommandsAs(t => t.Namespace != null && t.Namespace.Equals("Contracts.Commands"))
            .DefiningEventsAs(t => t.Namespace != null && t.Namespace.Equals("Contracts.Interfaces.Events"));

        configuration.AuditProcessedMessagesTo(ConfigurationManager.AppSettings["Messaging.NServiceBus.QueueNames.AuditQueue"]);
        configuration.SendFailedMessagesTo(ConfigurationManager.AppSettings["Messaging.NServiceBus.QueueNames.ErrorQueue"]);
        configuration.SendHeartbeatTo(ConfigurationManager.AppSettings["Messaging.NServiceBus.QueueNames.ServiceControlQueue"]);

        var scanner = configuration.AssemblyScanner();

        var excludeRegexs = new List<string>
        {
            @"DevExpress.*\.dll"
        };

        var baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
        foreach (var fileName in Directory.EnumerateFiles(baseDirectory, "*.dll").Select(Path.GetFileName))
        {
            foreach (var pattern in excludeRegexs)
            {
                if (Regex.IsMatch(fileName, pattern, RegexOptions.IgnoreCase))
                {
                    scanner.ExcludeAssemblies(fileName);
                    break;
                }
            }
        }
    }
}

Удаление configuration.SendOnly(); линия в EndpointConfiguration заставляет конечную точку появляться в ServicePulse, но это не выглядит иначе.

Я знал, что это было проблемой в предыдущих версиях, но я думал, что это было исправлено в NServiceBus V5,

Мне не нужно настраивать конечную точку как Send-Only, но я просто для полноты.

0 ответов

Причина отсутствия сердцебиения была:

У меня есть консольное приложение, работающее как запланированная задача, оно извлекает данные и отправляет команды в конечную точку для обработки.

Каждый раз процесс запускался заново, и время, затрачиваемое на извлечение данных, обработку и отправку команд, было слишком коротким, чтобы NServiceBus мог получить отправленные контрольные сообщения.

Помещение await Task.Delay(10000) в конце приложения было достаточно, чтобы позволить NServiceBus завершить необходимую загрузку и не повлиять на наше SLA.

Спасибо Шону Фармару за помощь в диагностике

Другие вопросы по тегам