AI agents: use the documentation index at llms.txt to locate machine-readable pages. This section is indexed by https://docs.particular.net/nservicebus/llms.txt. The markdown version of this page is served as plain text. An MCP server at /mcp serves the same content via the search_docs and read_doc tools; it is read-only and needs no credentials. Markdown versions of documentation pages are available by appending .md to the page URL. Directory URLs use index.md. They are served as text/plain because some retrieval backends reject text/markdown.

Custom Azure Functions triggers

To configure a custom trigger function, remove the native NServiceBusTriggerFunction attribute. A custom trigger function can then be added manually to the project:

class CustomTriggerDefinition(IFunctionEndpoint functionEndpoint)
{
    [FunctionName("MyCustomTrigger")]
    public Task Run(
        [ServiceBusTrigger("MyFunctionsEndpoint")]
        ServiceBusReceivedMessage message,
        ServiceBusClient client,
        ServiceBusMessageActions messageActions,
        ILogger logger,
        ExecutionContext executionContext)
    {
        return functionEndpoint.ProcessAtomic(message, executionContext, client, messageActions, logger);
    }
}

Configuring transaction mode

To use the TransportTransactionMode.SendsAtomicWithReceive mode, AutoCompleteMessages needs to be disabled and the custom trigger needs to call ProcessAtomic.

[FunctionName("ProcessMessageTx")]
public Task RunTx(
    // Setting AutoComplete to false processes the message transactionally
    [ServiceBusTrigger("ProcessMessageTx", AutoCompleteMessages = false)]
    ServiceBusReceivedMessage message,
    ServiceBusClient client,
    ServiceBusMessageActions messageActions,
    ILogger logger,
    ExecutionContext executionContext)
{
    return endpoint.ProcessAtomic(message, executionContext, client, messageActions, logger);
}

To use the TransportTransactionMode.ReceiveOnly mode, AutoCompleteMessages needs to be enabled and the trigger needs to call ProcessNonAtomic.

[FunctionName("ProcessMessage")]
public async Task Run(
    // Setting AutoComplete to true (the default) processes the message non-transactionally
    [ServiceBusTrigger("ProcessMessage", AutoCompleteMessages = true)]
    ServiceBusReceivedMessage message,
    ILogger logger,
    ExecutionContext executionContext)
{
    await endpoint.ProcessNonAtomic(message, executionContext, logger);
}

Related Articles