как я могу запустить свой java-метод на сервере apache tomcat? [Дубликат]

Упругое решение поиска в основном связывается с добавлением set del и предлагает получить то, что вы можете выполнить поиск текста. Затем он сохраняет содержимое в mongodb.

В то время как я люблю и reccomand эластичный поиск зрелости проекта, то же самое можно сделать без другого сервера, используя только базу данных firebase. Вот что я имею в виду: ( https://github.com/metaschema/oxyzen )

для индексации в основном функция:

  1. JSON строит документ.
  2. удаляет все имена свойств и JSON, оставляя только данные (регулярное выражение).
  3. удаляет все теги xml (следовательно, html) и атрибуты (помните старое руководство , «данные не должны быть в атрибутах xml»), чтобы оставить только чистый текст, если присутствует xml или html.
  4. удаляет все специальные символы и заменяет их пробелом (regex)
  5. все экземпляры нескольких пробелов с одним пространством (regex)
  6. разбиваются на пробелы и циклы:
  7. для каждого слова добавляет refs в документ в некоторой структуре индекса в вашем db, в основном содержит дочерние элементы названный со словами с дочерними именами с экранированной версией «ref / inthedatabase / dockey»
  8. , затем вставляет документ, поскольку обычное приложение firebase будет делать

в oxyzen реализация, последующие обновления документа ВСТУПИТЕЛЬНО читает индексирует и обновляет его, удаляя слова, которые больше не соответствуют, и добавляет новые.

последующие поиски слов могут напрямую находить документы в словах child. поиск нескольких слов осуществляется с использованием хитов

77
задан BalusC 9 October 2015 в 11:30
поделиться

5 ответов

Ваша проблема в том, что вы неправильно поняли цель сервлета . Он намерен действовать по HTTP-запросам, не более того. Вам нужна только фоновая задача, которая выполняется один раз на ежедневной основе.

Доступен EJB? Используйте @Schedule

Если ваша среда поддерживает EJB (например, WildFly, JBoss AS / EAP, TomEE, GlassFish и т. Д.), Тогда используйте @Schedule .

@Singleton
public class BackgroundJobManager {

    @Schedule(hour="0", minute="0", second="0", persistent=false)
    public void someDailyJob() {
        // Do your job here which should run every start of day.
    }

    @Schedule(hour="*/1", minute="0", second="0", persistent=false)
    public void someHourlyJob() {
        // Do your job here which should run every hour of day.
    }

    @Schedule(hour="*", minute="*/15", second="0", persistent=false)
    public void someQuarterlyJob() {
        // Do your job here which should run every 15 minute of hour.
    }

} 

Да, это действительно все. Контейнер автоматически подберет и управляет им.

EJB недоступен? Используйте ScheduledExecutorService

Если ваша среда не поддерживает EJB (то есть не настоящий Java EE-сервер, например Tomcat, Jetty и т. Д.), Используйте ScheduledExecutorService . Это может быть инициировано ServletContextListener . Вот пример kickoff:

@WebListener
public class BackgroundJobManager implements ServletContextListener {

    private ScheduledExecutorService scheduler;

    @Override
    public void contextInitialized(ServletContextEvent event) {
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(new SomeDailyJob(), 0, 1, TimeUnit.DAYS);
        scheduler.scheduleAtFixedRate(new SomeHourlyJob(), 0, 1, TimeUnit.HOURS);
        scheduler.scheduleAtFixedRate(new SomeQuarterlyJob(), 0, 15, TimeUnit.MINUTES);
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        scheduler.shutdownNow();
    }

}

Если классы заданий выглядят следующим образом:

public class SomeDailyJob implements Runnable {

    @Override
    public void run() {
        // Do your daily job here.
    }

}
public class SomeHourlyJob implements Runnable {

    @Override
    public void run() {
        // Do your hourly job here.
    }

}
public class SomeQuarterlyJob implements Runnable {

    @Override
    public void run() {
        // Do your quarterly job here.
    }

}

Никогда не думайте об использовании java.util.Timer / java.lang.Thread в Java EE

Никогда не используйте java.util.Timer и / или java.lang.Thread в Java EE. Это рецепт неприятностей. Подробное объяснение можно найти в этом ответе JSF по одному и тому же вопросу: Истеризация потоков в управляемом компоненте JSF для запланированных задач с использованием таймера .

175
ответ дан Community 22 August 2018 в 04:26
поделиться
  • 1
    @BalucS Спасибо, сэр, ваше решение помогло мне, и я узнал о ScheduledExecutorService, который был для меня новым, как новый для java. Еще раз. – pritsag 15 January 2011 в 08:36
  • 2
    Блестящее объяснение и код. – London guy 4 May 2012 в 05:19
  • 3
    @Ashwin web.xml - дескриптор развертывания . Класс UpdateCount не связан с развертыванием, поэтому его не нужно помещать в web.xml – informatik01 12 August 2013 в 01:15
  • 4
    Одна из важных проблем с ScheduledExecutorService: убедитесь, что захватил все исключения в вашем исполнителе. Если исключение выходит из вашего метода run, исполнитель молча прекращает выполнение. Это особенность, а не ошибка. Прочтите документ и изучите его с помощью некоторых поисковых запросов. – Basil Bourque 18 October 2014 в 18:50
  • 5
    @Agi: это произойдет, если scheduler.shutdownNow() неправильно вызывается в соответствии с примером. Если это не вызывается, то поток расписания действительно будет работать. – BalusC 26 June 2018 в 15:12

В производственной системе, которая может иметь несколько не-jee контейнеров. Используйте anot-планировщик предприятия, например планировщик Quartz, который можно настроить для использования базы данных для задачи maamgememt.

0
ответ дан Jeryl Cook 22 August 2018 в 04:26
поделиться

Выполните два класса и вызовите startTask() в main.

public void startTask()
{
    // Create a Runnable
    Runnable task = new Runnable() {
        public void run() {
            while (true) {
                runTask();
            }
        }
    };

    // Run the task in a background thread
    Thread backgroundThread = new Thread(task);
    // Terminate the running thread if the application exits
    backgroundThread.setDaemon(true);
    // Start the thread
    backgroundThread.start();
}

public void runTask()
{
    try {
        // do something...         
        Thread.sleep(1000);

    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
2
ответ дан npf 22 August 2018 в 04:26
поделиться
  • 1
    Это, безусловно, НЕ способ сделать это в веб-приложении - посмотрите на ответ выше на @BalusC, вместо этого он здесь правильно, и я бы сказал, что вы можете доверять всем его ответам. – Yoshiya 21 May 2018 в 13:46

Вы можете использовать cron4j. http://www.sauronsoftware.it/projects/cron4j/manual.php

2
ответ дан Rookie 22 August 2018 в 04:26
поделиться

Я бы предложил использовать библиотеку типа кварца для выполнения задачи через регулярные промежутки времени. Что делает сервлет действительно? Он отправляет вам отчет?

4
ответ дан Twister 22 August 2018 в 04:26
поделиться
  • 1
    да, это дает мне счет пользователя, созданного за день, а также количество пользователей в моей базе данных. – pritsag 14 January 2011 в 14:09
  • 2
    в какой форме? Почта? – Twister 14 January 2011 в 14:12
  • 3
    huuu? Можете ли вы описать ПОЛНУЮ архитектуру вашей системы. Я потерялся. – Twister 14 January 2011 в 14:17
  • 4
    @Twister i m new для java и в фазе обучения сэра и действительно мало что знают о сервлетах. – pritsag 14 January 2011 в 14:21
  • 5
    Проблема не в сервлете. Какое приложение вы говорите? (ps: это плохая идея удалить ваши комментарии, особенно комментарии, на которые я ответил) – Twister 14 January 2011 в 14:22
Другие вопросы по тегам:

Похожие вопросы: