WebJob SDK не работает при запуске в приложении Service Fabric

Я хочу использовать SDK WebJob в службе без сохранения состояния, работающей как приложение Service Fabric. К сожалению, я не могу заставить его работать должным образом. Ниже приведена часть тестового кода, который воспроизводит проблему. "ProcessMethod" никогда не вызывается. Триггерная функция ProcessNotificationsInQueue также никогда не выполняется (да, в очереди есть элементы). "Состояние работоспособности" приложения установлено в "Ошибка" в Service Fabric Explorer, хотя приложение все еще работает.

DashboardConnectionString и StorageConnectionString имеют правильные значения.

Я не вижу проблем с очень похожим кодом, когда он выполняется в консольном приложении или WorkerRole.

Я что-то пропустил? Кто-нибудь уже успешно использовал SDK WebJob в приложении Service Fabric?

public sealed class TestStatelessService : StatelessService
{
    public TestStatelessService(StatelessServiceContext context)
        : base(context)
    { }

    /// <summary>
    /// Optional override to create listeners (e.g., TCP, HTTP) for this service replica to handle client or user requests.
    /// </summary>
    /// <returns>A collection of listeners.</returns>
    protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
    {
        return new ServiceInstanceListener[0];
    }

    /// <summary>
    /// This is the main entry point for your service instance.
    /// </summary>
    /// <param name="cancellationToken">Canceled when Service Fabric needs to shut down this service instance.</param>
    protected override async Task RunAsync(CancellationToken cancellationToken)
    {
        ConfigurationPackage configPackage = this.Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");
        KeyedCollection<string, ConfigurationProperty> parameters = configPackage.Settings.Sections["MyConfigSection"].Parameters;

        JobHostConfiguration config = new JobHostConfiguration();
        config.DashboardConnectionString = parameters["AzureWebJobsDashboard"].Value;
        config.StorageConnectionString = parameters["AzureWebJobsStorage"].Value;
        config.Queues.BatchSize = 10;
        config.Queues.MaxDequeueCount = 8;
        config.Queues.MaxPollingInterval = TimeSpan.FromSeconds(30);
        var host = new JobHost(config);
        host.CallAsync(typeof(TestStatelessService).GetMethod("ProcessMethod"), cancellationToken);
        host.RunAndBlock();
    }

    [NoAutomaticTrigger]
    public async Task ProcessMethod(CancellationToken cancellationToken)
    {
        long iterations = 0;
        while (true)
        {
            cancellationToken.ThrowIfCancellationRequested();

            ServiceEventSource.Current.ServiceMessage(this, "Working-{0}", ++iterations);

            await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
        }
    }

    [Timeout("00:03:00")]
    public static void ProcessNotificationsInQueue([QueueTrigger("newnotificationqueue")] Notification notification)
    {
       //Do something 
    }
}

1 ответ

Решение

host.CallAsync(typeof(TestStatelessService).GetMethod("ProcessMethod"), cancellationToken)

Пожалуйста, обратите внимание, что TestStatelessService В классе не определен конструктор без параметров, поэтому вы можете пометить ProcessMethod функционировать как статический.

Согласно вашему описанию, я следовал этому руководству для создания приложения Azure Service Fabric. На основе вашего кода я успешно протестировал SDK WebJob в моем приложении Service Fabric. Вот мой пример кода, пожалуйста, попробуйте выяснить, работает ли он на вашей стороне.

TestStatelessService.cs

/// <summary>
/// This is the main entry point for your service instance.
/// </summary>
/// <param name="cancellationToken">Canceled when Service Fabric needs to shut down this service instance.</param>
protected override async Task RunAsync(CancellationToken cancellationToken)
{
    ConfigurationPackage configPackage = this.Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");
    KeyedCollection<string, ConfigurationProperty> parameters = configPackage.Settings.Sections["MyConfigSection"].Parameters;

    JobHostConfiguration config = new JobHostConfiguration();
    config.DashboardConnectionString = parameters["AzureWebJobsDashboard"].Value;
    config.StorageConnectionString = parameters["AzureWebJobsStorage"].Value;
    config.Queues.BatchSize = 10;
    config.Queues.MaxDequeueCount = 8;
    config.Queues.MaxPollingInterval = TimeSpan.FromSeconds(30);
    var host = new JobHost(config);
    host.CallAsync(typeof(TestStatelessService).GetMethod("ProcessMethod"),cancellationToken);
    host.RunAndBlock();
}

[NoAutomaticTrigger]
public static async Task ProcessMethod(CancellationToken cancellationToken)
{
    long iterations = 0;
    while (true)
    {
        cancellationToken.ThrowIfCancellationRequested();
        //log
        Trace.TraceInformation(">>[{0}]ProcessMethod Working-{1}",DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"),++iterations);
        //sleep for 5s
        await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken);
    }
}

[Timeout("00:03:00")]
public static void ProcessNotificationsInQueue([QueueTrigger("newnotificationqueue")] CloudQueueMessage notification)
{
    Trace.TraceInformation(">ProcessNotificationsInQueue invoked with notification:{0}", notification.AsString);
}

Результат

"Состояние работоспособности" приложения установлено в "Ошибка" в Service Fabric Explorer, хотя приложение все еще работает.

Пожалуйста, попробуйте отладить код на вашей стороне и найти подробные ошибки.

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