If the trigger function must be customized, disable generation of the trigger function by removing the NServiceBusTriggerFunction
attribute. A custom trigger function can then be added manually to the project:
class CustomTriggerDefinition
{
IFunctionEndpoint functionEndpoint;
public CustomTriggerDefinition(IFunctionEndpoint functionEndpoint)
{
this.functionEndpoint = functionEndpoint;
}
[FunctionName("MyCustomTrigger")]
public async Task Run(
[ServiceBusTrigger("MyFunctionsEndpoint")]
Message message,
ILogger logger,
MessageReceiver messageReceiver,
ExecutionContext executionContext)
{
await functionEndpoint.Process(message, executionContext, messageReceiver, logger);
}
}
Configuring transaction mode
To use the TransportTransactionMode.
mode the auto-complete needs to be disabled and the trigger needs to call ProcessAtomic
.
[FunctionName("ProcessMessageTx")]
public async Task RunTx(
// Setting AutoComplete to false processes the message transactionally
[ServiceBusTrigger("ProcessMessageTx", AutoComplete = false)]
Message message,
ILogger logger,
MessageReceiver messageReceiver,
ExecutionContext executionContext)
{
await endpoint.Process(message, executionContext, messageReceiver, logger);
}
To use the TransportTransactionMode.
mode the auto-complete 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", AutoComplete = true)]
Message message,
ILogger logger,
MessageReceiver messageReceiver,
ExecutionContext executionContext)
{
await endpoint.Process(message, executionContext, messageReceiver, logger);
}
Incorrectly configuring the service bus trigger auto-complete setting can lead to message loss. Use the auto-detection mechanism on the function endpoint interface, or use the trigger function attribute to specify message consistency.