Запланированный повторяющийся сценарий - настройка непрерывного запуска сценария до тех пор, пока сохраненные результаты поиска не станут пустыми - PullRequest
0 голосов
/ 07 октября 2019

Я создал скрипт, который просматривает поля в сохраненном поиске для обработки, когда скрипт обрабатывает каждую строку сохраненного поиска. Сценарий должен обрабатывать много строк данных, и я сталкиваюсь с проблемой, когда получаю сообщение о превышении лимита использования SSS только из-за количества обрабатываемой информации. Поэтому мне интересно, могу ли я при каждом запуске скрипта ограничивать количество обрабатываемых заказов, а затем последовательно запускать скрипт, пока не останется больше записей, которые нужно обработать

Ранее я простоограничил количество записей, которые обрабатывает скрипт за раз, а затем просто вручную запускал скрипт, пока не осталось больше строк для обработки. Я вижу, что вы можете запускать скрипт каждые 15 минут или около того, но хотел бы, чтобы он запускался каждый день, а затем запускался с 15-минутной периодичностью после этого, пока сохраненный поиск не будет исчерпан. Затем сценарий будет запускаться снова на следующий день и т. Д. Каждые 15 минут, пока не будут обработаны все записи. Из исследований не знаю, возможен ли этот тип планирования.

сам код работает, планирование его - вот то, что мне нужно руководство по

Ответы [ 3 ]

1 голос
/ 09 октября 2019

Другой вариант (и тот, который я успешно использовал) - выйти из запланированного сценария, если использование достигает определенной точки, но перед выходом снова запустите запланированный сценарий. Я успешно использовал это для обработки тысяч записей (например, массовых удалений).

/**
 * @NApiVersion 2.x
 * @NScriptType ScheduledScript
 * @NModuleScope SameAccount
 */
define(['N/record', 'N/runtime', 'N/search', 'N/task'],
/**
 * @param {record} record
 * @param {search} search
 */
function(record, runtime, search, task) {

    const governanceCap = 9950;

    function getAllResults(s) {
        var results = s.run();
        var searchResults = [];
        var searchid = 0;
        do {
            var resultslice = results.getRange({start:searchid,end:searchid+1000});
            resultslice.forEach(function(slice) {
                searchResults.push(slice);
                searchid++;
                }
            );
        } while (resultslice.length >=1000);
        return searchResults;
    }

    /**
     * Definition of the Scheduled script trigger point.
     *
     * @param {Object} scriptContext
     * @param {string} scriptContext.type - The context in which the script is executed. It is one of the values from the scriptContext.InvocationType enum.
     * @Since 2015.2
     */
    function execute(scriptContext) {

        function rescheduleCurrentScript() {
            var scheduledScriptTask = task.create({
                taskType: task.TaskType.SCHEDULED_SCRIPT
            });
            scheduledScriptTask.scriptId = runtime.getCurrentScript().id;
            scheduledScriptTask.deploymentId = runtime.getCurrentScript().deploymentId;
            return scheduledScriptTask.submit();
        }

        try {

            var script = runtime.getCurrentScript();

            // GET YOUR SEARCH HERE

            var mySearch = getAllResults(
                search.create({
                       type: "transaction",
                       filters:
                       [
                          ["mainline","is","T"],
                       ],
                       columns:
                       [
                           "name",
                           "tranid",
                           "type",
                           search.createColumn({
                               name:"datecreated", 
                               sort: search.Sort.DESC
                            }),
                       ]
                    })
                );
            var recCount = mySearch.length;
            for (each in mySearch) {
                try {
                    record.delete({
                        type: transSearch[each].getValue({name:'type'}),
                        id: transSearch[each].id
                    });
                } catch (err) {log.error(err.name,err.message) }

                var govPointsUsed = 10000-script.getRemainingUsage();

                script.percentComplete = (govPointsUsed/governanceCap*100).toFixed(1);

                if (govPointsUsed >= governanceCap) {
                    var taskId = rescheduleCurrentScript();
                    log.audit('Rescheduling status: ','Task ID:' + taskId);
                    return;
                }
            }
        } catch (err) { log.error(err.name,err.message + '; Stack: '+err.stack ) };    
    }

    return {
        execute: execute
    };

});

Работает как шарм !!

1 голос
/ 08 октября 2019

Я бы посоветовал вам использовать скрипт Map / Reduce. Это правильный тип сценария, который следует использовать при работе с большим количеством данных, и он может гораздо лучше справляться с проблемами управления.

0 голосов
/ 08 октября 2019

У меня была эта проблема некоторое время назад. Сценарий map / lower может быть решением, если вы запускаете сценарии 2.0. В моем случае у меня были «устаревшие» скрипты в версиях 1.X и 2.X. И все они время от времени выбрасывают 'SSS_TIME_LIMIT_EXCEEDED'.

Мое решение :) Я создал сценарий, своего рода «слушатель». нажмите, чтобы увидеть

  // *add the script listener 
  // [it can be used for both script versions 1.X and 2.X]

     /** you have to calculate the 'process usage' by 1 loop cycle. 
         use script.getRemainingUsage() */
    var recallValue = 200;
    var stopValue = 200;
    var recallIsRequired = true;// use false to stop the script without recall

    var script = setScriptListener(recallValue, stopValue, recallIsRequired);

    for (var data in data_contaniner){
      if(script.canContinue()){
        //run you processing 
        // !important : mark the data as 'processed'. 
        //otherwise you will have a lot of duplicates after script recall
      }else{
        //stop the loop 
        break;
      }
    }
...