Как использовать настройки операций по расписанию

В системе введен новый тип скриптов. Они используются для работы с автоматическими задачами : рассылка, импорт, синхронизация с репозиториями (стандартные автоматические работы). Пользователи могут написать свои скрипты.

Скрипты разделяются на два типа.

- Базовый -

/**
* This interface should be implement general scheduler job
*/
public interface IGeneralScheduler {

/**
* This method returns a mask for cron
* @return mask cron time. For example 0 1 * * *
*/
public String getCronTime();

/**
* This method returns a name of job
* @return names job
*/
public String getName();

/**
* This method implements jobs actions
*/
public String execute();

/**
* Switcher
* @return true if scheduler should be used
*/
public boolean isUse();
} 

Скрипт должен расширять IGeneralScheduler интерфейс. Частота вызова скрипты прописывается в синтаксисе quartz

Пример.

package scripts.scheduler.example;

import com.trackstudio.external.IGeneralScheduler;

public class CommonJob implements IGeneralScheduler {
    @Override
    public String getCronTime() {
        return "0 0/1 * * * ?"; //every minute
    }

    @Override
    public String getName() {
        return "scheduler example"
    }

    @Override
    public void execute() {
        System.out.println(" execute ");
    }

    @Override
    public boolean isUse() {
        return true;
    }
}

далее нужно прописать данный скрипт в настройках trackstudio.adapter.properties

handler.service example.CommonJob.class;

- Конкретизированный для категории -

Второй тип скриптов конкретизирован для категорий. Интерфейс ICategoryScheduler

package com.trackstudio.external;

import com.trackstudio.kernel.cache.TaskRelatedInfo;

/**
* This interface should be implement for observed tasks concrete category
*/
public interface ICategoryScheduler {

/**
* This method returns a category ID
* @return category ID
*/
public String getCategoryId();

/**
* This method returns a mask for cron
* @return mask cron time. For example 0 1 * * *
*/
public String getCronTime();

/**
* This method returns a name of job
* @return names job
*/
public String getName();

/**
* This method defines actions for task.
* @param task TaskRelatedInfo
*/
public void execute(TaskRelatedInfo task);
}

Пример перевода задачи из закрытого состояния в папку архив.

package scripts.scheduler.example;
import com.trackstudio.app.adapter.AdapterManager;
import com.trackstudio.app.filter.TaskFValue;
import com.trackstudio.app.session.SessionContext;
import com.trackstudio.app.session.SessionManager;
import com.trackstudio.external.ICategoryScheduler;
import com.trackstudio.kernel.cache.TaskRelatedInfo;
import com.trackstudio.kernel.cache.UserRelatedManager;
import com.trackstudio.kernel.manager.KernelManager;
import com.trackstudio.secured.SecuredTaskBean;

import java.util.List;

import static com.trackstudio.tools.textfilter.MacrosUtil.getListTask;

public class ArchiveBugsJob implements ICategoryScheduler {
    @Override
    public String getCategoryId() {
        return "4028808a1951e21b01195245ff4200c1";
    }

    @Override
    public String getCronTime() {
        return "0/30 * * * * ?";
    }

    @Override
    public String getName() {
        return "example category scheduler";
    }

    @Override
    public void execute(TaskRelatedInfo task) {
        try {
            System.out.println("Scheduler actions : " + task.getId());
            String sessionId = SessionManager.getInstance().create(UserRelatedManager.getInstance().find("1")); // root
            SessionContext sc = SessionManager.getInstance().getSessionContext(sessionId);
            String filterId = "1";
            TaskFValue taskFValue = KernelManager.getFilter().getTaskFValue(filterId);
            TaskRelatedInfo parent = new TaskRelatedInfo(task.getParentId());
            List<SecuredTaskBean> list = getListTask(new SecuredTaskBean(parent, sc), taskFValue, filterId);
            for (SecuredTaskBean stb : list) {
                if (stb.getStatus().isFinish()) {
                    AdapterManager.getInstance().getSecuredTaskAdapterManager().pasteTasks(sc, "4028808a1951e21b011952d1e6ef03a0", stb.getId(), "CUT");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Далее для этого типа скриптов нет необходимости прописывать их в properties. Активация привязана в состоянию задачи данной категории. В настройках процесса данной категории в разделе операции, есть закладка - "Настройка операции по наблюдению".
Для активации нужно отметить операцию - Наблюдать по расписанию.

После выполнения этой операции задача попадает в список для обработки скриптом task - public void execute(TaskRelatedInfo task).
Для деактивации нужно создавать новую операцию -Завершить наблюдение по расписанию. После выполнения этой операции задача удаляется из списка для обработки скриптом.

Все скрипты нужно собирать в jar архив и размешать в etc/plugins/scripts/