具有的主机NServiceBus终结点Azure函数和Azure服务总线触发器。
基本用法
终结点配置
可以使用使用NServiceBus
启动类中的扩展方法:
[程序集:功能启动(类型(启动))][程序集:NServiceBusTriggerFunction(“MyFunctionsEndpoint”)]类启动:函数启动{公共重写void配置(IFunctionsHostBuilder生成器){建设者。使用服务总线();}}
从环境变量中检索其他配置设置。请参阅配置部分了解更多详细信息。也可以通过代码直接配置所有配置设置:
类启动:函数启动{公共重写void配置(IFunctionsHostBuilder生成器){建设者。使用NServiceBus(配置=>{配置。运输。订阅命名约定=(name)=>name。替换(“X”、“Y”);});}}
通过注册的任何服务IFunctionsHostBuilder(功能主机生成器)
将通过依赖项注入提供给消息处理程序。启动类必须通过功能启动
属性:[程序集:函数启动(类型为(启动))]
.
NServiceBus的Azure函数队列触发器
通过使用自定义程序集属性指定逻辑端点名称,自动生成NServiceBus的Azure函数触发器:
[程序集:NServiceBusTriggerFunction(“MyFunctionsEndpoint”)]
该属性将生成NServiceBus所需的触发函数:
无效的端点名称将生成NSBFUNC003型
消息出错终结点名称无效,无法用于生成触发器函数
.
覆盖触发器函数名
默认情况下,触发器函数名是自动生成的。要自定义函数名NServiceBusTriggerFunction服务总线触发器功能
属性可以提供一个附加参数来设置函数名:
[程序集:NServiceBusTriggerFunctionAttribute(端点名称:“MyFunctionsEndpoint”,TriggerFunctionName:“MyTrigger函数”)]
无效的触发器函数名将生成NSBFUNC004标准
消息出错触发器函数名称无效,无法用于生成触发器函数
.
自定义触发器
Azure Service Bus触发器可以手动声明,而不是依赖自动生成的触发器。请参阅上的文章自定义Azure函数触发器了解更多信息。
在消息处理程序外部进行调度
使用HTTP函数触发消息:
公共类HttpSender{只读IFunctionEndpoint函数Endpoint;公共HttpSender(IFunctionEndpoint functionEndpoint){this.functionEndpoint=函数端点;}[FunctionName(“HttpSender”)]公共异步任务<IActionResult>运行([HttpTrigger(AuthorizationLevel.Function,“get”,“post”,Route=null)]HttpRequest请求,ExecutionContext ExecutionContext,ILogger记录器){记录器。LogInformation(“C#HTTP触发器函数收到请求。”);var sendOptions=新的sendOptions();sendOptions(发送选项)。路由到该端点();等待函数Endpoint。发送(new TriggerMessage(),sendOptions,executionContext,logger);return new OkObjectResult($“{nameof(TriggerMessage)}已发送。”);}}
运输配置约束和限制
配置API通过配置。运输
属性以允许自定义。然而,并非所有选项都是适用于在Azure函数中执行.
并发相关设置通过Azure函数进行控制主机。杰森
配置文件。请参见Azure函数中的并发性了解详细信息。
消息一致性
NServiceBus可以在传入和传出消息之间提供事务一致性:
[程序集:NServiceBusTriggerFunction(“MyEndpoint”,SendsAtomicWithReceive=true)]
这相当于发送原子并接收
运输交易模式。默认情况下,事务一致性被禁用,提供与仅接收
运输交易模式。
有关使用自定义触发器配置消息一致性的更多信息,请参阅自定义Azure函数触发器文档。
微软。Azure公司。网络作业。延期。ServiceBus版本5需要启用跨实体事务
启用,以便支持使用接收发送原子。
这可以通过将以下内容添加到主持人。杰森
:
“扩展”:{“服务总线”:{“EnableCrossEntityTransactions”:true}}
配置
服务总线触发的端点配置
按以下顺序从Azure Function主机环境加载某些配置值:
ServiceBus连接
使用时NServiceBusTriggerAttribute服务总线触发属性
,可以通过多种方式配置到Azure Service Bus的连接:
- 仅使用
<连接名称>
键,该值设置为要连接到的ServiceBus命名空间的连接字符串。 - 使用
<CONNECTION_NAME_PREFIX>__fullyQualifiedNamespace(连接名称_PREFIX)
以及前缀相同的其他连接属性<连接名_PREFIX>
,如基于身份的连接用于Azure函数。
如果同时指定了连接字符串和基于标识的连接值,则连接字符串将优先。默认值<连接名称>
或<连接名_PREFIX>
是Azure网络作业服务总线
,但是可以向连接
上的属性NServiceBusTriggerAttribute服务总线触发属性
基于连接字符串的连接示例:
{“IsEncrypted”:false,“价值观”:{...“AzureWebJobsServiceBus”:“端点=sb://<namespace>.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccess密钥;SharedAccess密钥=<namespace-shared-access-key>”,}}
基于身份的连接示例:
{“IsEncrypted”:false,“价值观”:{...“MyConnectionName__fullyQualifiedNamespace”:“<namespace>.servicebus.windows.net”,“MyConnectionName__tenantId”:“00000000-0000-0000-0000-00000000000”,“MyConnectionName__clientId”:“00000000-0000-0000-0000-000000000000000”,“MyConnectionName__clientSecret”:“<client-secret>”}}
[程序集:NServiceBusTriggerFunction(“WorkerDemoEndpoint”,Connection=“MyConnectionName”)]
其他配置
钥匙 | 价值 | 笔记 |
---|
端点名称 | 主机的NServiceBus端点的名称 | 可以直接向构造函数提供值。 |
NSERVICEBUS_LICENSE公司 | NServiceBus许可证 | 也可以通过提供serviceBusTriggeredEndpointConfig服务总线触发端点配置。端点配置。许可证(。..) . |
网站_网站_名称 | Azure Function应用程序的名称。在Azure中托管函数时提供。 | 用于设置NServiceBus主标识符。如果未设置,则使用本地计算机名。 |
对于本地开发,请使用本地。设置。杰森
。在Azure中,使用环境变量作为键指定函数设置。
{“IsEncrypted”:false,“价值观”:{...“NSERVICEBUS_LICENSE”:“<?xml version=\”1.0\“encoding=\”utf-8\“?><LICENSE id=\”1222e1d1-22222-4a46-b1c6-943c442ca710\“expiration=\”2113-11-30T00:00:0000000\“type=\”Standard\“LicenseType=\”标准\“LicesseVersion=\”4.0\“MaxMessageThroughputPerSecond=\”Max\“WorkerThreads=\”Max \“AllowedNumberOfWorkerNodes=\”Max\“>…</LICENSE>”}}
自定义诊断
NServiceBus启动诊断使用Azure函数时默认禁用。可以通过以下代码段将诊断写入日志:
公共重写void配置(IFunctionsHostBuilder生成器){建设者。UseNServiceBus(配置=>{配置。日志诊断();});}
诊断数据将与记录器标识一起写入启动诊断
具有日志级别信息.
错误队列
为了将持续失败的消息移动到错误队列而不是Azure Service Bus死信队列的可恢复性,必须提前创建错误队列并使用以下API进行配置:
class EnableDiagnosticsOnStartup:函数Startup{公共重写void配置(IFunctionsHostBuilder生成器){建设者。使用NServiceBus(配置=>{配置。高级配置。发送失败消息到(“错误”);});}}
准备Azure Service Bus命名空间
功能端点无法在Azure Service Bus命名空间中创建自己的队列或其他基础结构。
使用asb传输
命令行(CLI)工具为Function端点提供命名空间中的实体。
创建端点队列
asb-transport端点创建<队列名称>
请参阅完整文档对于asb-transport端点创建
命令获取更多详细信息。
如果asb运输
命令行工具不用于创建队列,建议将最大交付计数
设置为最大值。
订阅活动
asb-transport端点订阅
请参阅完整文档对于asb-transport端点订阅
命令获取更多详细信息。
组件扫描
组件扫描从两个位置加载部件:
- 这个
箱子
Azure Functions应用程序的目录 - Azure函数运行时目录
如果两个位置中都存在相同的程序集,则会引发异常,从而阻止端点运行。联系人特定软件支持寻求帮助。
包装要求
NServiceBus。AzureFunctions。工人。服务总线
需要Visual Studio 2019和。NET SDK版本50300
或更高。的旧版本。NET SDK可能会显示以下警告,阻止自动生成触发器定义:
CSC:警告CS8032:分析器NServiceBus的实例。AzureFunctions公司。SourceGenerator。无法从NServiceBus创建TriggerFunctionGenerator。AzureFunctions公司。SourceGenerator.dll:无法加载文件或程序集“Microsoft”。CodeAnalysis,版本=3.10.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35’。系统找不到指定的文件。。
从4.1.0版开始NServiceBus。AzureFunctions公司。工人。服务总线
和NServiceBus。AzureFunctions公司。进程中。服务总线
,警告CS8032被视为错误。要抑制此错误,请更新项目的.csproj文件,以便在<属性组>
顶部部分:
<WarningsAsErrors>
这将使CS8032恢复为警告状态,以便它不会停止生成过程。