forum.bitel.ru
http://forum.bitel.ru/

[howto] Запуск задач планировщика "обоймой"
http://forum.bitel.ru/viewtopic.php?f=25&t=8631
Страница 1 из 1

Автор:  Cromeshnic [ 25 окт 2013, 13:23 ]
Заголовок сообщения:  [howto] Запуск задач планировщика "обоймой"

Думаю, все периодически сталкиваются с необходимостью запуска нескольких задач в порядке очерёдности. Например, сначала перезагрузка логов netflow, затем переобсчёт сессий, а потом максимальных трафиков.
Задачи могут выполняться часами, а запускать их нужно последовательно, поэтому приходится отслеживать их завершение и руками запускать следующую.

Но можно написать задачу - обёртку, которая по порядку будет запускать нужные задачи.

Код задачи-обёртки:

Код:
package ru.dsi.bgbilling.kernel.task;

import bitel.billing.server.task.bean.RunTask;
import java.util.List;

/**
 * Задача-контейнер для последовательного запуска списка асинхронных задач планировщика
 */
public class CompositeSequentialRunTask extends RunTask {
    private List<RunTask> tasks;
    private String description;

    public CompositeSequentialRunTask(List<RunTask> tasks) {
        this.tasks = tasks;
        this.description = "Список задач для последовательного выполнения: {";
        boolean first = true;
        for (RunTask task : tasks) {
            if(!first){
                this.description+=", ";
            }
            first = false;
            this.description+="["+task.getDescription()+"]";
        }
        this.description+="}";
    }

    public CompositeSequentialRunTask(List<RunTask> tasks, String description) {
        this.tasks = tasks;
        this.description = description;
    }

    @Override
    public String getDescription() {
        return this.description;
    }

    @Override
    protected void executeTask() {
        int size = this.tasks.size();
        this.log.info("Composite task started, task count = "+size);
        StringBuilder sb = new StringBuilder("Task list: \n");
        for (RunTask task : tasks) {
            sb.append(task.getDescription()).append(" \n");
        }
        this.log.info(sb.toString());
        int i=0;
        for (RunTask task : tasks) {
            i++;
            this.log.info("starting task "+i+"/"+size);
            task.init(this.setup);
            task.run();
            this.log.info("task "+i+"/"+size+" finished");
        }
        this.log.info("Composite task finished");
    }
}


- компилируем, пакуем в jar, закидываем на сервер, рестартуем сервер и шедулер.
Через динамический код работать не будет - шедулер не поймёт.

Тестируем - пишем глобальный скрипт в дин коде, запускающий нужный нам список задач.

Код:
package ru.dsi.bgbilling.kernel.scripts.global;

import bitel.billing.common.TimeUtils;
import bitel.billing.server.dialup.MaxRecalculator;
import bitel.billing.server.dialup.SessionsRecalculator;
import bitel.billing.server.task.bean.RunTask;
import bitel.billing.server.task.bean.RunTaskDataManager;
import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.sql.ConnectionSet;
import ru.dsi.bgbilling.kernel.task.CompositeSequentialRunTask;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

public class Test
   extends GlobalScriptBase
{
   @Override
   public void execute( Setup setup, ConnectionSet connectionSet )
      throws Exception
   {
        List<RunTask> tasks = new ArrayList<RunTask>();
        //Переобсчёт сессий
        SessionsRecalculator sessionsRecalculator =
                new SessionsRecalculator("test@test.ru", TimeUtils.getStartMonth(Calendar.getInstance()), TimeUtils.getEndMonth(Calendar.getInstance()), 1, 0L, "");
        tasks.add(sessionsRecalculator);
        //Переобсчёт максимальных трафиков
        MaxRecalculator maxRecalculator = new MaxRecalculator(1, TimeUtils.getStartMonth(Calendar.getInstance()), "test@test.ru", "");
        tasks.add(maxRecalculator);

        CompositeSequentialRunTask compositeTask = new CompositeSequentialRunTask(tasks, "Тест композитной задачи");

        new RunTaskDataManager(connectionSet.getConnection()).
                addTask(compositeTask);
   }
}


...

PROFIT!

Пока проверял на тестовом сервере, в понедельник буду заряжать боевые обоймы переобсчётов :)

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/