Запустить фоновое задание в Java EE [duplicate]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

76
задан 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 для запланированных задач с использованием таймера .

174
ответ дан Community 19 August 2018 в 01:42
поделиться
  • 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 19 August 2018 в 01:42
поделиться

Выполните два класса и вызовите 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();
    }
}
1
ответ дан npf 19 August 2018 в 01:42
поделиться
  • 1
    Это, безусловно, НЕ способ сделать это в веб-приложении - посмотрите на ответ выше на @BalusC, вместо этого он здесь правильно, и я бы сказал, что вы можете доверять всем его ответам. – Yoshiya 21 May 2018 в 13:46

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

1
ответ дан Rookie 19 August 2018 в 01:42
поделиться

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

3
ответ дан Twister 19 August 2018 в 01:42
поделиться
  • 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
Другие вопросы по тегам:

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