Как запустить задачу Tomcat-Spring / Struts 2-Quartz вне Tomcat? - PullRequest
1 голос
/ 03 февраля 2012

У нас есть приложение, развернутое на Tomcat 6. Оно построено на основе Spring / Struts 2 и имеет несколько запланированных задач Quartz.

Мы бы хотели перенести некоторые задачи из Quartz в cron Linux, выполняяминимальное количество кодирования, насколько это возможно.Как запустить эти задачи Spring / Quartz вне контейнера Tomcat и в автономном приложении Java?


(ОБНОВЛЕНИЕ: Поскольку кто-то хотел знать, почему мы хотим это сделать)

Мы хотели перенести запланированные задачи в их собственные приложения Java, потому что наш Tomcat продолжает умирать от нас.Нет ошибок в журнале.Мы подозреваем, что эта одна огромная задача Quartz, которую мы имеем, является виновником, но из-за утечки памяти или из-за сбоя в работе Tomcat из-за неправильной настройки мы до сих пор не знаем.

Мыхотел изолировать его, выбивая его из контейнера Tomcat, и посмотреть, умрет ли Tomcat по-прежнему с перерывами.Тем не менее, поскольку приложение уже работает (хотя и в закрытой бета-версии), мы хотели бы решить эту проблему с наименьшим количеством работы по кодированию, сохраняя при этом его работу (поскольку, вы знаете, «новый код, новые проблемы» - FYI,мы уже рассматриваем возможность переписывания / реинжиниринга, но «пожаротушение» сейчас является более насущной проблемой).

Ответы [ 2 ]

1 голос
/ 05 февраля 2012

Я не знаком с Quartz, но я знаком со stuts2 и cron.

Обычно в Linux вы называете отдельные процессы с помощью cron, поэтому я думаю, что было бы лучше сократить кварцевые задания до отдельных автономных программ. Учитывая природу вашего проекта на Java EE и зависимость от получения сервисов через Spring, я не думаю, что это особенно привлекательный вариант.

Второй путь, который я видел в PHP, но который одинаково хорошо работал бы с struts2, - это использование lynx для вызова определенного URL-адреса, что может вызвать выполнение задания примерно так:

*/15 * * * * lynx -dump http://localhost/MyApp/MyAction

Что будет вызывать ваше действие каждые 15 минут (опция дампа не позволяет lynx войти в интерактивный режим и просто выводит вывод в стандартный вывод, чтобы программа просто запускалась на мгновение), который затем может запустить ваше задание. Затем вы захотите взглянуть на iptables (или аналогичный), чтобы ограничить доступ к тем службам, к которым вы не хотели бы получать внешний доступ. Вы также можете сделать это в Struts2, поместив все эти действия в один пакет и сделав перехватчик, чтобы проверить, является ли запрашивающая сторона локальным хостом.

Я думаю, что этот второй метод потребует наименьшего количества изменений.

0 голосов
/ 13 февраля 2012

По-видимому, самый простой способ сделать это - создать отдельное Java-приложение, которое вызывает метод bean-компонента, который вы выполняете в Quartz:

import org.springframework.context.*;
import org.springframework.context.support.*;

public class SomeJob {

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        MyBean myBean = (MyBean) ctx.getBean("myBean");
        myBean.someMethod();
    }

}

.. затем запустить его в cron.

Мех.

...