управлявайте планирани задачи с java

Имам сложно уеб приложение на java. Съдържа:

  1. различни библиотечни модули, които съхраняват и управляват от maven
  2. уеб модул, който се мащабира до много сървъри в облака
  3. база данни: sql + nosql
  4. много различни планирани задачи за работа с база данни.

Имам нужда от съвет как да разработя и управлявам тези планирани работни места. Моите изисквания:

  1. Задачите трябва да бъдат отделени от уеб модула, тъй като уеб ниво автоматично се мащабира на amazon ec2 insanses.
  2. Някои от задачите вършат много важна работа с пари, така че имам нужда от наистина добри инструменти за наблюдение на резултатите от работа, състояния на работа, регистрационни файлове и т.н. Имам нужда от способност за много бързи корекции и възможност за спиране\стартиране\отказ (ако замръзне по някаква причина) конкретни работни места отделно в реално време.
  3. Трябва да използвам непрекъсната доставка (CD), когато всичко работи правилно. Това означава, че заданията се изграждат на CI сървър и се внедряват автоматично на сървър за тестване\производство. Конфигурирането на планираното време също трябва да бъде под контрол на версиите.

Разгледах някои решения:

  1. сървъри за работа като obsidian. Не мислете, че е добра идея да използвате чудовищно решение като това.
  2. кварц. Не мога да намеря прост начин как да обединя изискванията номер 2 и 3. С quartz мога да управлявам задачите си в реално време или да направя добра компилация на компактдиск за задачи. Не заедно. Може би пропускам нещо?
  3. Разположете буркани за задания на целевия сървър с всички библиотеки и стартирайте скриптове Изпълнете тези скриптове от cron. Това решение изглежда грозно. Първо трябва да разположа на тестов\производствен сървър всичките си библиотеки от CI сървър при всяко внедряване, за да поддържам чист CI процес. Второ, наистина не мисля, че това изобщо е добра идея. Наистина мисля, че нещо ми липсва и има добро решение за този обичаен проблем.

Можете ли да ми дадете съвет? Как обикновено разработчиците управляват планирани задания с CD процес?


person vasiliyz    schedule 08.11.2013    source източник
comment
моля, споменете сървъра за приложения или уеб контейнера, който използвате   -  person Acewin    schedule 09.11.2013
comment
Съветвам ви tloslite, който може да отговори на първите два от въпросите ви.   -  person serkan    schedule 18.11.2013


Отговори (1)


Имам предвид, че трябва да използвате някакъв сървър за приложения като JBoss или WebLogic.

Бих предложил да напишете услуга MBean, която да зарежда планираните ви задания с помощта на кварц

Ползата от използването на Service MBean, можете да изложите действия. Извиквайки тези действия, трябва да можете да спрете стартирането на работата.

Предимството на QuartZ е, че е много надежден. Ще можете да управлявате отделни задачи.

Уловката тук е, че ще има само един екземпляр на планировчик (обект) под вашия Service MBean. Така че, ако спрете планировчика, спирате всички задачи.

Можете да създадете отделна категория регистратор, за да работите със задачата QuartZ

Моля, предоставете още въведени данни, като например кой сървър за приложения използвате. Различните сървъри на приложения имат различни функции, които могат да бъдат полезни. Въпреки че трябва да можете да реализирате всичките си идеи във всяка от тях

Имам подобно приложение, работещо на JBoss AS7, всяко задание е отделна нишка. В логиката на изпълнение на заданието правя

Thread.currentThread().setName(UNIQUE_NAME_TIMESTAMP);

по този начин мога да маркирам изпълнението на конкретната работа за цикъл.

кварц. Не мога да намеря прост начин как да обединя изискванията номер 2 и 3. С quartz мога да управлявам задачите си в реално време или да направя добра компилация на компактдиск за задачи. Не заедно. Може би пропускам нещо?

Наистина се нуждаете от сървър за приложения като JBoss. който може да ви осигури стабилен уеб контейнер, е напълно сертифициран за Java EE, улеснява вашата API интеграция.

----==----==---==----==---==----==---==----==---==----==---==----==----

Надявам се, че знаете как да пишете SAR. Ако не все още е много лесно. Харесвам JBoss, тъй като концепцията му е проста, лесен за използване и е много силен сървър за приложения.

Можете да проверите този конкретен блог с уроци, за да разберете как да пишете услуга MBean http://middlewaremagic.com/jboss/?p=366

Нека поговорим за MyServerMonitorMBean

package custom.mbean;
public interface MyServerMonitorMBean
{
  public void setFrequency(String frequency);
  public String getFrequency();
}

както бихте забелязали, има декларации на методи, които трябва да бъдат внедрени в изпълнението на MBean.

В архитектурата на Java EE това означава, че всъщност излагате действия. Действия, които могат да бъдат извикани отвън за извикване на някои команди. Сега само методите, които са декларирани в интерфейса MBean, имат тази концепция.

След това можете да се свържете с JBoss JMXconsole чрез jconsole. Можете да проверите това тук

https://community.jboss.org/wiki/UsingJconsoleToConnectToJMXOnAS7

----==----==---==----==---==----==---==----==---==----==---==----==----

--1-- Това ще отвори връзка, която ще ви позволи да видите работещи MBeans над сървъра (това ще бъде раздел MBean на JConsole след свързване)

--2-- вашият mbean ще бъде service.server.monitor (името е взето от предишния пример)

--3-- ще намерите действията, показващи се като операции

--4-- ако сте декларирали методите да имат някои аргументи, ще видите, че има индивидуален притежател на стойност за тези аргументи на метода, които можете да предадете на услугата

--5-- в моя код бях изложил jobStart и jobStop като две действия

@Override
public void jobStart() {
    this.loadJob(SchedHourlyJob.class, "hourlyjob", "grouphourly", START_INTERVAL, EXECUTION_INTERVAL);
}

@Override
public void jobStop() {
    logger.info("-- jobStop. Stopping Scheduled Job");

    try {
        scheduler.deleteJob(new JobKey("hourlyjob", "grouphourly"));
    } catch (SchedulerException schedEx) {
        logger.error("Failed to stop scheduled job. Exception message and stacktrace  ==> " ,schedEx);
    }
}

--6-- Изложете подобни действия за стартиране, спиране или промяна на отделната задача или целия планировчик.

--7-- Ще можете също да поставите на пауза работата, да предизвикате някаква промяна и да я стартирате отново. Всички тези манипулации правят Quartz толкова хубав API за планиране на работа

--8-- В JBoss е възможно горещо внедряване. Можете да имате приложението си в множество sar, които ще споделят общи библиотеки. Можете да направите тестове около тези функции на JBoss. Разбирам, че горещото внедряване е нещо, върху което ще се фокусирате силно.

Надявам се, че с всичко това обясних логиката доста добре. Също така това е един от начините да се справите с това, можете да измислите и нещо свое.

Не забравяйте, че внедряването е вашият начин да се справите с изискването.

И точно сега си помислих, че създаването на име на клас, име на задание може да формира много общ начин за спиране или пауза на заданията от общ клас (Service MBean). Както казах по-рано, всички тези идеи трябва да бъдат тествани. Затова смятам, че ако разберете, ще можете да излезете с добро решение

И още веднъж като помислите, можете дори да приложите извикването на действия от JMS, да напишете клас модел от неговия обект и да го изпратите на вашия сървър. Но отново винаги можете да създадете начин да спрете работата си.

person Acewin    schedule 09.11.2013
comment
Благодаря за отговора, @Acewin. Както казах, моят модул за работа е отделен от мрежата, така че мога да използвам всеки сървър на приложения, за да го хоствам. В момента използвам кварц с tomcat. В някои мои проекти използвах glassfish 3 с ejb 3.1 и не ми хареса механизмът за планирани задания. Така че кварцът е най-добрият избор - добре, разбрах това. Можете ли да ми дадете съвет за това? 1. Как съхранявате информацията за времето на задействане? 2. Да приемем, че една от задачите (които се задействат всяка минута) работи неправилно. Трябва да спрете и да изключите веднага. Тогава трябва да направите бърза гореща корекция. Как го правиш? - person vasiliyz; 09.11.2013
comment
никога не съм правил нещо подобно. Но както споменах писането му като ServiceMBean дава много добра опция. Самият аз обичам да се държа далеч от EJB. Ще редактирам публикацията си, за да ви дам по-добро разбиране. - person Acewin; 09.11.2013