繁体   English   中英

如何将 changefeeds Monitored Collection 名称放入我的 ChangesHander - Containers.ChangesHander<t> (Azure 宇宙 v3)</t>

[英]How can I get the changefeeds Monitored Collection name into my ChangesHander - Containers.ChangesHander<T> (Azure Cosmos v3)

我有一项服务,它产生了许多 Changefeed 来监控许多不同的 Cosmos DB collections。 在 v1 或 2 中,ChangefeedObserver class 包含 ChangefeedObserverContext,我可以从中提取集合名称。

  public Task ProcessChangesAsync(IChangeFeedObserverContext context, IReadOnlyList<Document> deltas, CancellationToken cancellationToken)
    {
        string observerCollection = string.Empty;
        try
        {
            Regex rx = new Regex(@"\b(\w+$)");
            observerCollection = rx.Match(context.FeedResponse.ContentLocation).Value.ToString();

在 v3 中,不是在处理器中传递类型,而是传递一个委托方法,其签名不再包含上下文

MS Docs Container.ChangesHandlerDelegate

更改 Feed 处理器

    private ChangeFeedProcessor ChangeFeedInitialize(Container leasingContainer, Container monitoringContainer, string hostName)
    {
        ChangeFeedProcessor changeFeedProcessor = monitoringContainer
            .GetChangeFeedProcessorBuilder<Document>(hostName, this.HandleChangesAsync)
                .WithInstanceName("isn")
                .WithLeaseContainer(leasingContainer)
                .Build();

        return changeFeedProcessor;
    }

    private async Task HandleChangesAsync(IReadOnlyCollection<Document> changes, CancellationToken cancellationToken)
    {
        ILogger logger = AnalyticsHelper.BuildMeMyLogger(this.loggerFactory);

        try
        {
            AnalyticsChangefeedProcessor changefeedProcessor = new AnalyticsChangefeedProcessor();
            await changefeedProcessor.HandleChangesAsync(changes, this.analyticsContext.DataLakeStorageProvider, "CollectionName", logger);
        }
        catch (Exception ex)
        {
            logger.LogFailure($"Failed to process changes: {ex.Message}", TagIds.ExceptionAnalytics, ex);
        }
    }

在上面的代码中,我有一个创建 Changefeed(通过计时器启动)的基本方法,以及将处理发送到更大的 class 以采取行动的委托方法,具体取决于监控的集合。

那么,如何将这个changefeeds Monitored Collection 值放入 ChangesHander 中?

你已经有了引用,你可以注入它或者引用它。

private ChangeFeedProcessor ChangeFeedInitialize(Container leasingContainer, Container monitoringContainer, string hostName)
{
    ChangeFeedProcessor changeFeedProcessor = monitoringContainer
        .GetChangeFeedProcessorBuilder<Document>(hostName, 
                (IReadOnlyCollection<Document> changes, CancellationToken cancellationToken) => 
                    this.HandleChangesAsync(monitoringContainer, changes, cancellationToken))
            .WithInstanceName("isn")
            .WithLeaseContainer(leasingContainer)
            .Build();

    return changeFeedProcessor;
}

private async Task HandleChangesAsync(Container monitoringContainer, IReadOnlyCollection<Document> changes, CancellationToken cancellationToken)
{
    ILogger logger = AnalyticsHelper.BuildMeMyLogger(this.loggerFactory);

    try
    {
        AnalyticsChangefeedProcessor changefeedProcessor = new AnalyticsChangefeedProcessor();
        await changefeedProcessor.HandleChangesAsync(changes, this.analyticsContext.DataLakeStorageProvider, "CollectionName", logger);
    }
    catch (Exception ex)
    {
        logger.LogFailure($"Failed to process changes: {ex.Message}", TagIds.ExceptionAnalytics, ex);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM