Azure 函数无法绑定到输出参数
我有一个Azure函数,它带有一个Azure 函数无法绑定到输出参数,azure,azure-functions,azureservicebus,azure-servicebus-topics,Azure,Azure Functions,Azureservicebus,Azure Servicebus Topics,我有一个Azure函数,它带有一个TimerTrigger,可以工作并生成400000条服务总线主题消息。我目前正在使用服务总线API在我的函数中手动将消息推送到服务总线API中。我现在想用一个输出绑定来代替这段代码,这样可以简化事情 public static class Function1 { [FunctionName("ExportProcessor")] public static async Task Run( [TimerTrigger("0 30
TimerTrigger
,可以工作并生成400000条服务总线主题消息。我目前正在使用服务总线API在我的函数中手动将消息推送到服务总线API中。我现在想用一个输出绑定来代替这段代码,这样可以简化事情
public static class Function1
{
[FunctionName("ExportProcessor")]
public static async Task Run(
[TimerTrigger("0 30 5 */1 * *", RunOnStartup = true)]TimerInfo myTimer,
ILogger logger,
[ServiceBus("new-movie-publish", EntityType = EntityType.Topic)]IAsyncCollector<string> output)
{
await output.AddAsync("Foo");
await output.AddAsync("Bar");
}
}
My host.json文件:
{
"logger": {
"categoryFilter": {
"defaultLevel": "Information",
"categoryLevels": {
"Host": "Information",
"Function": "Information"
}
}
}
}
和my local.settings.json配置
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "...",
"APPINSIGHTS_INSTRUMENTATIONKEY": "...",
"ExportUrl": "...",
"ExportUtcHour": 5,
"DefaultConnection": "...",
"NewMovieTopic": "new-movie-publish",
"AzureWebJobsServiceBus": "..."
}
}
当我使用此代码发布消息时,这些设置工作正常:
public class MoviePublisherConfig
{
public MoviePublisherConfig()
{
this.AzureWebJobsServiceBus = Environment.GetEnvironmentVariable(nameof(AzureWebJobsServiceBus), EnvironmentVariableTarget.Process);
this.NewMovieTopic= Environment.GetEnvironmentVariable(nameof(NewMovieTopic), EnvironmentVariableTarget.Process);
}
public string AzureWebJobsServiceBus { get; set; }
public string NewMovieTopic { get; set; }
}
public class MoviePublisher
{
private readonly MoviePublisherConfig config;
private readonly ILogger logger;
public MoviePublisher(MoviePublisherConfig config, ILogger logger)
{
this.config = config ?? throw new ArgumentNullException(nameof(config));
this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
public async Task PublishMovies(Movie[] movies)
{
var topicClient = new TopicClient(config.AzureWebJobsServiceBus, config.NewMovieTopic);
var pendingTasks = new List<Task>();
for(int index = 0; index < movies.Length; index++)
{
string movieJson = JsonConvert.SerializeObject(movies[index]);
byte[] messageBuffer = Encoding.UTF8.GetBytes(movieJson);
var message = new Message(messageBuffer);
Task sendTask = topicClient.SendAsync(message);
pendingTasks.Add(sendTask);
if (pendingTasks.Count >= 1000)
{
await Task.WhenAll(pendingTasks);
this.logger.LogInformation($"Processed {pendingTasks.Count} new movies.");
pendingTasks.Clear();
}
}
}
}
公共类电影发布配置
{
公共电影发行人配置()
{
this.azurewebjobservicebus=Environment.GetEnvironmentVariable(名称为(azurewebjobservicebus),EnvironmentVariableTarget.Process);
this.NewMovieTopic=Environment.GetEnvironmentVariable(nameof(NewMovieTopic),EnvironmentVariableTarget.Process);
}
公共字符串azurewebjobservicebus{get;set;}
公共字符串NewMovieTopic{get;set;}
}
公营电影出版商
{
私有只读电影发布配置;
专用只读ILogger记录器;
公共电影发行商(电影发行商配置,ILogger记录器)
{
this.config=config??抛出新的ArgumentNullException(nameof(config));
this.logger=logger??抛出新的ArgumentNullException(nameof(logger));
}
公共异步任务PublishMovies(电影[]电影)
{
var topicClient=new topicClient(config.azurewebjobservicebus,config.NewMovieTopic);
var pendingTasks=新列表();
for(int index=0;index=1000)
{
等待任务。WhenAll(等待任务);
this.logger.LogInformation($“已处理{pendingTasks.Count}新电影”);
pendingTasks.Clear();
}
}
}
}
我做错了什么?截至今天(2018年3月),V2功能上的服务总线支持仍在“建设中”。这有点像,但需要一些魔法来应用
问题是它已经从默认的绑定包移到了扩展模型中,而这个模型仍然很粗糙
请参阅github上的以下问题:
-已关闭,但请参见注释
工作版本还没有在NuGet中,但是如果您真的需要,您可以在3.0.0-beta4-11250版本中获得它
其他选项包括坚持手动发送,或使用V1/.NET完整版本的函数。刚刚尝试了您的代码,效果很好。。。你介意共享依赖项和版本吗?更新以显示我的依赖项和配置。啊,v2。。。我认为服务总线还没有完全集成到测试版中。有解决办法吗?这是我尝试与服务总线集成的第二项技术。NodeJs函数超时有问题,因此转移到netstandard.net core。现在使用v1/.net full是一个安全的选择
public class MoviePublisherConfig
{
public MoviePublisherConfig()
{
this.AzureWebJobsServiceBus = Environment.GetEnvironmentVariable(nameof(AzureWebJobsServiceBus), EnvironmentVariableTarget.Process);
this.NewMovieTopic= Environment.GetEnvironmentVariable(nameof(NewMovieTopic), EnvironmentVariableTarget.Process);
}
public string AzureWebJobsServiceBus { get; set; }
public string NewMovieTopic { get; set; }
}
public class MoviePublisher
{
private readonly MoviePublisherConfig config;
private readonly ILogger logger;
public MoviePublisher(MoviePublisherConfig config, ILogger logger)
{
this.config = config ?? throw new ArgumentNullException(nameof(config));
this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
public async Task PublishMovies(Movie[] movies)
{
var topicClient = new TopicClient(config.AzureWebJobsServiceBus, config.NewMovieTopic);
var pendingTasks = new List<Task>();
for(int index = 0; index < movies.Length; index++)
{
string movieJson = JsonConvert.SerializeObject(movies[index]);
byte[] messageBuffer = Encoding.UTF8.GetBytes(movieJson);
var message = new Message(messageBuffer);
Task sendTask = topicClient.SendAsync(message);
pendingTasks.Add(sendTask);
if (pendingTasks.Count >= 1000)
{
await Task.WhenAll(pendingTasks);
this.logger.LogInformation($"Processed {pendingTasks.Count} new movies.");
pendingTasks.Clear();
}
}
}
}