0

I'm new to using the isolated worker model in .NET8. I'm trying to create a new function that will execute daily at a specific time. I've spent several days looking at the documentation on how to use the isolated worker for a timer function but seem to be getting lost in the weeds. I tried the MS Learn example, but that is a http trigger. not sure how to set up the application for a timer trigger. Any help in where I might find a solution would be appreciated.

This is what I tried however when I run it locally it produces an URL that must be used in a browser to execute:

using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Azure.Functions.Worker;
using Microsoft.DurableTask;
using Microsoft.DurableTask.Client;
using Microsoft.Extensions.Logging;

static class ProcessCustomers
{
[Function(nameof(ProcessCustomerEmailAccounts))]
public static async Task<string> ProcessCustomerEmailAccounts([OrchestrationTrigger] TaskOrchestrationContext context)
{
        // Calculate the next occurrence of 11:30 PM today
DateTime now = context.CurrentUtcDateTime;
DateTime nextScheduledTime = new DateTime(now.Year, now.Month, now.Day, 23, 30, 0);

if (now > nextScheduledTime)
{
    // If it's already past 11:30 PM today, schedule for tomorrow
    nextScheduledTime = nextScheduledTime.AddDays(1);
}

// Set the timer for the next occurrence
await context.CreateTimer(nextScheduledTime, CancellationToken.None);

    string result = "";
    result += await context.CallActivityAsync<string>(nameof(SayHello), "Tokyo") + " ";
    result += await context.CallActivityAsync<string>(nameof(SayHello), "London") + " ";
    result += await context.CallActivityAsync<string>(nameof(SayHello), "Seattle");
    return result;
}

[Function(nameof(SayHello))]
public static async Task<string> SayHello([ActivityTrigger] string cityName, FunctionContext executionContext)
{
    ILogger logger = executionContext.GetLogger(nameof(SayHello));
    logger.LogInformation("Saying hello to {name}", cityName);
    return await Task.FromResult($"Hello, {cityName}!");
}

[Function(nameof(StartProcessCustomerEmailAccounts))]
public static async Task<HttpResponseData> StartProcessCustomerEmailAccounts(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req,
    [DurableClient] DurableTaskClient client,
    FunctionContext executionContext)
{
    ILogger logger = executionContext.GetLogger(nameof(StartProcessCustomerEmailAccounts));

    string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(nameof(ProcessCustomerEmailAccounts));
    logger.LogInformation("Created new orchestration with instance ID = {instanceId}", instanceId);

    return await client.CreateCheckStatusResponseAsync(req, instanceId);
}

}

1
  • I finally figured it out: Commented Jun 5, 2024 at 17:32

1 Answer 1

0

I figured it out You need to change the trigger type in the Start Process remove the returns expected for an HTTP trigger:

{
    [Function(nameof(ProcessCustomerEmailAccounts))]
    public static async Task ProcessCustomerEmailAccounts([OrchestrationTrigger] TaskOrchestrationContext context)
    {
        var result = string.Empty;
        result += await context.CallActivityAsync<string>(nameof(SayHello), "Tokyo") + " ";
        result += await context.CallActivityAsync<string>(nameof(SayHello), "London") + " ";
        result += await context.CallActivityAsync<string>(nameof(SayHello), "Seattle");
        return;
    }

    [Function(nameof(SayHello))]
    public static async Task<string> SayHello([ActivityTrigger] string cityName, FunctionContext executionContext)
    {
        ILogger logger = executionContext.GetLogger(nameof(SayHello));
        logger.LogInformation("Saying hello to {name}", cityName);
        return await Task.FromResult($"Hello, {cityName}!");
    }

    [Function(nameof(StartProcessCustomerEmailAccounts))]
    public static async Task StartProcessCustomerEmailAccounts(
        [TimerTrigger("0 30 13 * * *")] TimerInfo timerInfo,
        [DurableClient] DurableTaskClient client,
        FunctionContext executionContext)
    {
        ILogger logger = executionContext.GetLogger(nameof(StartProcessCustomerEmailAccounts));

        string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(nameof(ProcessCustomerEmailAccounts));
        logger.LogInformation("Created new orchestration with instance ID = {instanceId}", instanceId);

        return;
    }

}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.