/** * */ package ru.app.demo.cluster.app; import java.sql.ResultSet; import ru.funsys.avalanche.Application; import ru.funsys.avalanche.annotation.CfgAttribute; import ru.funsys.avalanche.cluster.Resource; import ru.funsys.avalanche.sql.Adapter; /** * Реализация демонстрационного ресурса класстера. Реализация класса при выполнении периодически * выводит в файл журнала сообщение, что он выполняется. * * @author Валерий Лиховских */ public class DemoResource extends Application implements Runnable, Resource { /** * */ private static final long serialVersionUID = 4672495110181895274L; @CfgAttribute(description = "Период работы потока ресурса в мс, по умолчанию 20000") private long timeout = 20000L; @CfgAttribute(description = "SQL запрос, демонстрирующий работу с БД") private String sql; /** * При запуске этого ресурса под управление кластера это поле устанавливается автоматически при совпадении имени * этого поля с именем адаптера определенного в секции кластера. *
* При запуске этого ресурса вне кластера в конфигурации этого ресурса должен быть опрелен адаптер с именем * этого поля. */ @CfgAttribute(description = "Адаптер доступа к БД") private Adapter database; /** * Состояние ресурса кластера */ private boolean online = false; /** * Выполнение ресурса под управлением кластера: false - нет, true - да */ private boolean isCluster = false; /** * Поток выпонения ресурса кластера */ private Thread thread; /** * Инициализация экземпляра ресурса класстера */ @Override public void init() { // запустить ресурс, если он эксплуатируется вне кластера if (!isCluster) online(); } /** * Уничтожение экземпляра ресурса класстера */ @Override public void done() { if (online) offline(); } /** * Проверить состояние ресурса на узле кластера * * @return true, если ресурс online, иначе false */ @Override public boolean isOnline() { return online; } /** * Запустить ресурс на узле кластера. */ @Override public void online() { online = true; thread = new Thread(this, "DemoResource: " + getName()); thread.setDaemon(true); thread.start(); info("DCLS001I", getName()); } /** * Остановить ресурс на узле кластера */ @Override public void offline() { online = false; thread.interrupt(); info("DCLS002I", getName()); thread = null; } @Override public void run() { while (online) { info("DCLS003I", getName()); try { Thread.sleep(timeout); } catch (Exception e) { } } } /** * Установить признак работы ресурса под управлением кластера. Этот метод * вызывается при запуске ресурса под управлением кластера после создания экземпляра * ресурса и до вызова метода {@code init()}. *
* Реализация ресурса должна реагировать на вызов этого метода для * распознавания в каком варианте эксплуатируется ресурс. Если ресурс запускается вне кластера, * то метод {@code online()} должен вызываться в методе {@code init()} ресурса * */ @Override public void setCluster() { isCluster = true; } /** * Выполнение тестового запроса к БД * * @return результат выполнения запроса * * @throws Exception воозможную ошибку */ public ResultSet execute() throws Exception { return database.select(sql); } }