Мне нужно написать кварцевый планировщик для выполнения работы в Spring. Я также должен добавить еще одну функцию, чтобы приостановить ту же работу. Этот код присутствует в одном отдельном пакете.

Для запуска этих двух функций: 1. запустить задание 2. приостановить задание. Я написал 2 класса с помощью main (), которая выполняет их.

Проблема в том, что когда я запускаю main () для pauseJob, он запускает другой applicationContext вместо того, чтобы использовать тот же самый. Я использовал шаблон Singleton для инициализации applicationContext.

  1. Класс Singleton для инициализации ApplicationContext

    public class AppContext {
    private static ApplicationContext INSTANCE = null;
    
    private AppContext() {
    }
    
    public static ApplicationContext getIntance() {
        if (INSTANCE == null) {
            String[] contexts = new String[] {"classpath:/applicationContext.xml"};
            INSTANCE = new ClassPathXmlApplicationContext(contexts);
        }
        return INSTANCE;
    }
    }
    
  2. Класс для начала работы

    public class StartJobQuartzMain {

    public static void main(String[] args) throws Exception {
            AppContext.getIntance();        
    }
    }
    
  3. Класс, чтобы приостановить задание

    public class PauseJobQuartzMain {

    public static void main(String[] args) throws Exception {
            ((TestPauseJob) AppContext.getIntance().getBean("testPauseJob")).pauseJob();    
    }
    }
    

Пожалуйста, расскажите мне, как получить тот же экземпляр applicationContext в PauseJobQuartzMain.java. Спасибо.

0
rupesh 3 Янв 2018 в 04:08

2 ответа

Лучший ответ

Создание синглтона не имеет к этому никакого отношения (это в некотором смысле требуется) ... Два основных класса java будут работать независимо друг от друга, так как это две разные программы со своей собственной виртуальной машиной Java , и не смогут делиться контекстом вашего приложения друг с другом.

Вы можете использовать базу данных или внешний файл (доступный для обоих) или что-то еще для этого ...

Надеюсь это поможет...

1
Ramkumar S 3 Янв 2018 в 01:20

Вы не можете сделать это из другого основного класса, потому что вы определенно запускаете его из новой JVM. Так что у каждого из них есть свой синглтон. Вы можете рассмотреть возможность использования некоторого общего ресурса между двумя этими приложениями: db, file, JMS queue, наконец и т.д., или вы можете вызвать некоторую управляемую операцию через JMX. Но две JVM не могут совместно использовать память, особенно объекты Java, когда контекст приложения является одним из них.

1
Artem Bilan 3 Янв 2018 в 01:20