Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure 函数无法绑定到输出参数_Azure_Azure Functions_Azureservicebus_Azure Servicebus Topics - Fatal编程技术网

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

我有一个Azure函数,它带有一个
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();
            }
        }
    }
}