DocumentDB,为什么replaceDocument请求被拒绝

时间:2016-07-31 15:22:51

标签: azure stored-procedures azure-cosmosdb

下一个SP运行整个集合,对每个文档执行一些处理,我在这里放弃,然后用处理过的文档替换文档。

您将看到SP一次又一次地使用返回的continuationToken进行调用,查询更多文档。

通过SP复制并查看结果中的数字.. 上次查询的文件没有被替换,他们被排队等候拒绝了。

为什么?

SP:

function sample(continuationToken) {

var continuations = [];
var pSize = 100000;
var filterQuery = "select * from w";
var documentsProcessed = 0;
var querysCount = 0;
var documentsReplaced = 0;
var documentsRejectFromQueue = 0;
var   context = getContext(),
    collection = context.getCollection(),
    response = context.getResponse();

tryQuery(continuationToken);


function tryQuery(nextContinuationToken) {
    var options = { continuation: nextContinuationToken, pageSize: pSize };
    if (!query(options)) {
        setBody(nextContinuationToken);
    }
}

function query(options) {
    return (filterQuery && filterQuery.length) ?
        collection.queryDocuments(collection.getSelfLink(), filterQuery, options, processMultiUsers) :
        collection.readDocuments(collection.getSelfLink(), options, processMultiUsers);
}

function processMultiUsers(err, docs, options) {     

    for (j = 0; j < docs.length; j++) {
        documentsProcessed++;
        processUser(docs[j]);
    }
    querysCount++;

    if (options.continuation) {
        tryQuery(options.continuation);
    } else {
        setBody(null);
    }
}


function processUser(doc, items) {
   // do something with items...
    doc.WishList = items;

    var accept4 = collection.replaceDocument(doc._self, doc, { indexAction: "default" }, function (err, feed, options) {
        if (err) throw err;
    });
    if (!accept4) documentsRejectFromQueue++;   

}

function setBody(continuationToken) {
    var body = { continuationToken: continuationToken, documentsProcessed: documentsProcessed, QuerysCount: querysCount, DocumentsReplaced: documentsReplaced, DocumentsRejectFromQueue: documentsRejectFromQueue};
    getContext().getResponse().setBody(body);
}}

1 个答案:

答案 0 :(得分:1)

存储过程与DocumentDB中的任何请求一样,设置为在有限的时间间隔内执行。对于需要更多时间的请求,有一个延续机制。在存储过程中,每个集合操作都返回Boolean标志,以指示请求是否可以排队。如果它为false,则该函数应该包装当前请求并从客户端返回一个全新请求,其中包含到目前为止已保留的延续令牌。

在您的代码中,如果您注意到documentsRejectFromQueue为非零,则表示请求已超出单个往返执行时间。但是,您可以使用从响应中返回的延续令牌从客户端发送新请求,并循环直到您从响应中找不到延续令牌。

更多细节可以在这里找到 - https://azure.microsoft.com/en-us/documentation/articles/documentdb-programming